keepset 0.29.2 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/{bundled-Ql23qj97.js → bundled-DV_kxyz2.js} +167 -35
- package/dist/{categories-DC0uTkzn.d.ts → categories-DepJEi4o.d.ts} +10 -10
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/node/fetch-dataset.d.ts +3 -3
- package/dist/node/fetch-dataset.js +4 -4
- package/dist-cli/keepset.mjs +2 -2
- package/package.json +2 -2
- package/schemas/entry.schema.json +1 -1
- package/schemas/manifest.schema.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/Mearman/keepset) [](https://www.npmjs.com/package/keepset) [](https://github.com/Mearman/keepset/releases/latest) [](https://github.com/Mearman/keepset/actions)
|
|
4
4
|
|
|
5
|
-
A catalogue of datasets, each with a machine-readable recipe that says how to fetch it and how to normalise it into the shape its category names. The `keepset` package is the consumable library over that catalogue; the CLI and the statically generated site are thin surfaces on top of it. Entries are expressed with [
|
|
5
|
+
A catalogue of datasets, each with a machine-readable recipe that says how to fetch it and how to normalise it into the shape its category names. The `keepset` package is the consumable library over that catalogue; the CLI and the statically generated site are thin surfaces on top of it. Entries are expressed with [crossmap](https://github.com/ExaDev/crossmap) crosswalks, so fetching a dataset yields a normalised shape directly in user code.
|
|
6
6
|
|
|
7
7
|
## Usage
|
|
8
8
|
|
|
@@ -36,7 +36,7 @@ npx keepset validate cora
|
|
|
36
36
|
npx keepset roundtrip cora
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
`namespaces [path]` lists the namespaces directly beneath a path (the outermost ones without one) with how many datasets each holds, and the site has a page for each, linked from every entry's namespace. `fetch` writes the normalised result with its provenance beside it; `validate` checks the entry against the entry schema and its crosswalk against
|
|
39
|
+
`namespaces [path]` lists the namespaces directly beneath a path (the outermost ones without one) with how many datasets each holds, and the site has a page for each, linked from every entry's namespace. `fetch` writes the normalised result with its provenance beside it; `validate` checks the entry against the entry schema and its crosswalk against crossmap's validation without the network; `roundtrip` fetches the dataset and checks that decoding the encoded native document gives it back. Exit status is 0 for an answer, 1 for a negative one (an invalid entry, a round trip that does not hold) and 2 for no answer (bad usage, an unknown or ambiguous name or namespace, a recipe that failed).
|
|
40
40
|
|
|
41
41
|
## Names, aliases and namespaces
|
|
42
42
|
|
|
@@ -57,7 +57,7 @@ An alias that is a path, such as `foo/graphs/bar`, files the entry in a second g
|
|
|
57
57
|
|
|
58
58
|
## The entry format
|
|
59
59
|
|
|
60
|
-
An entry is a JSON document in `catalogue/entries/`: a descriptor (stable id, name, description, domain, subjects, tags), the category whose normalisation target the entry resolves to, its sources (each with a retrieval date, and for a dead source a pinned Wayback snapshot that travels with the URL because the snapshot timestamp is part of the recipe's reproducibility), its licence and citations, the recipe that turns downloaded bytes into the dataset's native JSON shape, and a
|
|
60
|
+
An entry is a JSON document in `catalogue/entries/`: a descriptor (stable id, name, description, domain, subjects, tags), the category whose normalisation target the entry resolves to, its sources (each with a retrieval date, and for a dead source a pinned Wayback snapshot that travels with the URL because the snapshot timestamp is part of the recipe's reproducibility), its licence and citations, the recipe that turns downloaded bytes into the dataset's native JSON shape, and a crossmap crosswalk mapping that native shape onto the category target. The format is defined by Zod schemas, and the generated JSON Schema is published with the package as `keepset/schemas/entry.schema.json`, with the catalogue manifest's beside it. The domain is the entry's topic, its tags are the node fields it carries, its namespace is the source it comes from, and its subjects are the fields of study it is relevant to (for example `operations-research`), as slugs a search filters by (`keepset search --subject operations-research`), a listing page per subject on the site and keywords in the JSON-LD.
|
|
61
61
|
|
|
62
62
|
The catalogue itself is a manifest (`catalogue/manifest.json`: id, version, repository) plus the entries and their crosswalks. Contribution is by forking with lineage: a fork is its own catalogue, its manifest names the catalogue and version it was forked from, and entry ids stay stable across forks so two catalogues can be compared entry by entry.
|
|
63
63
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CrosswalkSchema, validateCrosswalk } from "
|
|
1
|
+
import { CrosswalkSchema, validateCrosswalk } from "crossmap";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
//#region src/errors.ts
|
|
4
4
|
/** The root of this package's error taxonomy: every error keepset throws is a `KeepsetError`, so callers can catch the family with one check. */
|
|
@@ -235,7 +235,7 @@ function maybe(schema) {
|
|
|
235
235
|
return schema.nullable().optional();
|
|
236
236
|
}
|
|
237
237
|
/**
|
|
238
|
-
* A task: a place or case to visit or serve, such as a stop of a route or a case in a register, flat so a
|
|
238
|
+
* A task: a place or case to visit or serve, such as a stop of a route or a case in a register, flat so a crossmap crosswalk can map a table's columns onto it (a wildcard path must keep the same shape on both sides). The target fixes only what the datasets share and lets a crosswalk map any further column through under its own name, as graph/v1 does. `lat` and `lon` are WGS84 degrees and `x` and `y` are planar coordinates in the dataset's own system; `duration` and `travelTime` are seconds, `prize` is the dataset's own reward measure, and `prizeProbability` is the chance the reward is collected. `skill` and `territory` name what is needed to serve the node and where it sits, `status` is where it is in its lifecycle, and `opened`, `closed` and `deadline` are its lifecycle times as the source writes them, a deadline being a number where the source gives a time of day.
|
|
239
239
|
*/
|
|
240
240
|
const TaskSchema = z.looseObject({
|
|
241
241
|
id: z.string().min(1),
|
|
@@ -535,7 +535,7 @@ const ArchiveSchema = z.union([
|
|
|
535
535
|
const ColumnSchema = z.int().min(0);
|
|
536
536
|
/** The text encoding of the unpacked file. Decoding is strict: bytes that are not valid in the stated encoding fail the recipe rather than turning into replacement characters. */
|
|
537
537
|
const EncodingSchema = z.enum(["utf-8", "latin1"]);
|
|
538
|
-
/** A column of a table as the table parser names it: the header with every run of characters outside letters, digits and underscore replaced by one underscore, so it is a valid segment of a
|
|
538
|
+
/** A column of a table as the table parser names it: the header with every run of characters outside letters, digits and underscore replaced by one underscore, so it is a valid segment of a crossmap path. */
|
|
539
539
|
const ColumnNameSchema = z.string().regex(/^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$/, { message: "must be a column name as the parser spells it: letters, digits and underscores, starting with a letter and not ending with an underscore" });
|
|
540
540
|
/** The parser that reads the unpacked file into the dataset's native JSON shape, with the options that format needs. Every option is stated in the entry, so a recipe reads the same way wherever it runs. */
|
|
541
541
|
const ParserSchema = z.discriminatedUnion("format", [
|
|
@@ -675,7 +675,7 @@ const RecipeSchema = z.discriminatedUnion("status", [z.object({
|
|
|
675
675
|
status: z.literal("not-fetchable"),
|
|
676
676
|
reason: z.string().min(1)
|
|
677
677
|
}).strict()]);
|
|
678
|
-
/** The
|
|
678
|
+
/** The crossmap crosswalk from the native shape to the category target: the document inline, or a `.json` file path relative to the catalogue root, so entries that share a native shape share one crosswalk. */
|
|
679
679
|
const CrosswalkReferenceSchema = z.union([CrosswalkSchema, z.object({ file: RelativePathSchema.refine((path) => path.endsWith(".json"), { message: "must name a .json file" }) }).strict()]);
|
|
680
680
|
/** The meta keys a fetched result takes from the entry's own descriptor, which its `properties` therefore may not also set. */
|
|
681
681
|
const RESERVED_META_KEYS = ["id", "name"];
|
|
@@ -819,7 +819,7 @@ function parseManifest(doc) {
|
|
|
819
819
|
//#endregion
|
|
820
820
|
//#region src/catalogue.ts
|
|
821
821
|
/**
|
|
822
|
-
* A catalogue index: the manifest, every entry, and every crosswalk file of the catalogue, keyed by its catalogue-relative path. The build assembles it from a catalogue directory; a consumer holding its own catalogue (a fork, say) can pass one to `createCatalogue`. Entry ids are unique, every fully qualified name (the whole path of an id or alias) identifies one entry and is not another entry's id, every namespace segment the manifest gives aliases to is some entry's segment and no alias is itself one, every crosswalk passes
|
|
822
|
+
* A catalogue index: the manifest, every entry, and every crosswalk file of the catalogue, keyed by its catalogue-relative path. The build assembles it from a catalogue directory; a consumer holding its own catalogue (a fork, say) can pass one to `createCatalogue`. Entry ids are unique, no two entries have the same name once case and surrounding or repeated spaces are ignored (a listing would show two rows a reader cannot tell apart), every fully qualified name (the whole path of an id or alias) identifies one entry and is not another entry's id, every namespace segment the manifest gives aliases to is some entry's segment and no alias is itself one, every crosswalk passes crossmap's structural validation, every crosswalk file reference resolves, and every crosswalk's target is the category of each entry that uses it.
|
|
823
823
|
*/
|
|
824
824
|
const CatalogueIndexSchema = define(z.object({
|
|
825
825
|
manifest: ManifestSchema,
|
|
@@ -855,7 +855,20 @@ const CatalogueIndexSchema = define(z.object({
|
|
|
855
855
|
const seen = /* @__PURE__ */ new Set();
|
|
856
856
|
const ids = new Set(index.entries.map((entry) => entry.id));
|
|
857
857
|
const owners = /* @__PURE__ */ new Map();
|
|
858
|
+
const namers = /* @__PURE__ */ new Map();
|
|
858
859
|
for (const [position, entry] of index.entries.entries()) {
|
|
860
|
+
const listed = entry.name.trim().replace(/\s+/g, " ").toLowerCase();
|
|
861
|
+
const namer = namers.get(listed);
|
|
862
|
+
if (namer === void 0) namers.set(listed, entry.id);
|
|
863
|
+
else if (namer !== entry.id) ctx.addIssue({
|
|
864
|
+
code: "custom",
|
|
865
|
+
path: [
|
|
866
|
+
"entries",
|
|
867
|
+
position,
|
|
868
|
+
"name"
|
|
869
|
+
],
|
|
870
|
+
message: `${entry.name} is also the name of entry ${namer}, so a listing would show the two alike; name the source or variant that tells them apart`
|
|
871
|
+
});
|
|
859
872
|
if (seen.has(entry.id)) ctx.addIssue({
|
|
860
873
|
code: "custom",
|
|
861
874
|
path: [
|
|
@@ -1041,7 +1054,7 @@ var catalogue_default = {
|
|
|
1041
1054
|
"id": "keepset",
|
|
1042
1055
|
"name": "keepset",
|
|
1043
1056
|
"description": "The keepset catalogue: datasets with machine-readable recipes that fetch each one and normalise it into its category's target shape.",
|
|
1044
|
-
"version": "1.
|
|
1057
|
+
"version": "1.22.0",
|
|
1045
1058
|
"repository": "https://github.com/Mearman/keepset",
|
|
1046
1059
|
"namespaceAliases": {
|
|
1047
1060
|
"networkrepository": ["nr"],
|
|
@@ -1588,6 +1601,7 @@ var catalogue_default = {
|
|
|
1588
1601
|
"namespace": ["amazon"],
|
|
1589
1602
|
"aliases": ["last-mile-routing-2021"],
|
|
1590
1603
|
"name": "Amazon Last Mile Routing Research Challenge 2021",
|
|
1604
|
+
"description": "Historical routes driven by Amazon delivery drivers in five US metropolitan areas, with route, stop and package level features and the sequence each driver actually followed. Released for the 2021 Amazon Last Mile Routing Research Challenge with identifiers regenerated and locations obfuscated.",
|
|
1591
1605
|
"domain": "Last-mile logistics",
|
|
1592
1606
|
"subjects": ["operations-research"],
|
|
1593
1607
|
"tags": [
|
|
@@ -1607,7 +1621,10 @@ var catalogue_default = {
|
|
|
1607
1621
|
"kind": "spdx",
|
|
1608
1622
|
"id": "CC-BY-NC-4.0"
|
|
1609
1623
|
},
|
|
1610
|
-
"citations": [
|
|
1624
|
+
"citations": [{
|
|
1625
|
+
"text": "D. Merchan, J. Arora, J. Pachon, K. Konduri, M. Winkenbach, S. Parks, J. Noszek (2024). 2021 Amazon Last Mile Routing Research Challenge: Data set. Transportation Science 58(1), 8-11.",
|
|
1626
|
+
"doi": "10.1287/trsc.2022.1173"
|
|
1627
|
+
}],
|
|
1611
1628
|
"recipe": {
|
|
1612
1629
|
"status": "not-fetchable",
|
|
1613
1630
|
"reason": "The data is large nested JSON with bare NaN tokens, the largest file is 1.8 GB, and keepset has no JSON parser for it."
|
|
@@ -1837,7 +1854,7 @@ var catalogue_default = {
|
|
|
1837
1854
|
"id": "arenas-celegans-metabolic",
|
|
1838
1855
|
"namespace": ["arenas"],
|
|
1839
1856
|
"aliases": ["celegans-metabolic"],
|
|
1840
|
-
"name": "C. elegans Metabolic Network",
|
|
1857
|
+
"name": "C. elegans Metabolic Network (Arenas)",
|
|
1841
1858
|
"description": "Metabolic network of the nematode C. elegans.",
|
|
1842
1859
|
"tags": [],
|
|
1843
1860
|
"category": "graph/v1",
|
|
@@ -3157,6 +3174,7 @@ var catalogue_default = {
|
|
|
3157
3174
|
"namespace": ["camden"],
|
|
3158
3175
|
"aliases": ["hmo-licensing-register-duplicate"],
|
|
3159
3176
|
"name": "HMO licensing register (Camden, duplicate entry)",
|
|
3177
|
+
"description": "The Camden houses in multiple occupation licensing register, listed a second time by the survey under the portal's root URL. The entry for the register itself holds the recipe.",
|
|
3160
3178
|
"domain": "Case records",
|
|
3161
3179
|
"subjects": ["operations-research"],
|
|
3162
3180
|
"tags": [
|
|
@@ -3603,6 +3621,7 @@ var catalogue_default = {
|
|
|
3603
3621
|
"namespace": ["chicago"],
|
|
3604
3622
|
"aliases": ["ordinance-violations"],
|
|
3605
3623
|
"name": "Ordinance violations (Chicago Department of Administrative Hearings)",
|
|
3624
|
+
"description": "Ordinance violations brought before the Chicago Department of Administrative Hearings, one row per violation, with the most recent hearing date and the case disposition. Violations heard by the Circuit Court of Cook County are not included.",
|
|
3606
3625
|
"domain": "Case records",
|
|
3607
3626
|
"subjects": ["operations-research"],
|
|
3608
3627
|
"tags": [
|
|
@@ -4974,6 +4993,7 @@ var catalogue_default = {
|
|
|
4974
4993
|
"namespace": ["cqc"],
|
|
4975
4994
|
"aliases": ["care-directory"],
|
|
4976
4995
|
"name": "CQC care directory (England)",
|
|
4996
|
+
"description": "The Care Quality Commission's list of the places in England where care is regulated, covering hospitals, care homes, GPs, dentists and home care agencies, with their addresses and postcodes. It is published as a spreadsheet that the commission updates regularly.",
|
|
4977
4997
|
"domain": "Technician and home-care routing",
|
|
4978
4998
|
"subjects": ["operations-research"],
|
|
4979
4999
|
"tags": [
|
|
@@ -5656,6 +5676,7 @@ var catalogue_default = {
|
|
|
5656
5676
|
"namespace": ["defra"],
|
|
5657
5677
|
"aliases": ["historic-flood-warnings"],
|
|
5658
5678
|
"name": "Historic Flood Warnings (England)",
|
|
5679
|
+
"description": "Every severe flood warning, flood warning and flood alert the Environment Agency has issued for flooding from rivers, the sea and some groundwater sites since the warning system began in January 2006.",
|
|
5659
5680
|
"domain": "Civic and environmental monitoring",
|
|
5660
5681
|
"subjects": ["operations-research"],
|
|
5661
5682
|
"tags": [
|
|
@@ -6117,6 +6138,7 @@ var catalogue_default = {
|
|
|
6117
6138
|
"namespace": ["elsevier"],
|
|
6118
6139
|
"aliases": ["ev-hhcrsp-multi-period"],
|
|
6119
6140
|
"name": "EV home health care routing, multi-period variant",
|
|
6141
|
+
"description": "Instances for the multi-period electric vehicle home health care routing and scheduling problem with uncertain travel times and service durations, from Yin et al. in Omega. The publisher's page refuses automated requests, so this rests on the survey item and the article's metadata.",
|
|
6120
6142
|
"domain": "Technician and home-care routing",
|
|
6121
6143
|
"subjects": ["operations-research"],
|
|
6122
6144
|
"tags": [
|
|
@@ -6133,7 +6155,10 @@ var catalogue_default = {
|
|
|
6133
6155
|
"status": "live"
|
|
6134
6156
|
}],
|
|
6135
6157
|
"licence": { "kind": "unrecorded" },
|
|
6136
|
-
"citations": [
|
|
6158
|
+
"citations": [{
|
|
6159
|
+
"text": "Y. Yin, X. Liu, L. Qing, H. Qiu, X. Wei (2026). An exact solution approach for the multi-period EV home health care routing and scheduling problem with uncertain travel times and service durations. Omega 144, 103587.",
|
|
6160
|
+
"doi": "10.1016/j.omega.2026.103587"
|
|
6161
|
+
}],
|
|
6137
6162
|
"recipe": {
|
|
6138
6163
|
"status": "not-fetchable",
|
|
6139
6164
|
"reason": "The survey URL is a journal article DOI and no dataset download was found."
|
|
@@ -6570,6 +6595,7 @@ var catalogue_default = {
|
|
|
6570
6595
|
"namespace": ["fema"],
|
|
6571
6596
|
"aliases": ["nfip-redacted-claims"],
|
|
6572
6597
|
"name": "FEMA NFIP redacted claims",
|
|
6598
|
+
"description": "Flood insurance claim transactions of the National Flood Insurance Program, redacted to protect policyholders' personal information, with claim dates, rounded locations and amounts paid. FEMA publishes it through the OpenFEMA API.",
|
|
6573
6599
|
"domain": "Claims and unclaimed money",
|
|
6574
6600
|
"subjects": ["operations-research"],
|
|
6575
6601
|
"tags": [
|
|
@@ -6892,6 +6918,7 @@ var catalogue_default = {
|
|
|
6892
6918
|
"namespace": ["france-sdes"],
|
|
6893
6919
|
"aliases": ["sitadel-housing-permits-ile-de-france"],
|
|
6894
6920
|
"name": "Sitadel housing permits (Ile-de-France)",
|
|
6921
|
+
"description": "Building permits and prior declarations from the national Sitadel database that create, transform or demolish dwellings in Ile-de-France, published by the regional environment and transport directorate as a point shapefile.",
|
|
6895
6922
|
"domain": "Case records",
|
|
6896
6923
|
"subjects": ["operations-research"],
|
|
6897
6924
|
"tags": [
|
|
@@ -7147,6 +7174,7 @@ var catalogue_default = {
|
|
|
7147
7174
|
"namespace": ["github-afkummer"],
|
|
7148
7175
|
"aliases": ["hhcrsp-curated-instances"],
|
|
7149
7176
|
"name": "HHCRSP curated instances (Kummer, 2021)",
|
|
7177
|
+
"description": "Instances for the daily home health care routing and scheduling problem with several service types, multiple visits and route interdependence, generated on OpenAddresses data for Porto Alegre, with lower and upper bounds and a curated selection of hard and random instances for each size.",
|
|
7150
7178
|
"domain": "Technician and home-care routing",
|
|
7151
7179
|
"subjects": ["operations-research"],
|
|
7152
7180
|
"tags": [
|
|
@@ -7163,7 +7191,13 @@ var catalogue_default = {
|
|
|
7163
7191
|
"status": "live"
|
|
7164
7192
|
}],
|
|
7165
7193
|
"licence": { "kind": "unrecorded" },
|
|
7166
|
-
"citations": [
|
|
7194
|
+
"citations": [{
|
|
7195
|
+
"text": "D. S. Mankowska, F. Meisel, C. Bierwirth (2014). The home health care routing and scheduling problem with interdependent services. Health Care Management Science 17(1), 15-30.",
|
|
7196
|
+
"doi": "10.1007/s10729-013-9243-1"
|
|
7197
|
+
}, {
|
|
7198
|
+
"text": "C. S. Sartori, L. S. Buriol (2020). OVIG, the instance generator the dataset's instances were generated with.",
|
|
7199
|
+
"url": "https://github.com/cssartori/ovig"
|
|
7200
|
+
}],
|
|
7167
7201
|
"recipe": {
|
|
7168
7202
|
"status": "not-fetchable",
|
|
7169
7203
|
"reason": "The instances are keyword format text files with node positions, time windows, service durations and a travel time matrix, but the repository holds them as a very large number of separate files in size directories and publishes no archive of the curated selection, so a recipe has no single download to read; the repository's own archive holds every instance and is several gigabytes."
|
|
@@ -7177,6 +7211,7 @@ var catalogue_default = {
|
|
|
7177
7211
|
"namespace": ["github-bascoding"],
|
|
7178
7212
|
"aliases": ["verolog-2019"],
|
|
7179
7213
|
"name": "VeRoLog 2019 machine delivery and installation instances",
|
|
7214
|
+
"description": "A student repository holding the instances ORTEC published for the VeRoLog Solver Challenge 2019, in which trucks deliver machines to customers and technicians then install them within a window of days.",
|
|
7180
7215
|
"domain": "Technician and home-care routing",
|
|
7181
7216
|
"subjects": ["operations-research"],
|
|
7182
7217
|
"tags": [
|
|
@@ -7274,6 +7309,7 @@ var catalogue_default = {
|
|
|
7274
7309
|
"namespace": ["github-meituan"],
|
|
7275
7310
|
"aliases": ["informs-tsl-dispatch-waybill"],
|
|
7276
7311
|
"name": "Meituan-INFORMS-TSL research challenge dataset",
|
|
7312
|
+
"description": "Operational data from Meituan's on-demand food delivery platform for the 2025 INFORMS TSL Data-Driven Research Challenge, covering orders, couriers and merchants, with the waybill and wave records of how orders were dispatched.",
|
|
7277
7313
|
"domain": "Last-mile logistics",
|
|
7278
7314
|
"subjects": ["operations-research"],
|
|
7279
7315
|
"tags": [
|
|
@@ -7293,7 +7329,10 @@ var catalogue_default = {
|
|
|
7293
7329
|
"kind": "spdx",
|
|
7294
7330
|
"id": "CC-BY-NC-4.0"
|
|
7295
7331
|
},
|
|
7296
|
-
"citations": [
|
|
7332
|
+
"citations": [{
|
|
7333
|
+
"text": "H. Wang, L. Zhao, K. Yan, X. Wang, Y. Liang, J. Hao (2025). Meituan: Operational-level on-demand food delivery data for the 2025 INFORMS TSL Data-Driven Research Challenge.",
|
|
7334
|
+
"url": "https://github.com/meituan/Meituan-INFORMS-TSL-Research-Challenge"
|
|
7335
|
+
}],
|
|
7297
7336
|
"recipe": {
|
|
7298
7337
|
"status": "not-fetchable",
|
|
7299
7338
|
"reason": "The data is released under CC BY-NC 4.0 with a bar on passing it to third parties without permission, and its coordinates are shifted by the publisher, so they are not WGS84 positions."
|
|
@@ -7322,7 +7361,10 @@ var catalogue_default = {
|
|
|
7322
7361
|
"status": "live"
|
|
7323
7362
|
}],
|
|
7324
7363
|
"licence": { "kind": "unrecorded" },
|
|
7325
|
-
"citations": [
|
|
7364
|
+
"citations": [{
|
|
7365
|
+
"text": "B. Singh, L. Oberfichtner, S. Ivliev (2023). Heuristics for a cash-collection routing problem with a cluster-first route-second approach. Annals of Operations Research 322(1), 413-440.",
|
|
7366
|
+
"doi": "10.1007/s10479-022-04883-1"
|
|
7367
|
+
}],
|
|
7326
7368
|
"recipe": {
|
|
7327
7369
|
"status": "not-fetchable",
|
|
7328
7370
|
"reason": "The only data file is an old binary xls workbook, and keepset reads only xlsx."
|
|
@@ -7359,7 +7401,10 @@ var catalogue_default = {
|
|
|
7359
7401
|
"kind": "spdx",
|
|
7360
7402
|
"id": "GPL-2.0-only"
|
|
7361
7403
|
},
|
|
7362
|
-
"citations": [
|
|
7404
|
+
"citations": [{
|
|
7405
|
+
"text": "J. Castro-Gutierrez, D. Landa-Silva, J. Moreno Perez (2011). Nature of real-world multi-objective vehicle routing with evolutionary algorithms. 2011 IEEE International Conference on Systems, Man, and Cybernetics, 257-264.",
|
|
7406
|
+
"doi": "10.1109/ICSMC.2011.6083675"
|
|
7407
|
+
}],
|
|
7363
7408
|
"recipe": {
|
|
7364
7409
|
"status": "fetchable",
|
|
7365
7410
|
"source": 1,
|
|
@@ -7839,7 +7884,11 @@ var catalogue_default = {
|
|
|
7839
7884
|
"kind": "spdx",
|
|
7840
7885
|
"id": "Apache-2.0"
|
|
7841
7886
|
},
|
|
7842
|
-
"citations": [
|
|
7887
|
+
"citations": [{
|
|
7888
|
+
"text": "L. Wu et al. (2023). LaDe: The first comprehensive last-mile delivery dataset from industry. arXiv:2306.10675.",
|
|
7889
|
+
"doi": "10.48550/arXiv.2306.10675",
|
|
7890
|
+
"url": "https://arxiv.org/abs/2306.10675"
|
|
7891
|
+
}],
|
|
7843
7892
|
"recipe": {
|
|
7844
7893
|
"status": "fetchable",
|
|
7845
7894
|
"source": 1,
|
|
@@ -8803,7 +8852,20 @@ var catalogue_default = {
|
|
|
8803
8852
|
"status": "live"
|
|
8804
8853
|
}],
|
|
8805
8854
|
"licence": { "kind": "unrecorded" },
|
|
8806
|
-
"citations": [
|
|
8855
|
+
"citations": [
|
|
8856
|
+
{
|
|
8857
|
+
"text": "T. Tsiligirides (1984). Heuristic methods applied to orienteering. Journal of the Operational Research Society 35(9), 797-809.",
|
|
8858
|
+
"doi": "10.1057/jors.1984.162"
|
|
8859
|
+
},
|
|
8860
|
+
{
|
|
8861
|
+
"text": "I.-M. Chao, B. L. Golden, E. A. Wasil (1996). The team orienteering problem. European Journal of Operational Research 88(3), 464-474.",
|
|
8862
|
+
"doi": "10.1016/0377-2217(94)00289-4"
|
|
8863
|
+
},
|
|
8864
|
+
{
|
|
8865
|
+
"text": "I.-M. Chao, B. L. Golden, E. A. Wasil (1996). A fast and effective heuristic for the orienteering problem. European Journal of Operational Research 88(3), 475-489.",
|
|
8866
|
+
"doi": "10.1016/0377-2217(95)00035-6"
|
|
8867
|
+
}
|
|
8868
|
+
],
|
|
8807
8869
|
"recipe": {
|
|
8808
8870
|
"status": "fetchable",
|
|
8809
8871
|
"source": 1,
|
|
@@ -8882,7 +8944,10 @@ var catalogue_default = {
|
|
|
8882
8944
|
"status": "live"
|
|
8883
8945
|
}],
|
|
8884
8946
|
"licence": { "kind": "unrecorded" },
|
|
8885
|
-
"citations": [
|
|
8947
|
+
"citations": [{ "text": "G. Righini, M. Salani (2006). Dynamic programming for the orienteering problem with time windows. Technical Report 91, Dipartimento di Tecnologie dell'Informazione, Universita degli Studi di Milano, Crema." }, {
|
|
8948
|
+
"text": "G. Righini, M. Salani (2008). New dynamic programming algorithms for the resource constrained elementary shortest path problem. Networks 51(3), 155-170.",
|
|
8949
|
+
"doi": "10.1002/net.20212"
|
|
8950
|
+
}],
|
|
8886
8951
|
"recipe": {
|
|
8887
8952
|
"status": "fetchable",
|
|
8888
8953
|
"source": 1,
|
|
@@ -9011,7 +9076,10 @@ var catalogue_default = {
|
|
|
9011
9076
|
"status": "live"
|
|
9012
9077
|
}],
|
|
9013
9078
|
"licence": { "kind": "unrecorded" },
|
|
9014
|
-
"citations": [
|
|
9079
|
+
"citations": [{
|
|
9080
|
+
"text": "M. M. Solomon (1987). Algorithms for the vehicle routing and scheduling problems with time window constraints. Operations Research 35(2), 254-265.",
|
|
9081
|
+
"doi": "10.1287/opre.35.2.254"
|
|
9082
|
+
}],
|
|
9015
9083
|
"recipe": {
|
|
9016
9084
|
"status": "fetchable",
|
|
9017
9085
|
"source": 1,
|
|
@@ -9762,6 +9830,7 @@ var catalogue_default = {
|
|
|
9762
9830
|
"namespace": ["louisville-metro"],
|
|
9763
9831
|
"aliases": ["property-maintenance-violations"],
|
|
9764
9832
|
"name": "Property maintenance inspection violations (Louisville)",
|
|
9833
|
+
"description": "Property maintenance site visits in Louisville Metro with the violations cited, published by Codes and Regulations as a feature layer that covers the last 30 days and is updated daily.",
|
|
9765
9834
|
"domain": "Case records",
|
|
9766
9835
|
"subjects": ["operations-research"],
|
|
9767
9836
|
"tags": [
|
|
@@ -10173,6 +10242,7 @@ var catalogue_default = {
|
|
|
10173
10242
|
"namespace": ["mendeley-data"],
|
|
10174
10243
|
"aliases": ["concrete-delivery-problem"],
|
|
10175
10244
|
"name": "Concrete delivery problem operational data",
|
|
10245
|
+
"description": "Daily concrete orders from construction sites in Quebec, supplied by a concrete producer and processed into instances for the concrete delivery problem, with client and site information anonymised.",
|
|
10176
10246
|
"domain": "Technician and home-care routing",
|
|
10177
10247
|
"subjects": ["operations-research"],
|
|
10178
10248
|
"tags": [
|
|
@@ -10193,7 +10263,10 @@ var catalogue_default = {
|
|
|
10193
10263
|
"kind": "spdx",
|
|
10194
10264
|
"id": "CC-BY-4.0"
|
|
10195
10265
|
},
|
|
10196
|
-
"citations": [
|
|
10266
|
+
"citations": [{
|
|
10267
|
+
"text": "A. Tzanetos, M. Blondin (2023). Real operational data for the concrete delivery problem. Data in Brief 48, 109189.",
|
|
10268
|
+
"doi": "10.1016/j.dib.2023.109189"
|
|
10269
|
+
}],
|
|
10197
10270
|
"recipe": {
|
|
10198
10271
|
"status": "not-fetchable",
|
|
10199
10272
|
"reason": "The downloads are MATLAB data files and keepset has no parser for them."
|
|
@@ -10233,7 +10306,10 @@ var catalogue_default = {
|
|
|
10233
10306
|
"kind": "spdx",
|
|
10234
10307
|
"id": "CC-BY-4.0"
|
|
10235
10308
|
},
|
|
10236
|
-
"citations": [
|
|
10309
|
+
"citations": [{
|
|
10310
|
+
"text": "O. Demiray, E. Yucel, D. Tolga (2026). DWSRP-TW-SC Datasets. Mendeley Data, V1.",
|
|
10311
|
+
"doi": "10.17632/dbsf73xpg5.1"
|
|
10312
|
+
}],
|
|
10237
10313
|
"recipe": {
|
|
10238
10314
|
"status": "not-fetchable",
|
|
10239
10315
|
"reason": "The download is hundreds of small Excel workbooks whose task sheets have no coordinates (places exist only as distance matrices) and whose file names repeat across folders, so no recipe can name one table."
|
|
@@ -10247,6 +10323,7 @@ var catalogue_default = {
|
|
|
10247
10323
|
"namespace": ["mendeley-data"],
|
|
10248
10324
|
"aliases": ["dynamic-team-orienteering"],
|
|
10249
10325
|
"name": "Dynamic team orienteering problem",
|
|
10326
|
+
"description": "Mendeley Data deposit for the dynamic team orienteering problem of Kirac, Milburn and Gedik, described as benchmark instances adapted from the Chao et al. team orienteering instances at weak, moderate and high dynamism.",
|
|
10250
10327
|
"domain": "Orienteering",
|
|
10251
10328
|
"subjects": ["operations-research"],
|
|
10252
10329
|
"tags": [
|
|
@@ -10265,7 +10342,13 @@ var catalogue_default = {
|
|
|
10265
10342
|
"kind": "spdx",
|
|
10266
10343
|
"id": "CC-BY-4.0"
|
|
10267
10344
|
},
|
|
10268
|
-
"citations": [
|
|
10345
|
+
"citations": [{
|
|
10346
|
+
"text": "E. Kirac, A. B. Milburn, R. Gedik (2025). The dynamic team orienteering problem. European Journal of Operational Research 324(1), 22-39.",
|
|
10347
|
+
"doi": "10.1016/j.ejor.2025.01.009"
|
|
10348
|
+
}, {
|
|
10349
|
+
"text": "E. Kirac (2025). Dynamic Team Orienteering Problem (DTOP) Benchmark Instances. Mendeley Data, V1.",
|
|
10350
|
+
"doi": "10.17632/xnf6c4d5gt.1"
|
|
10351
|
+
}],
|
|
10269
10352
|
"recipe": {
|
|
10270
10353
|
"status": "not-fetchable",
|
|
10271
10354
|
"reason": "The only file is an Excel workbook of aggregate results per solved instance, with no row for a place or a task, so there are no nodes to map."
|
|
@@ -10279,6 +10362,7 @@ var catalogue_default = {
|
|
|
10279
10362
|
"namespace": ["mendeley-data"],
|
|
10280
10363
|
"aliases": ["fmucd"],
|
|
10281
10364
|
"name": "Facility Management Unified Classification Database",
|
|
10365
|
+
"description": "Building maintenance work orders from twelve North American universities, classified by the Facility Management Unified Classification Code and joined to the building, its systems and the weather, for planned preventive and unplanned maintenance.",
|
|
10282
10366
|
"domain": "Technician and home-care routing",
|
|
10283
10367
|
"subjects": ["operations-research"],
|
|
10284
10368
|
"tags": [
|
|
@@ -10302,7 +10386,10 @@ var catalogue_default = {
|
|
|
10302
10386
|
"kind": "spdx",
|
|
10303
10387
|
"id": "CC-BY-4.0"
|
|
10304
10388
|
},
|
|
10305
|
-
"citations": [
|
|
10389
|
+
"citations": [{
|
|
10390
|
+
"text": "A. K. Pampana, J. Jeon, S. Yoon, T. J. Weidner (2024). Comprehensive maintenance dataset of building facilities for planned preventive and unplanned maintenance in North American universities. Data in Brief 57, 110845.",
|
|
10391
|
+
"doi": "10.1016/j.dib.2024.110845"
|
|
10392
|
+
}],
|
|
10306
10393
|
"recipe": {
|
|
10307
10394
|
"status": "fetchable",
|
|
10308
10395
|
"source": 1,
|
|
@@ -10352,6 +10439,7 @@ var catalogue_default = {
|
|
|
10352
10439
|
"namespace": ["mendeley-data"],
|
|
10353
10440
|
"aliases": ["hhcrsp-multi-window"],
|
|
10354
10441
|
"name": "Home health care routing, multi-window variant",
|
|
10442
|
+
"description": "Random instances for the home health care routing and scheduling problem with multiple time windows and multiple synchronised services, generated from the benchmark instances of Mankowska et al.",
|
|
10355
10443
|
"domain": "Technician and home-care routing",
|
|
10356
10444
|
"subjects": ["operations-research"],
|
|
10357
10445
|
"tags": [
|
|
@@ -10371,7 +10459,13 @@ var catalogue_default = {
|
|
|
10371
10459
|
"kind": "spdx",
|
|
10372
10460
|
"id": "CC-BY-4.0"
|
|
10373
10461
|
},
|
|
10374
|
-
"citations": [
|
|
10462
|
+
"citations": [{
|
|
10463
|
+
"text": "M. Bazirha (2020). Data for: Home health care routing and scheduling problem with multiple time windows and multiple synchronized services. Mendeley Data, V1.",
|
|
10464
|
+
"doi": "10.17632/hp3xftsrfx.1"
|
|
10465
|
+
}, {
|
|
10466
|
+
"text": "D. S. Mankowska, F. Meisel, C. Bierwirth (2014). The home health care routing and scheduling problem with interdependent services. Health Care Management Science 17(1), 15-30.",
|
|
10467
|
+
"doi": "10.1007/s10729-013-9243-1"
|
|
10468
|
+
}],
|
|
10375
10469
|
"recipe": {
|
|
10376
10470
|
"status": "not-fetchable",
|
|
10377
10471
|
"reason": "The download is a RAR archive of macro enabled Excel workbooks, and keepset reads neither RAR archives nor macro workbooks."
|
|
@@ -10407,7 +10501,10 @@ var catalogue_default = {
|
|
|
10407
10501
|
"kind": "spdx",
|
|
10408
10502
|
"id": "CC-BY-4.0"
|
|
10409
10503
|
},
|
|
10410
|
-
"citations": [
|
|
10504
|
+
"citations": [{
|
|
10505
|
+
"text": "A. Konovalenko, L. M. Hvattum, K. A. H. Iversen (2026). Data describing planned routes and driven routes from a last-mile delivery vehicle routing problem. Data in Brief 66, 112744.",
|
|
10506
|
+
"doi": "10.1016/j.dib.2026.112744"
|
|
10507
|
+
}],
|
|
10411
10508
|
"recipe": {
|
|
10412
10509
|
"status": "not-fetchable",
|
|
10413
10510
|
"reason": "The only file is an Excel workbook with a row per stop visit of a route that holds minute offsets and distances between stops and no location, so the only node field it could fill is a time window and a fetch would carry no place."
|
|
@@ -10441,7 +10538,10 @@ var catalogue_default = {
|
|
|
10441
10538
|
"kind": "spdx",
|
|
10442
10539
|
"id": "CC-BY-4.0"
|
|
10443
10540
|
},
|
|
10444
|
-
"citations": [
|
|
10541
|
+
"citations": [{
|
|
10542
|
+
"text": "Y. Feyman, A. Legler, K. N. Griffith (2021). Appointment wait time data for primary & specialty care in Veterans Health Administration facilities vs. community medical centers. Data in Brief 36, 107134.",
|
|
10543
|
+
"doi": "10.1016/j.dib.2021.107134"
|
|
10544
|
+
}],
|
|
10445
10545
|
"recipe": {
|
|
10446
10546
|
"status": "not-fetchable",
|
|
10447
10547
|
"reason": "The county-level file has 14,365,643 rows, so even the id alone passes the importer's cell limit (a mapped column would hold twice that many cells), and 8,264 of its rows have unquoted commas in the state and county names of the armed forces entries, which the csv-table parser refuses at line 1892."
|
|
@@ -11642,7 +11742,7 @@ var catalogue_default = {
|
|
|
11642
11742
|
"id": "netzschleuder-celegans-metabolic",
|
|
11643
11743
|
"namespace": ["netzschleuder"],
|
|
11644
11744
|
"aliases": ["celegans-metabolic"],
|
|
11645
|
-
"name": "C. elegans Metabolic Network",
|
|
11745
|
+
"name": "C. elegans Metabolic Network (Netzschleuder)",
|
|
11646
11746
|
"description": "Undirected metabolic network of C. elegans. Nodes are metabolites/enzymes. Multiple edges and self-loops present. Heterogeneous with named vertices and structural attributes.",
|
|
11647
11747
|
"domain": "Biological network",
|
|
11648
11748
|
"tags": ["unweighted"],
|
|
@@ -12269,7 +12369,7 @@ var catalogue_default = {
|
|
|
12269
12369
|
"id": "netzschleuder-florentine_families",
|
|
12270
12370
|
"namespace": ["netzschleuder"],
|
|
12271
12371
|
"aliases": ["florentine_families"],
|
|
12272
|
-
"name": "Padgett Florentine
|
|
12372
|
+
"name": "Padgett Florentine Families (Netzschleuder)",
|
|
12273
12373
|
"description": "Multiplex network with 2 edge types representing marriage alliances and business relationships between Florentine families during the Italian Renaissance. Data hosted by Manlio De Domenico.[^icon]\n[^icon]: Description obtained from the [ICON](https://icon.colorado.edu) project.",
|
|
12274
12374
|
"tags": [],
|
|
12275
12375
|
"category": "graph/v1",
|
|
@@ -16645,6 +16745,7 @@ var catalogue_default = {
|
|
|
16645
16745
|
"namespace": ["nyc-open-data"],
|
|
16646
16746
|
"aliases": ["housing-maintenance-code-violations"],
|
|
16647
16747
|
"name": "Housing maintenance code violations (NYC HPD)",
|
|
16748
|
+
"description": "Violations the New York City Department of Housing Preservation and Development has issued against rental dwellings and buildings under the Housing Maintenance Code and the Multiple Dwelling Law, one row per violation, in four classes of hazard.",
|
|
16648
16749
|
"domain": "Case records",
|
|
16649
16750
|
"subjects": ["operations-research"],
|
|
16650
16751
|
"tags": [
|
|
@@ -16825,6 +16926,7 @@ var catalogue_default = {
|
|
|
16825
16926
|
"namespace": ["nyc-open-data"],
|
|
16826
16927
|
"aliases": ["oath-hearings-case-status"],
|
|
16827
16928
|
"name": "OATH hearings division case status (NYC)",
|
|
16929
|
+
"description": "Summonses for public safety and quality of life violations filed and adjudicated at New York City's Office of Administrative Trials and Hearings, with the infraction charged, the decision, payments and amounts.",
|
|
16828
16930
|
"domain": "Case records",
|
|
16829
16931
|
"subjects": ["operations-research"],
|
|
16830
16932
|
"tags": [
|
|
@@ -17338,6 +17440,7 @@ var catalogue_default = {
|
|
|
17338
17440
|
"namespace": ["ortec"],
|
|
17339
17441
|
"aliases": ["verolog-2016-2017-instances"],
|
|
17340
17442
|
"name": "VeRoLog 2016-2017 scarce-equipment pickup and delivery instances",
|
|
17443
|
+
"description": "Instances for the ORTEC VeRoLog Solver Challenge of 2016 to 2017, a routing problem that redistributes scarce equipment between customers within time windows, released in sets from the early test instances to the hidden ones.",
|
|
17341
17444
|
"domain": "Technician and home-care routing",
|
|
17342
17445
|
"subjects": ["operations-research"],
|
|
17343
17446
|
"tags": [
|
|
@@ -17353,7 +17456,10 @@ var catalogue_default = {
|
|
|
17353
17456
|
"status": "live"
|
|
17354
17457
|
}],
|
|
17355
17458
|
"licence": { "kind": "unrecorded" },
|
|
17356
|
-
"citations": [
|
|
17459
|
+
"citations": [{
|
|
17460
|
+
"text": "A. Kheiri, A. G. Dragomir, D. Mueller, J. Gromicho, C. Jagtenberg, J. J. van Hoorn (2019). Tackling a VRP challenge to redistribute scarce equipment within time windows using metaheuristic algorithms. EURO Journal on Transportation and Logistics 8(5), 561-595.",
|
|
17461
|
+
"doi": "10.1007/s13676-019-00143-8"
|
|
17462
|
+
}],
|
|
17357
17463
|
"recipe": {
|
|
17358
17464
|
"status": "not-fetchable",
|
|
17359
17465
|
"reason": "The instances are keyword format text files that the Wayback Machine serves one at a time, as the archive zips of each set were not captured, and a recipe reads one download, so no recipe reaches the collection."
|
|
@@ -17367,6 +17473,7 @@ var catalogue_default = {
|
|
|
17367
17473
|
"namespace": ["overheid-nl"],
|
|
17368
17474
|
"aliases": ["gemeenteblad-omgevingsvergunning"],
|
|
17369
17475
|
"name": "Official publications of environmental permit notices (Netherlands)",
|
|
17476
|
+
"description": "Notices about environmental permits that Dutch municipalities publish in their Gemeenteblad, served as XML records by the SRU search interface of the government's official publications repository.",
|
|
17370
17477
|
"domain": "Case records",
|
|
17371
17478
|
"subjects": ["operations-research"],
|
|
17372
17479
|
"tags": [
|
|
@@ -21456,6 +21563,7 @@ var catalogue_default = {
|
|
|
21456
21563
|
"namespace": ["queensland-government"],
|
|
21457
21564
|
"aliases": ["unclaimed-monies"],
|
|
21458
21565
|
"name": "Unclaimed monies (Queensland)",
|
|
21566
|
+
"description": "The Public Trustee of Queensland's register of unclaimed money from deceased estates and from other sources, with the owner, the amount and the postcode.",
|
|
21459
21567
|
"domain": "Claims and unclaimed money",
|
|
21460
21568
|
"subjects": ["operations-research"],
|
|
21461
21569
|
"tags": ["prize", "territory"],
|
|
@@ -55667,7 +55775,7 @@ var catalogue_default = {
|
|
|
55667
55775
|
"id": "ucinet-padgett",
|
|
55668
55776
|
"namespace": ["ucinet"],
|
|
55669
55777
|
"aliases": ["padgett"],
|
|
55670
|
-
"name": "Padgett Florentine Families",
|
|
55778
|
+
"name": "Padgett Florentine Families (UCINET)",
|
|
55671
55779
|
"description": "Business and marriage ties among Renaissance Florentine families. The Medici vs Strozzi conflict.",
|
|
55672
55780
|
"tags": [],
|
|
55673
55781
|
"category": "graph/v1",
|
|
@@ -56519,7 +56627,10 @@ var catalogue_default = {
|
|
|
56519
56627
|
"status": "live"
|
|
56520
56628
|
}],
|
|
56521
56629
|
"licence": { "kind": "unrecorded" },
|
|
56522
|
-
"citations": [
|
|
56630
|
+
"citations": [{
|
|
56631
|
+
"text": "E. Angelelli, C. Archetti, M. Vindigni (2014). The clustered orienteering problem. European Journal of Operational Research 238(2), 404-414.",
|
|
56632
|
+
"doi": "10.1016/j.ejor.2014.04.006"
|
|
56633
|
+
}],
|
|
56523
56634
|
"recipe": {
|
|
56524
56635
|
"status": "fetchable",
|
|
56525
56636
|
"source": 1,
|
|
@@ -56605,7 +56716,10 @@ var catalogue_default = {
|
|
|
56605
56716
|
"status": "live"
|
|
56606
56717
|
}],
|
|
56607
56718
|
"licence": { "kind": "unrecorded" },
|
|
56608
|
-
"citations": [
|
|
56719
|
+
"citations": [{
|
|
56720
|
+
"text": "N. Cabrera, J.-F. Cordeau, J. E. Mendoza (2022). The doubly open park-and-loop routing problem. Computers & Operations Research 143, 105761.",
|
|
56721
|
+
"doi": "10.1016/j.cor.2022.105761"
|
|
56722
|
+
}],
|
|
56609
56723
|
"recipe": {
|
|
56610
56724
|
"status": "fetchable",
|
|
56611
56725
|
"source": 1,
|
|
@@ -56683,6 +56797,7 @@ var catalogue_default = {
|
|
|
56683
56797
|
"namespace": ["vrp-rep"],
|
|
56684
56798
|
"aliases": ["probabilistic-orienteering"],
|
|
56685
56799
|
"name": "Probabilistic orienteering problem",
|
|
56800
|
+
"description": "Instances for the probabilistic orienteering problem, in which each customer is present only with a given probability, from Angelelli, Archetti, Filippi and Vindigni, distributed through VRP-REP.",
|
|
56686
56801
|
"domain": "Orienteering",
|
|
56687
56802
|
"subjects": ["operations-research"],
|
|
56688
56803
|
"tags": [
|
|
@@ -56702,7 +56817,10 @@ var catalogue_default = {
|
|
|
56702
56817
|
"status": "live"
|
|
56703
56818
|
}],
|
|
56704
56819
|
"licence": { "kind": "unrecorded" },
|
|
56705
|
-
"citations": [
|
|
56820
|
+
"citations": [{
|
|
56821
|
+
"text": "E. Angelelli, C. Archetti, C. Filippi, M. Vindigni (2017). The probabilistic orienteering problem. Computers & Operations Research 81, 269-281.",
|
|
56822
|
+
"doi": "10.1016/j.cor.2016.12.025"
|
|
56823
|
+
}],
|
|
56706
56824
|
"recipe": {
|
|
56707
56825
|
"status": "fetchable",
|
|
56708
56826
|
"source": 1,
|
|
@@ -56774,6 +56892,7 @@ var catalogue_default = {
|
|
|
56774
56892
|
"namespace": ["vrp-rep"],
|
|
56775
56893
|
"aliases": ["technician-routing-pillac"],
|
|
56776
56894
|
"name": "Technician routing and scheduling problem (Pillac et al.)",
|
|
56895
|
+
"description": "Technician routing and scheduling instances from Pillac, Gueret and Medaglia, with node coordinates and the skills a technician must cover, distributed through VRP-REP.",
|
|
56777
56896
|
"domain": "Technician and home-care routing",
|
|
56778
56897
|
"subjects": ["operations-research"],
|
|
56779
56898
|
"tags": [
|
|
@@ -56794,7 +56913,10 @@ var catalogue_default = {
|
|
|
56794
56913
|
"status": "live"
|
|
56795
56914
|
}],
|
|
56796
56915
|
"licence": { "kind": "unrecorded" },
|
|
56797
|
-
"citations": [
|
|
56916
|
+
"citations": [{
|
|
56917
|
+
"text": "V. Pillac, C. Gueret, A. L. Medaglia (2013). A parallel matheuristic for the technician routing and scheduling problem. Optimization Letters 7(7), 1525-1535.",
|
|
56918
|
+
"doi": "10.1007/s11590-012-0567-4"
|
|
56919
|
+
}],
|
|
56798
56920
|
"recipe": {
|
|
56799
56921
|
"status": "fetchable",
|
|
56800
56922
|
"source": 1,
|
|
@@ -57914,7 +58036,10 @@ var catalogue_default = {
|
|
|
57914
58036
|
"kind": "spdx",
|
|
57915
58037
|
"id": "CC-BY-4.0"
|
|
57916
58038
|
},
|
|
57917
|
-
"citations": [
|
|
58039
|
+
"citations": [{
|
|
58040
|
+
"text": "D. Sinha Roy, C. Defryn, B. Golden, E. Wasil (2022). Data-driven optimization and statistical modeling to improve meter reading for utility companies. Computers & Operations Research 145, 105844.",
|
|
58041
|
+
"doi": "10.1016/j.cor.2022.105844"
|
|
58042
|
+
}],
|
|
57918
58043
|
"recipe": {
|
|
57919
58044
|
"status": "fetchable",
|
|
57920
58045
|
"source": 1,
|
|
@@ -57985,7 +58110,10 @@ var catalogue_default = {
|
|
|
57985
58110
|
"kind": "spdx",
|
|
57986
58111
|
"id": "CC-BY-4.0"
|
|
57987
58112
|
},
|
|
57988
|
-
"citations": [
|
|
58113
|
+
"citations": [{
|
|
58114
|
+
"text": "A. Vrani, S. D. Apostolidis, A. C. Kapoutsis, E. B. Kosmatopoulos (2025). Delivering data: A real-world dataset for last-mile delivery optimization. Data in Brief 61, 111762.",
|
|
58115
|
+
"doi": "10.1016/j.dib.2025.111762"
|
|
58116
|
+
}],
|
|
57989
58117
|
"recipe": {
|
|
57990
58118
|
"status": "not-fetchable",
|
|
57991
58119
|
"reason": "The download is a zip of Excel workbooks that hold distance and time matrices only, so there are no nodes to map, and keepset reads a sheet of a workbook, not a workbook inside a zip."
|
|
@@ -57999,6 +58127,7 @@ var catalogue_default = {
|
|
|
57999
58127
|
"namespace": ["zenodo"],
|
|
58000
58128
|
"aliases": ["tdc-technician-dispatch"],
|
|
58001
58129
|
"name": "Technician dispatch data (Mathlouthi, Gendreau and Potvin)",
|
|
58130
|
+
"description": "Instance sets and raw results for the technician routing and scheduling problem of Gamst and Pisinger, including the instances of Mathlouthi, Gendreau and Potvin and a further technician dispatch set called TDCData.",
|
|
58002
58131
|
"domain": "Technician and home-care routing",
|
|
58003
58132
|
"subjects": ["operations-research"],
|
|
58004
58133
|
"tags": [
|
|
@@ -58021,7 +58150,10 @@ var catalogue_default = {
|
|
|
58021
58150
|
"kind": "spdx",
|
|
58022
58151
|
"id": "CC-BY-4.0"
|
|
58023
58152
|
},
|
|
58024
|
-
"citations": [
|
|
58153
|
+
"citations": [{
|
|
58154
|
+
"text": "M. Gamst, D. Pisinger (2024). Decision support for the technician routing and scheduling problem. Networks 83(1), 169-196.",
|
|
58155
|
+
"doi": "10.1002/net.22188"
|
|
58156
|
+
}],
|
|
58025
58157
|
"recipe": {
|
|
58026
58158
|
"status": "not-fetchable",
|
|
58027
58159
|
"reason": "The instances are a custom sectioned text format whose tasks have no positions, and the collection is hundreds of megabytes compressed, almost all of it a pairwise travel time matrix that tasks/v1 has no arcs to hold, so reading it would hold gigabytes in memory to keep a few fields per task."
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Crosswalk } from "
|
|
1
|
+
import { Crosswalk } from "crossmap";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
//#region src/entry.d.ts
|
|
4
4
|
/** A stable identifier: an entry id, a catalogue id. It starts with a letter or digit, so no id can be `__proto__` or any other name that begins with an underscore. Entry ids stay the same across forks, which is what lets two catalogues be compared entry by entry. */
|
|
@@ -131,7 +131,7 @@ type DocumentArchive = Exclude<Archive, {
|
|
|
131
131
|
}>;
|
|
132
132
|
/** An archive that gives every file a collection is read from. */
|
|
133
133
|
type CollectionArchive = z.infer<typeof CollectionArchiveSchema>;
|
|
134
|
-
/** A column of a table as the table parser names it: the header with every run of characters outside letters, digits and underscore replaced by one underscore, so it is a valid segment of a
|
|
134
|
+
/** A column of a table as the table parser names it: the header with every run of characters outside letters, digits and underscore replaced by one underscore, so it is a valid segment of a crossmap path. */
|
|
135
135
|
declare const ColumnNameSchema: z.ZodString;
|
|
136
136
|
/** The parser that reads the unpacked file into the dataset's native JSON shape, with the options that format needs. Every option is stated in the entry, so a recipe reads the same way wherever it runs. */
|
|
137
137
|
declare const ParserSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
@@ -393,9 +393,9 @@ declare const RecipeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
393
393
|
reason: z.ZodString;
|
|
394
394
|
}, z.core.$strict>], "status">;
|
|
395
395
|
type Recipe = z.infer<typeof RecipeSchema>;
|
|
396
|
-
/** The
|
|
397
|
-
declare const CrosswalkReferenceSchema: z.ZodUnion<readonly [z.ZodType<import("
|
|
398
|
-
is: (value: unknown) => value is import("
|
|
396
|
+
/** The crossmap crosswalk from the native shape to the category target: the document inline, or a `.json` file path relative to the catalogue root, so entries that share a native shape share one crosswalk. */
|
|
397
|
+
declare const CrosswalkReferenceSchema: z.ZodUnion<readonly [z.ZodType<import("crossmap").Crosswalk, unknown, z.core.$ZodTypeInternals<import("crossmap").Crosswalk, unknown>> & {
|
|
398
|
+
is: (value: unknown) => value is import("crossmap").Crosswalk;
|
|
399
399
|
}, z.ZodObject<{
|
|
400
400
|
file: z.ZodString;
|
|
401
401
|
}, z.core.$strict>]>;
|
|
@@ -600,8 +600,8 @@ declare const EntrySchema: z.ZodObject<{
|
|
|
600
600
|
status: z.ZodLiteral<"not-fetchable">;
|
|
601
601
|
reason: z.ZodString;
|
|
602
602
|
}, z.core.$strict>], "status">;
|
|
603
|
-
crosswalk: z.ZodUnion<readonly [z.ZodType<import("
|
|
604
|
-
is: (value: unknown) => value is import("
|
|
603
|
+
crosswalk: z.ZodUnion<readonly [z.ZodType<import("crossmap").Crosswalk, unknown, z.core.$ZodTypeInternals<import("crossmap").Crosswalk, unknown>> & {
|
|
604
|
+
is: (value: unknown) => value is import("crossmap").Crosswalk;
|
|
605
605
|
}, z.ZodObject<{
|
|
606
606
|
file: z.ZodString;
|
|
607
607
|
}, z.core.$strict>]>;
|
|
@@ -744,7 +744,7 @@ declare const EntrySchema: z.ZodObject<{
|
|
|
744
744
|
status: "not-fetchable";
|
|
745
745
|
reason: string;
|
|
746
746
|
};
|
|
747
|
-
crosswalk: import("
|
|
747
|
+
crosswalk: import("crossmap").Crosswalk | {
|
|
748
748
|
file: string;
|
|
749
749
|
};
|
|
750
750
|
expectedCounts: Record<string, number>;
|
|
@@ -816,7 +816,7 @@ declare function parseManifest(doc: unknown): Manifest;
|
|
|
816
816
|
//#endregion
|
|
817
817
|
//#region src/catalogue.d.ts
|
|
818
818
|
/**
|
|
819
|
-
* A catalogue index: the manifest, every entry, and every crosswalk file of the catalogue, keyed by its catalogue-relative path. The build assembles it from a catalogue directory; a consumer holding its own catalogue (a fork, say) can pass one to `createCatalogue`. Entry ids are unique, every fully qualified name (the whole path of an id or alias) identifies one entry and is not another entry's id, every namespace segment the manifest gives aliases to is some entry's segment and no alias is itself one, every crosswalk passes
|
|
819
|
+
* A catalogue index: the manifest, every entry, and every crosswalk file of the catalogue, keyed by its catalogue-relative path. The build assembles it from a catalogue directory; a consumer holding its own catalogue (a fork, say) can pass one to `createCatalogue`. Entry ids are unique, no two entries have the same name once case and surrounding or repeated spaces are ignored (a listing would show two rows a reader cannot tell apart), every fully qualified name (the whole path of an id or alias) identifies one entry and is not another entry's id, every namespace segment the manifest gives aliases to is some entry's segment and no alias is itself one, every crosswalk passes crossmap's structural validation, every crosswalk file reference resolves, and every crosswalk's target is the category of each entry that uses it.
|
|
820
820
|
*/
|
|
821
821
|
declare const CatalogueIndexSchema: z.ZodObject<{
|
|
822
822
|
manifest: z.ZodObject<{
|
|
@@ -1498,7 +1498,7 @@ declare function collectionOf<Document extends object>(document: z.ZodType<Docum
|
|
|
1498
1498
|
//#endregion
|
|
1499
1499
|
//#region src/targets/tasks-v1.d.ts
|
|
1500
1500
|
/**
|
|
1501
|
-
* A task: a place or case to visit or serve, such as a stop of a route or a case in a register, flat so a
|
|
1501
|
+
* A task: a place or case to visit or serve, such as a stop of a route or a case in a register, flat so a crossmap crosswalk can map a table's columns onto it (a wildcard path must keep the same shape on both sides). The target fixes only what the datasets share and lets a crosswalk map any further column through under its own name, as graph/v1 does. `lat` and `lon` are WGS84 degrees and `x` and `y` are planar coordinates in the dataset's own system; `duration` and `travelTime` are seconds, `prize` is the dataset's own reward measure, and `prizeProbability` is the chance the reward is collected. `skill` and `territory` name what is needed to serve the node and where it sits, `status` is where it is in its lifecycle, and `opened`, `closed` and `deadline` are its lifecycle times as the source writes them, a deadline being a number where the source gives a time of day.
|
|
1502
1502
|
*/
|
|
1503
1503
|
declare const TaskSchema: z.ZodObject<{
|
|
1504
1504
|
id: z.ZodString;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { $ as CrosswalkReference, A as Catalogue, B as ManifestSchema, C as JsonScalarSchema, Ct as waybackUrl, D as GraphNodeSchema, E as GraphNode, F as NamespaceNode, G as ArchiveMember, H as parseManifest, I as createCatalogue, J as Citation, K as ArchiveMemberSchema, L as Lineage, M as CatalogueIndexSchema, N as Dataset, O as GraphV1, P as DatasetQuery, Q as ColumnNameSchema, R as LineageSchema, S as JsonScalar, St as parseEntry, T as GraphEdgeSchema, U as AliasSchema, V as SemVerSchema, W as Archive, X as CollectionArchive, Y as CitationSchema, Z as CollectionArchiveSchema, _ as TasksV1, _t as SnapshotSchema, a as CategoryTargets, at as IdSchema, b as Instance, bt as SubjectSchema, c as countTarget, ct as Namespace, d as getCollectionTarget, dt as ParserSchema, et as CrosswalkReferenceSchema, f as getTarget, ft as RESERVED_META_KEYS, g as TaskSchema, gt as Snapshot, h as Task, ht as RelativePathSchema, i as CategoryTarget, it as HttpUrlSchema, j as CatalogueIndex, k as GraphV1Schema, l as countedKeys, lt as NamespaceSchema, m as listCategories, mt as RecipeSchema, n as CategoryId, nt as Entry, o as CollectionTarget, ot as Licence, p as kindOf, pt as Recipe, q as ArchiveSchema, r as CategoryIdSchema, rt as EntrySchema, s as CountedKey, st as LicenceSchema, t as Category, tt as DocumentArchive, u as getCategory, ut as Parser, v as TasksV1Schema, vt as Source, w as GraphEdge, x as collectionOf, xt as WaybackTimestampSchema, y as Collection, yt as SourceSchema, z as Manifest } from "./categories-
|
|
2
|
-
import { Crosswalk } from "
|
|
1
|
+
import { $ as CrosswalkReference, A as Catalogue, B as ManifestSchema, C as JsonScalarSchema, Ct as waybackUrl, D as GraphNodeSchema, E as GraphNode, F as NamespaceNode, G as ArchiveMember, H as parseManifest, I as createCatalogue, J as Citation, K as ArchiveMemberSchema, L as Lineage, M as CatalogueIndexSchema, N as Dataset, O as GraphV1, P as DatasetQuery, Q as ColumnNameSchema, R as LineageSchema, S as JsonScalar, St as parseEntry, T as GraphEdgeSchema, U as AliasSchema, V as SemVerSchema, W as Archive, X as CollectionArchive, Y as CitationSchema, Z as CollectionArchiveSchema, _ as TasksV1, _t as SnapshotSchema, a as CategoryTargets, at as IdSchema, b as Instance, bt as SubjectSchema, c as countTarget, ct as Namespace, d as getCollectionTarget, dt as ParserSchema, et as CrosswalkReferenceSchema, f as getTarget, ft as RESERVED_META_KEYS, g as TaskSchema, gt as Snapshot, h as Task, ht as RelativePathSchema, i as CategoryTarget, it as HttpUrlSchema, j as CatalogueIndex, k as GraphV1Schema, l as countedKeys, lt as NamespaceSchema, m as listCategories, mt as RecipeSchema, n as CategoryId, nt as Entry, o as CollectionTarget, ot as Licence, p as kindOf, pt as Recipe, q as ArchiveSchema, r as CategoryIdSchema, rt as EntrySchema, s as CountedKey, st as LicenceSchema, t as Category, tt as DocumentArchive, u as getCategory, ut as Parser, v as TasksV1Schema, vt as Source, w as GraphEdge, x as collectionOf, xt as WaybackTimestampSchema, y as Collection, yt as SourceSchema, z as Manifest } from "./categories-DepJEi4o.js";
|
|
2
|
+
import { Crosswalk } from "crossmap";
|
|
3
3
|
//#region src/errors.d.ts
|
|
4
4
|
/** The root of this package's error taxonomy: every error keepset throws is a `KeepsetError`, so callers can catch the family with one check. */
|
|
5
5
|
export declare class KeepsetError extends Error {
|
|
@@ -111,7 +111,7 @@ export declare function serialise(doc: Entry | Manifest | Crosswalk): string;
|
|
|
111
111
|
//#endregion
|
|
112
112
|
//#region src/validate.d.ts
|
|
113
113
|
/**
|
|
114
|
-
* Checks a dataset as the catalogue holds it: the entry against the entry schema, and its crosswalk against
|
|
114
|
+
* Checks a dataset as the catalogue holds it: the entry against the entry schema, and its crosswalk against crossmap's structural validation and the entry's category. A catalogue index is checked the same way when it is built, so a bundled dataset is valid unless the package itself is broken; the check is what a contributor runs on an entry they are writing.
|
|
115
115
|
* @param dataset - The dataset.
|
|
116
116
|
* @returns Every issue found, with paths from the dataset's root (`entry.` or `crosswalk.`); empty when the dataset is valid.
|
|
117
117
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { $ as ArchiveError, A as WaybackTimestampSchema, B as countedKeys, C as ParserSchema, D as SnapshotSchema, E as RelativePathSchema, F as groupsOf, G as listCategories, H as getCollectionTarget, I as namesOf, J as collectionOf, K as TaskSchema, M as toIssues, N as waybackUrl, O as SourceSchema, P as NAME_SEPARATOR, Q as JsonScalarSchema, R as CategoryIdSchema, S as NamespaceSchema, T as RecipeSchema, U as getTarget, V as getCategory, W as kindOf, X as GraphNodeSchema, Y as GraphEdgeSchema, Z as GraphV1Schema, _ as CrosswalkReferenceSchema, a as CatalogueIndexSchema, at as RecipeError, b as IdSchema, c as ManifestSchema, d as AliasSchema, et as CatalogueSyntaxError, f as ArchiveMemberSchema, g as ColumnNameSchema, h as CollectionArchiveSchema, i as listNamespaces, it as NativeParseError, j as parseEntry, k as SubjectSchema, l as SemVerSchema, m as CitationSchema, n as getManifest, nt as DatasetNotFoundError, o as createCatalogue, ot as UnknownCategoryError, p as ArchiveSchema, q as TasksV1Schema, r as listDatasets, rt as KeepsetError, s as LineageSchema, t as getDataset, tt as DatasetAmbiguousError, u as parseManifest, v as EntrySchema, w as RESERVED_META_KEYS, x as LicenceSchema, y as HttpUrlSchema, z as countTarget } from "./bundled-
|
|
2
|
-
import { validateCrosswalk } from "
|
|
1
|
+
import { $ as ArchiveError, A as WaybackTimestampSchema, B as countedKeys, C as ParserSchema, D as SnapshotSchema, E as RelativePathSchema, F as groupsOf, G as listCategories, H as getCollectionTarget, I as namesOf, J as collectionOf, K as TaskSchema, M as toIssues, N as waybackUrl, O as SourceSchema, P as NAME_SEPARATOR, Q as JsonScalarSchema, R as CategoryIdSchema, S as NamespaceSchema, T as RecipeSchema, U as getTarget, V as getCategory, W as kindOf, X as GraphNodeSchema, Y as GraphEdgeSchema, Z as GraphV1Schema, _ as CrosswalkReferenceSchema, a as CatalogueIndexSchema, at as RecipeError, b as IdSchema, c as ManifestSchema, d as AliasSchema, et as CatalogueSyntaxError, f as ArchiveMemberSchema, g as ColumnNameSchema, h as CollectionArchiveSchema, i as listNamespaces, it as NativeParseError, j as parseEntry, k as SubjectSchema, l as SemVerSchema, m as CitationSchema, n as getManifest, nt as DatasetNotFoundError, o as createCatalogue, ot as UnknownCategoryError, p as ArchiveSchema, q as TasksV1Schema, r as listDatasets, rt as KeepsetError, s as LineageSchema, t as getDataset, tt as DatasetAmbiguousError, u as parseManifest, v as EntrySchema, w as RESERVED_META_KEYS, x as LicenceSchema, y as HttpUrlSchema, z as countTarget } from "./bundled-DV_kxyz2.js";
|
|
2
|
+
import { validateCrosswalk } from "crossmap";
|
|
3
3
|
//#region src/serialise.ts
|
|
4
4
|
/**
|
|
5
5
|
* Copies a JSON value with every object's keys in ascending code-unit order, the order the house JSON lint (`json/sort-keys`) requires of committed JSON. `Object.fromEntries` defines each key as an own data property, so a key such as `__proto__` stays a key.
|
|
@@ -30,7 +30,7 @@ function serialise(doc) {
|
|
|
30
30
|
//#endregion
|
|
31
31
|
//#region src/validate.ts
|
|
32
32
|
/**
|
|
33
|
-
* Checks a dataset as the catalogue holds it: the entry against the entry schema, and its crosswalk against
|
|
33
|
+
* Checks a dataset as the catalogue holds it: the entry against the entry schema, and its crosswalk against crossmap's structural validation and the entry's category. A catalogue index is checked the same way when it is built, so a bundled dataset is valid unless the package itself is broken; the check is what a contributor runs on an entry they are writing.
|
|
34
34
|
* @param dataset - The dataset.
|
|
35
35
|
* @returns Every issue found, with paths from the dataset's root (`entry.` or `crosswalk.`); empty when the dataset is valid.
|
|
36
36
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { N as Dataset, gt as Snapshot, i as CategoryTarget, nt as Entry, o as CollectionTarget, vt as Source } from "../categories-
|
|
1
|
+
import { N as Dataset, gt as Snapshot, i as CategoryTarget, nt as Entry, o as CollectionTarget, vt as Source } from "../categories-DepJEi4o.js";
|
|
2
2
|
//#region src/node/fetch-dataset.d.ts
|
|
3
3
|
/** The network port a recipe downloads through: `downloadRaw` by default, which returns the bytes exactly as served, or a stand-in under test. */
|
|
4
4
|
export type FetchPort = (url: string, init: {
|
|
@@ -43,7 +43,7 @@ export interface FetchedDataset {
|
|
|
43
43
|
*/
|
|
44
44
|
export declare function downloadUrl(source: Source): string;
|
|
45
45
|
/**
|
|
46
|
-
* Runs a dataset's recipe: downloads the source (from its pinned snapshot when the source is dead), unpacks the archive, parses the native shape, applies the
|
|
46
|
+
* Runs a dataset's recipe: downloads the source (from its pinned snapshot when the source is dead), unpacks the archive, parses the native shape, applies the crossmap crosswalk and validates the result against the category target. The native document the crosswalk receives is the parser's output with `meta` built from the entry.
|
|
47
47
|
* @param dataset - A dataset from any catalogue.
|
|
48
48
|
* @param options - The network port, abort signal and clock.
|
|
49
49
|
* @returns The resolved target with its provenance and any count warnings.
|
|
@@ -69,7 +69,7 @@ export type RoundTripReport = {
|
|
|
69
69
|
readonly provenance: Provenance;
|
|
70
70
|
};
|
|
71
71
|
/**
|
|
72
|
-
* Checks a dataset's crosswalk on its real data: runs the recipe to the native document, then
|
|
72
|
+
* Checks a dataset's crosswalk on its real data: runs the recipe to the native document, then crossmap's `assertRoundTrip`, which encodes it, decodes the result and compares the two over every path the crosswalk promises to preserve.
|
|
73
73
|
* @param dataset - A dataset from any catalogue.
|
|
74
74
|
* @param options - The network port, abort signal and clock.
|
|
75
75
|
* @returns Whether the round trip holds, and where it first differs when it does not.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { $ as ArchiveError, H as getCollectionTarget, L as getOwn, U as getTarget, at as RecipeError, it as NativeParseError, rt as KeepsetError, t as getDataset, z as countTarget } from "../bundled-
|
|
2
|
-
import { RoundTripMismatchError, assertRoundTrip, encode } from "
|
|
1
|
+
import { $ as ArchiveError, H as getCollectionTarget, L as getOwn, U as getTarget, at as RecipeError, it as NativeParseError, rt as KeepsetError, t as getDataset, z as countTarget } from "../bundled-DV_kxyz2.js";
|
|
2
|
+
import { RoundTripMismatchError, assertRoundTrip, encode } from "crossmap";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
5
|
import { gunzipSync } from "node:zlib";
|
|
@@ -2945,7 +2945,7 @@ async function runToNative(dataset, options) {
|
|
|
2945
2945
|
};
|
|
2946
2946
|
}
|
|
2947
2947
|
/**
|
|
2948
|
-
* Runs a dataset's recipe: downloads the source (from its pinned snapshot when the source is dead), unpacks the archive, parses the native shape, applies the
|
|
2948
|
+
* Runs a dataset's recipe: downloads the source (from its pinned snapshot when the source is dead), unpacks the archive, parses the native shape, applies the crossmap crosswalk and validates the result against the category target. The native document the crosswalk receives is the parser's output with `meta` built from the entry.
|
|
2949
2949
|
* @param dataset - A dataset from any catalogue.
|
|
2950
2950
|
* @param options - The network port, abort signal and clock.
|
|
2951
2951
|
* @returns The resolved target with its provenance and any count warnings.
|
|
@@ -2990,7 +2990,7 @@ async function fetchDataset(id, options = {}) {
|
|
|
2990
2990
|
return fetchEntry(getDataset(id), options);
|
|
2991
2991
|
}
|
|
2992
2992
|
/**
|
|
2993
|
-
* Checks a dataset's crosswalk on its real data: runs the recipe to the native document, then
|
|
2993
|
+
* Checks a dataset's crosswalk on its real data: runs the recipe to the native document, then crossmap's `assertRoundTrip`, which encodes it, decodes the result and compares the two over every path the crosswalk promises to preserve.
|
|
2994
2994
|
* @param dataset - A dataset from any catalogue.
|
|
2995
2995
|
* @param options - The network port, abort signal and clock.
|
|
2996
2996
|
* @returns Whether the round trip holds, and where it first differs when it does not.
|
package/dist-cli/keepset.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import { KeepsetError, NAME_SEPARATOR, countTarget, getDataset, listDatasets, li
|
|
|
4
4
|
import { fetchDataset, roundTripDataset } from "keepset/node";
|
|
5
5
|
import { parseArgs } from "node:util";
|
|
6
6
|
//#region package.json
|
|
7
|
-
var version = "0.
|
|
7
|
+
var version = "0.30.0";
|
|
8
8
|
//#endregion
|
|
9
9
|
//#region cli/run.ts
|
|
10
10
|
/**
|
|
@@ -36,7 +36,7 @@ Commands:
|
|
|
36
36
|
to <file> (default <id>.json), with its provenance beside
|
|
37
37
|
it in <file without .json>.provenance.json
|
|
38
38
|
validate <dataset> check the entry against the entry schema and its
|
|
39
|
-
crosswalk against
|
|
39
|
+
crosswalk against crossmap's validation
|
|
40
40
|
roundtrip <dataset> fetch the dataset and check that decoding the encoded
|
|
41
41
|
native document gives it back
|
|
42
42
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "keepset",
|
|
3
3
|
"description": "Library, CLI and statically generated catalogue for dataset fetch-and-normalise recipes",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.30.0",
|
|
5
5
|
"bin": {
|
|
6
6
|
"keepset": "./dist-cli/keepset.mjs"
|
|
7
7
|
},
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
"@mantine/hooks": "9.7.2",
|
|
11
11
|
"@tanstack/react-table": "9.2.8",
|
|
12
12
|
"@vanilla-extract/css": "1.21.3",
|
|
13
|
+
"crossmap": "0.2.0",
|
|
13
14
|
"fflate": "0.8.3",
|
|
14
15
|
"react": "19.3.0",
|
|
15
16
|
"react-dom": "19.3.0",
|
|
16
|
-
"twindex": "0.1.4",
|
|
17
17
|
"zod": "4.6.6"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$defs":{"Crosswalk":{"$ref":"https://cdn.jsdelivr.net/npm/twindex@0.1.4/schemas/twindex.schema.json"},"Entry":{"additionalProperties":false,"properties":{"aliases":{"items":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*(?:\\/[A-Za-z0-9][A-Za-z0-9._-]*)*$","type":"string"},"minItems":1,"type":"array"},"category":{"enum":["graph/v1","tasks/v1"],"type":"string"},"citations":{"items":{"additionalProperties":false,"properties":{"doi":{"pattern":"^10\\.\\d{4,9}\\/\\S+$","type":"string"},"text":{"minLength":1,"type":"string"},"url":{"format":"uri","type":"string"}},"required":["text"],"type":"object"},"type":"array"},"crosswalk":{"anyOf":[{"$ref":"#/$defs/Crosswalk"},{"additionalProperties":false,"properties":{"file":{"type":"string"}},"required":["file"],"type":"object"}]},"description":{"minLength":1,"type":"string"},"domain":{"minLength":1,"type":"string"},"expectedCounts":{"additionalProperties":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"propertyNames":{"pattern":"^[A-Za-z][A-Za-z0-9]*$","type":"string"},"type":"object"},"id":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"licence":{"oneOf":[{"additionalProperties":false,"properties":{"id":{"pattern":"^[A-Za-z0-9][A-Za-z0-9.+-]*$","type":"string"},"kind":{"const":"spdx","type":"string"}},"required":["kind","id"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"custom","type":"string"},"name":{"minLength":1,"type":"string"},"url":{"format":"uri","type":"string"}},"required":["kind","name","url"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"unrecorded","type":"string"}},"required":["kind"],"type":"object"}]},"name":{"minLength":1,"type":"string"},"namespace":{"items":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"minItems":1,"type":"array"},"properties":{"additionalProperties":{"type":["string","number","boolean","null"]},"propertyNames":{"pattern":"^[A-Za-z][A-Za-z0-9]*$","type":"string"},"type":"object"},"recipe":{"oneOf":[{"additionalProperties":false,"properties":{"archive":{"anyOf":[{"additionalProperties":false,"properties":{"kind":{"const":"none","type":"string"}},"required":["kind"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"gzip","type":"string"}},"required":["kind"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"enum":["zip","tar","tar.gz"],"type":"string"},"member":{"anyOf":[{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"},{"additionalProperties":false,"properties":{"extensions":{"items":{"pattern":"^\\.[A-Za-z0-9][A-Za-z0-9.]*$","type":"string"},"minItems":1,"type":"array"}},"required":["extensions"],"type":"object"},{"additionalProperties":false,"properties":{"pattern":{"minLength":1,"type":"string"}},"required":["pattern"],"type":"object"}]}},"required":["kind","member"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"enum":["zip","tar","tar.gz"],"type":"string"},"members":{"anyOf":[{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"},{"additionalProperties":false,"properties":{"extensions":{"items":{"pattern":"^\\.[A-Za-z0-9][A-Za-z0-9.]*$","type":"string"},"minItems":1,"type":"array"}},"required":["extensions"],"type":"object"},{"additionalProperties":false,"properties":{"pattern":{"minLength":1,"type":"string"}},"required":["pattern"],"type":"object"}]}},"required":["kind","members"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"xlsx","type":"string"},"sheet":{"minLength":1,"type":"string"}},"required":["kind","sheet"],"type":"object"}]},"paging":{"oneOf":[{"additionalProperties":false,"properties":{"kind":{"const":"arcgis-query","type":"string"},"orderBy":{"pattern":"^[A-Za-z_][A-Za-z0-9_]*$","type":"string"}},"required":["kind","orderBy"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"socrata-resource","type":"string"},"pageSize":{"maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["kind","pageSize"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"ckan-datastore","type":"string"},"pageSize":{"maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["kind","pageSize"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"openfema","type":"string"},"pageSize":{"maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["kind","pageSize"],"type":"object"}]},"parser":{"oneOf":[{"additionalProperties":false,"properties":{"commentPrefixes":{"items":{"minLength":1,"type":"string"},"type":"array"},"delimiter":{"enum":["detect","whitespace","tab","comma","space"],"type":"string"},"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"edge-list","type":"string"},"skipLines":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"sourceColumn":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"targetColumn":{"maximum":9007199254740991,"minimum":0,"type":"integer"}},"required":["format","encoding","delimiter","skipLines","commentPrefixes","sourceColumn","targetColumn"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"matrix-market","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"gml","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"pajek","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"customer-points","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"solomon","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"top","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"toptw","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"tsplib","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"const":"utf-8","type":"string"},"format":{"const":"verolog-2019","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"const":"utf-8","type":"string"},"format":{"const":"vrp-rep","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"type":"array"},"delimiter":{"enum":["comma","tab","semicolon"],"type":"string"},"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"csv-table","type":"string"},"idColumn":{"anyOf":[{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},{"type":"null"}]},"nullValues":{"items":{"minLength":1,"type":"string"},"type":"array"},"numericColumns":{"items":{"additionalProperties":false,"properties":{"column":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"factor":{"exclusiveMinimum":0,"type":"number"}},"required":["column","factor"],"type":"object"},"type":"array"},"skipLines":{"maximum":9007199254740991,"minimum":0,"type":"integer"}},"required":["format","encoding","delimiter","skipLines","idColumn","numericColumns"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"minItems":1,"type":"array"},"dateColumns":{"items":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"type":"array"},"encoding":{"const":"utf-8","type":"string"},"format":{"const":"geojson","type":"string"},"idColumn":{"anyOf":[{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},{"type":"null"}]},"numericColumns":{"items":{"additionalProperties":false,"properties":{"column":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"factor":{"exclusiveMinimum":0,"type":"number"}},"required":["column","factor"],"type":"object"},"type":"array"}},"required":["format","encoding","idColumn","numericColumns","dateColumns","columns"],"type":"object"}]},"source":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"status":{"const":"fetchable","type":"string"}},"required":["status","source","archive","parser"],"type":"object"},{"additionalProperties":false,"properties":{"reason":{"minLength":1,"type":"string"},"status":{"const":"not-fetchable","type":"string"}},"required":["status","reason"],"type":"object"}]},"sources":{"items":{"additionalProperties":false,"properties":{"retrieved":{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","type":"string"},"snapshot":{"additionalProperties":false,"properties":{"timestamp":{"pattern":"^\\d{8}(?:\\d{6})?$","type":"string"},"url":{"format":"uri","type":"string"}},"required":["url","timestamp"],"type":"object"},"status":{"enum":["live","dead"],"type":"string"},"url":{"format":"uri","type":"string"}},"required":["url","retrieved","status"],"type":"object"},"minItems":1,"type":"array"},"subjects":{"items":{"pattern":"^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$","type":"string"},"minItems":1,"type":"array"},"tags":{"items":{"minLength":1,"type":"string"},"type":"array"}},"required":["id","name","tags","category","sources","licence","citations","recipe","crosswalk","expectedCounts","properties"],"type":"object"}},"$id":"https://cdn.jsdelivr.net/npm/keepset@0.29.2/schemas/entry.schema.json","$ref":"#/$defs/Entry","$schema":"https://json-schema.org/draft/2020-12/schema"}
|
|
1
|
+
{"$defs":{"Crosswalk":{"$ref":"https://cdn.jsdelivr.net/npm/crossmap@0.2.0/schemas/crossmap.schema.json"},"Entry":{"additionalProperties":false,"properties":{"aliases":{"items":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*(?:\\/[A-Za-z0-9][A-Za-z0-9._-]*)*$","type":"string"},"minItems":1,"type":"array"},"category":{"enum":["graph/v1","tasks/v1"],"type":"string"},"citations":{"items":{"additionalProperties":false,"properties":{"doi":{"pattern":"^10\\.\\d{4,9}\\/\\S+$","type":"string"},"text":{"minLength":1,"type":"string"},"url":{"format":"uri","type":"string"}},"required":["text"],"type":"object"},"type":"array"},"crosswalk":{"anyOf":[{"$ref":"#/$defs/Crosswalk"},{"additionalProperties":false,"properties":{"file":{"type":"string"}},"required":["file"],"type":"object"}]},"description":{"minLength":1,"type":"string"},"domain":{"minLength":1,"type":"string"},"expectedCounts":{"additionalProperties":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"propertyNames":{"pattern":"^[A-Za-z][A-Za-z0-9]*$","type":"string"},"type":"object"},"id":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"licence":{"oneOf":[{"additionalProperties":false,"properties":{"id":{"pattern":"^[A-Za-z0-9][A-Za-z0-9.+-]*$","type":"string"},"kind":{"const":"spdx","type":"string"}},"required":["kind","id"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"custom","type":"string"},"name":{"minLength":1,"type":"string"},"url":{"format":"uri","type":"string"}},"required":["kind","name","url"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"unrecorded","type":"string"}},"required":["kind"],"type":"object"}]},"name":{"minLength":1,"type":"string"},"namespace":{"items":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"minItems":1,"type":"array"},"properties":{"additionalProperties":{"type":["string","number","boolean","null"]},"propertyNames":{"pattern":"^[A-Za-z][A-Za-z0-9]*$","type":"string"},"type":"object"},"recipe":{"oneOf":[{"additionalProperties":false,"properties":{"archive":{"anyOf":[{"additionalProperties":false,"properties":{"kind":{"const":"none","type":"string"}},"required":["kind"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"gzip","type":"string"}},"required":["kind"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"enum":["zip","tar","tar.gz"],"type":"string"},"member":{"anyOf":[{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"},{"additionalProperties":false,"properties":{"extensions":{"items":{"pattern":"^\\.[A-Za-z0-9][A-Za-z0-9.]*$","type":"string"},"minItems":1,"type":"array"}},"required":["extensions"],"type":"object"},{"additionalProperties":false,"properties":{"pattern":{"minLength":1,"type":"string"}},"required":["pattern"],"type":"object"}]}},"required":["kind","member"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"enum":["zip","tar","tar.gz"],"type":"string"},"members":{"anyOf":[{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"},{"additionalProperties":false,"properties":{"extensions":{"items":{"pattern":"^\\.[A-Za-z0-9][A-Za-z0-9.]*$","type":"string"},"minItems":1,"type":"array"}},"required":["extensions"],"type":"object"},{"additionalProperties":false,"properties":{"pattern":{"minLength":1,"type":"string"}},"required":["pattern"],"type":"object"}]}},"required":["kind","members"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"xlsx","type":"string"},"sheet":{"minLength":1,"type":"string"}},"required":["kind","sheet"],"type":"object"}]},"paging":{"oneOf":[{"additionalProperties":false,"properties":{"kind":{"const":"arcgis-query","type":"string"},"orderBy":{"pattern":"^[A-Za-z_][A-Za-z0-9_]*$","type":"string"}},"required":["kind","orderBy"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"socrata-resource","type":"string"},"pageSize":{"maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["kind","pageSize"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"ckan-datastore","type":"string"},"pageSize":{"maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["kind","pageSize"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"openfema","type":"string"},"pageSize":{"maximum":9007199254740991,"minimum":1,"type":"integer"}},"required":["kind","pageSize"],"type":"object"}]},"parser":{"oneOf":[{"additionalProperties":false,"properties":{"commentPrefixes":{"items":{"minLength":1,"type":"string"},"type":"array"},"delimiter":{"enum":["detect","whitespace","tab","comma","space"],"type":"string"},"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"edge-list","type":"string"},"skipLines":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"sourceColumn":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"targetColumn":{"maximum":9007199254740991,"minimum":0,"type":"integer"}},"required":["format","encoding","delimiter","skipLines","commentPrefixes","sourceColumn","targetColumn"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"matrix-market","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"gml","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"pajek","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"customer-points","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"solomon","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"top","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"toptw","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"tsplib","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"const":"utf-8","type":"string"},"format":{"const":"verolog-2019","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"encoding":{"const":"utf-8","type":"string"},"format":{"const":"vrp-rep","type":"string"}},"required":["format","encoding"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"type":"array"},"delimiter":{"enum":["comma","tab","semicolon"],"type":"string"},"encoding":{"enum":["utf-8","latin1"],"type":"string"},"format":{"const":"csv-table","type":"string"},"idColumn":{"anyOf":[{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},{"type":"null"}]},"nullValues":{"items":{"minLength":1,"type":"string"},"type":"array"},"numericColumns":{"items":{"additionalProperties":false,"properties":{"column":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"factor":{"exclusiveMinimum":0,"type":"number"}},"required":["column","factor"],"type":"object"},"type":"array"},"skipLines":{"maximum":9007199254740991,"minimum":0,"type":"integer"}},"required":["format","encoding","delimiter","skipLines","idColumn","numericColumns"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"minItems":1,"type":"array"},"dateColumns":{"items":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"type":"array"},"encoding":{"const":"utf-8","type":"string"},"format":{"const":"geojson","type":"string"},"idColumn":{"anyOf":[{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},{"type":"null"}]},"numericColumns":{"items":{"additionalProperties":false,"properties":{"column":{"pattern":"^[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?$","type":"string"},"factor":{"exclusiveMinimum":0,"type":"number"}},"required":["column","factor"],"type":"object"},"type":"array"}},"required":["format","encoding","idColumn","numericColumns","dateColumns","columns"],"type":"object"}]},"source":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"status":{"const":"fetchable","type":"string"}},"required":["status","source","archive","parser"],"type":"object"},{"additionalProperties":false,"properties":{"reason":{"minLength":1,"type":"string"},"status":{"const":"not-fetchable","type":"string"}},"required":["status","reason"],"type":"object"}]},"sources":{"items":{"additionalProperties":false,"properties":{"retrieved":{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","type":"string"},"snapshot":{"additionalProperties":false,"properties":{"timestamp":{"pattern":"^\\d{8}(?:\\d{6})?$","type":"string"},"url":{"format":"uri","type":"string"}},"required":["url","timestamp"],"type":"object"},"status":{"enum":["live","dead"],"type":"string"},"url":{"format":"uri","type":"string"}},"required":["url","retrieved","status"],"type":"object"},"minItems":1,"type":"array"},"subjects":{"items":{"pattern":"^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$","type":"string"},"minItems":1,"type":"array"},"tags":{"items":{"minLength":1,"type":"string"},"type":"array"}},"required":["id","name","tags","category","sources","licence","citations","recipe","crosswalk","expectedCounts","properties"],"type":"object"}},"$id":"https://cdn.jsdelivr.net/npm/keepset@0.30.0/schemas/entry.schema.json","$ref":"#/$defs/Entry","$schema":"https://json-schema.org/draft/2020-12/schema"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$defs":{"Manifest":{"additionalProperties":false,"properties":{"description":{"minLength":1,"type":"string"},"id":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"lineage":{"additionalProperties":false,"properties":{"catalogue":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"repository":{"format":"uri","type":"string"},"version":{"pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","type":"string"}},"required":["catalogue","version","repository"],"type":"object"},"name":{"minLength":1,"type":"string"},"namespaceAliases":{"additionalProperties":{"items":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"minItems":1,"type":"array"},"propertyNames":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"type":"object"},"repository":{"format":"uri","type":"string"},"version":{"pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","type":"string"}},"required":["id","name","description","version","repository"],"type":"object"}},"$id":"https://cdn.jsdelivr.net/npm/keepset@0.
|
|
1
|
+
{"$defs":{"Manifest":{"additionalProperties":false,"properties":{"description":{"minLength":1,"type":"string"},"id":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"lineage":{"additionalProperties":false,"properties":{"catalogue":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"repository":{"format":"uri","type":"string"},"version":{"pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","type":"string"}},"required":["catalogue","version","repository"],"type":"object"},"name":{"minLength":1,"type":"string"},"namespaceAliases":{"additionalProperties":{"items":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"minItems":1,"type":"array"},"propertyNames":{"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"type":"object"},"repository":{"format":"uri","type":"string"},"version":{"pattern":"^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","type":"string"}},"required":["id","name","description","version","repository"],"type":"object"}},"$id":"https://cdn.jsdelivr.net/npm/keepset@0.30.0/schemas/manifest.schema.json","$ref":"#/$defs/Manifest","$schema":"https://json-schema.org/draft/2020-12/schema"}
|