@mailwoman/corpus 10.6.0 → 10.7.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.
Files changed (223) hide show
  1. package/data/PROVENANCE.md +24 -0
  2. package/data/address-source-register.json +18948 -8757
  3. package/data/corpus-source-inputs.json +4756 -0
  4. package/data/license-decisions.json +7260 -0
  5. package/data/licenses/whosonfirst-licenses.md +3 -2
  6. package/data/reviewed-ve-postcode-tuples.json +5 -72
  7. package/data/source-additions.json +2450 -0
  8. package/data/source-resolutions.json +87 -0
  9. package/data/training-manifests/v0.7.10-gb-county.effective.json +2335 -0
  10. package/data/training-manifests/v0.7.10-gb-county.json +1132 -0
  11. package/data/training-manifests/v0.7.2-address-systems.effective.json +3 -2
  12. package/data/training-manifests/v0.7.7-no-ppd.json +550 -0
  13. package/data/training-manifests/v0.7.8-rights-clean.json +538 -0
  14. package/data/training-manifests/v0.7.9-country-gap.json +1132 -0
  15. package/data/us-situs-sources.json +128 -0
  16. package/lib/adapters/cordis/adapter.ts +1 -1
  17. package/lib/adapters/libpostal-dictionary.ts +23 -3
  18. package/lib/adapters/osm/adapter.ts +42 -11
  19. package/lib/adapters.ts +14 -0
  20. package/lib/az/adapters/opendata/adapter.ts +389 -0
  21. package/lib/bs/adapters/gbpa/adapter.ts +248 -0
  22. package/lib/build/types.ts +16 -0
  23. package/lib/build.ts +21 -0
  24. package/lib/ee/adapters/ads/adapter.ts +18 -0
  25. package/lib/fo/adapters/adressur/adapter.ts +242 -0
  26. package/lib/gb/adapters/os-open/adapter.ts +12 -0
  27. package/lib/gb/county.ts +59 -0
  28. package/lib/gb/os-open/open/names.ts +41 -0
  29. package/lib/gu/adapters/bsp/adapter.ts +434 -0
  30. package/lib/im/adapters/land-registry/adapter.ts +340 -0
  31. package/lib/international/recipes/locale.ts +164 -19
  32. package/lib/li/adapters/llv/adapter.ts +246 -0
  33. package/lib/recipes/bare/postcode.ts +10 -34
  34. package/lib/recipes/country-balanced.ts +95 -78
  35. package/lib/recipes/intersection.ts +22 -30
  36. package/lib/recipes/po/box/cedex/recipe.ts +8 -5
  37. package/lib/recipes/po/box/cedex/sources.ts +2 -23
  38. package/lib/recipes/scaffold.ts +28 -3
  39. package/lib/recipes/sources.ts +112 -1
  40. package/lib/recipes/street/affix.ts +17 -29
  41. package/lib/recipes/sub/venue/context.ts +33 -9
  42. package/lib/recipes/sub/venue/sources.ts +54 -13
  43. package/lib/recipes/sub/venue.ts +68 -23
  44. package/lib/recipes/unit.ts +20 -7
  45. package/lib/registers.ts +33 -0
  46. package/lib/source-register/corpus-inputs.ts +528 -0
  47. package/lib/source-register/effective-manifest.ts +37 -5
  48. package/lib/source-register/types.ts +20 -0
  49. package/lib/south-asia/recipes/register.ts +1 -1
  50. package/lib/tools/overlay/manifest.ts +109 -1
  51. package/lib/tools/source-register/build.ts +47 -1
  52. package/lib/tools/variety-sample.ts +633 -0
  53. package/lib/us/adapters/usgov/nad/adapter.ts +39 -10
  54. package/lib/us/recipes/skeleton-sources.ts +156 -0
  55. package/lib/us/tools/nad-skeletons.ts +395 -0
  56. package/lib/uy/adapters/ide/adapter.ts +275 -0
  57. package/lib/ve/recipes/reviewed-postcode-tail.ts +29 -6
  58. package/out/adapters/cordis/adapter.d.ts +1 -1
  59. package/out/adapters/cordis/adapter.js +1 -1
  60. package/out/adapters/libpostal-dictionary.d.ts +9 -0
  61. package/out/adapters/libpostal-dictionary.d.ts.map +1 -1
  62. package/out/adapters/libpostal-dictionary.js +19 -3
  63. package/out/adapters/libpostal-dictionary.js.map +1 -1
  64. package/out/adapters/osm/adapter.d.ts +12 -1
  65. package/out/adapters/osm/adapter.d.ts.map +1 -1
  66. package/out/adapters/osm/adapter.js +30 -13
  67. package/out/adapters/osm/adapter.js.map +1 -1
  68. package/out/adapters.d.ts.map +1 -1
  69. package/out/adapters.js +14 -0
  70. package/out/adapters.js.map +1 -1
  71. package/out/az/adapters/opendata/adapter.d.ts +88 -0
  72. package/out/az/adapters/opendata/adapter.d.ts.map +1 -0
  73. package/out/az/adapters/opendata/adapter.js +282 -0
  74. package/out/az/adapters/opendata/adapter.js.map +1 -0
  75. package/out/bs/adapters/gbpa/adapter.d.ts +64 -0
  76. package/out/bs/adapters/gbpa/adapter.d.ts.map +1 -0
  77. package/out/bs/adapters/gbpa/adapter.js +187 -0
  78. package/out/bs/adapters/gbpa/adapter.js.map +1 -0
  79. package/out/build/types.d.ts +15 -0
  80. package/out/build/types.d.ts.map +1 -1
  81. package/out/build/types.js.map +1 -1
  82. package/out/build.d.ts.map +1 -1
  83. package/out/build.js +17 -0
  84. package/out/build.js.map +1 -1
  85. package/out/ee/adapters/ads/adapter.d.ts +6 -0
  86. package/out/ee/adapters/ads/adapter.d.ts.map +1 -1
  87. package/out/ee/adapters/ads/adapter.js +16 -0
  88. package/out/ee/adapters/ads/adapter.js.map +1 -1
  89. package/out/fo/adapters/adressur/adapter.d.ts +63 -0
  90. package/out/fo/adapters/adressur/adapter.d.ts.map +1 -0
  91. package/out/fo/adapters/adressur/adapter.js +177 -0
  92. package/out/fo/adapters/adressur/adapter.js.map +1 -0
  93. package/out/gb/adapters/os-open/adapter.d.ts +8 -0
  94. package/out/gb/adapters/os-open/adapter.d.ts.map +1 -1
  95. package/out/gb/adapters/os-open/adapter.js +11 -0
  96. package/out/gb/adapters/os-open/adapter.js.map +1 -1
  97. package/out/gb/county.d.ts +30 -0
  98. package/out/gb/county.d.ts.map +1 -0
  99. package/out/gb/county.js +51 -0
  100. package/out/gb/county.js.map +1 -0
  101. package/out/gb/os-open/open/names.d.ts +17 -0
  102. package/out/gb/os-open/open/names.d.ts.map +1 -1
  103. package/out/gb/os-open/open/names.js +19 -0
  104. package/out/gb/os-open/open/names.js.map +1 -1
  105. package/out/gu/adapters/bsp/adapter.d.ts +83 -0
  106. package/out/gu/adapters/bsp/adapter.d.ts.map +1 -0
  107. package/out/gu/adapters/bsp/adapter.js +346 -0
  108. package/out/gu/adapters/bsp/adapter.js.map +1 -0
  109. package/out/im/adapters/land-registry/adapter.d.ts +68 -0
  110. package/out/im/adapters/land-registry/adapter.d.ts.map +1 -0
  111. package/out/im/adapters/land-registry/adapter.js +261 -0
  112. package/out/im/adapters/land-registry/adapter.js.map +1 -0
  113. package/out/international/recipes/locale.d.ts +24 -4
  114. package/out/international/recipes/locale.d.ts.map +1 -1
  115. package/out/international/recipes/locale.js +107 -15
  116. package/out/international/recipes/locale.js.map +1 -1
  117. package/out/li/adapters/llv/adapter.d.ts +69 -0
  118. package/out/li/adapters/llv/adapter.d.ts.map +1 -0
  119. package/out/li/adapters/llv/adapter.js +181 -0
  120. package/out/li/adapters/llv/adapter.js.map +1 -0
  121. package/out/recipes/bare/postcode.d.ts.map +1 -1
  122. package/out/recipes/bare/postcode.js +9 -30
  123. package/out/recipes/bare/postcode.js.map +1 -1
  124. package/out/recipes/country-balanced.d.ts.map +1 -1
  125. package/out/recipes/country-balanced.js +82 -73
  126. package/out/recipes/country-balanced.js.map +1 -1
  127. package/out/recipes/intersection.d.ts +3 -2
  128. package/out/recipes/intersection.d.ts.map +1 -1
  129. package/out/recipes/intersection.js +20 -26
  130. package/out/recipes/intersection.js.map +1 -1
  131. package/out/recipes/po/box/cedex/recipe.d.ts.map +1 -1
  132. package/out/recipes/po/box/cedex/recipe.js +5 -4
  133. package/out/recipes/po/box/cedex/recipe.js.map +1 -1
  134. package/out/recipes/po/box/cedex/sources.d.ts +2 -45
  135. package/out/recipes/po/box/cedex/sources.d.ts.map +1 -1
  136. package/out/recipes/po/box/cedex/sources.js +0 -20
  137. package/out/recipes/po/box/cedex/sources.js.map +1 -1
  138. package/out/recipes/scaffold.d.ts +15 -2
  139. package/out/recipes/scaffold.d.ts.map +1 -1
  140. package/out/recipes/scaffold.js +21 -1
  141. package/out/recipes/scaffold.js.map +1 -1
  142. package/out/recipes/sources.d.ts.map +1 -1
  143. package/out/recipes/sources.js +112 -1
  144. package/out/recipes/sources.js.map +1 -1
  145. package/out/recipes/street/affix.d.ts.map +1 -1
  146. package/out/recipes/street/affix.js +8 -20
  147. package/out/recipes/street/affix.js.map +1 -1
  148. package/out/recipes/sub/venue/context.d.ts +14 -3
  149. package/out/recipes/sub/venue/context.d.ts.map +1 -1
  150. package/out/recipes/sub/venue/context.js +29 -9
  151. package/out/recipes/sub/venue/context.js.map +1 -1
  152. package/out/recipes/sub/venue/sources.d.ts +41 -8
  153. package/out/recipes/sub/venue/sources.d.ts.map +1 -1
  154. package/out/recipes/sub/venue/sources.js +26 -7
  155. package/out/recipes/sub/venue/sources.js.map +1 -1
  156. package/out/recipes/sub/venue.d.ts.map +1 -1
  157. package/out/recipes/sub/venue.js +35 -14
  158. package/out/recipes/sub/venue.js.map +1 -1
  159. package/out/recipes/unit.d.ts +4 -0
  160. package/out/recipes/unit.d.ts.map +1 -1
  161. package/out/recipes/unit.js +7 -6
  162. package/out/recipes/unit.js.map +1 -1
  163. package/out/registers.d.ts +33 -0
  164. package/out/registers.d.ts.map +1 -1
  165. package/out/registers.js +33 -0
  166. package/out/registers.js.map +1 -1
  167. package/out/source-register/corpus-inputs.d.ts +240 -0
  168. package/out/source-register/corpus-inputs.d.ts.map +1 -0
  169. package/out/source-register/corpus-inputs.js +275 -0
  170. package/out/source-register/corpus-inputs.js.map +1 -0
  171. package/out/source-register/effective-manifest.d.ts +2 -0
  172. package/out/source-register/effective-manifest.d.ts.map +1 -1
  173. package/out/source-register/effective-manifest.js +33 -4
  174. package/out/source-register/effective-manifest.js.map +1 -1
  175. package/out/source-register/types.d.ts +21 -1
  176. package/out/source-register/types.d.ts.map +1 -1
  177. package/out/source-register/types.js +20 -0
  178. package/out/source-register/types.js.map +1 -1
  179. package/out/south-asia/recipes/register.js +1 -1
  180. package/out/south-asia/recipes/register.js.map +1 -1
  181. package/out/tools/overlay/manifest.d.ts +7 -0
  182. package/out/tools/overlay/manifest.d.ts.map +1 -1
  183. package/out/tools/overlay/manifest.js +72 -1
  184. package/out/tools/overlay/manifest.js.map +1 -1
  185. package/out/tools/source-register/build.d.ts +9 -0
  186. package/out/tools/source-register/build.d.ts.map +1 -1
  187. package/out/tools/source-register/build.js +25 -3
  188. package/out/tools/source-register/build.js.map +1 -1
  189. package/out/tools/variety-sample.d.ts +196 -0
  190. package/out/tools/variety-sample.d.ts.map +1 -0
  191. package/out/tools/variety-sample.js +417 -0
  192. package/out/tools/variety-sample.js.map +1 -0
  193. package/out/us/adapters/usgov/nad/adapter.d.ts +80 -0
  194. package/out/us/adapters/usgov/nad/adapter.d.ts.map +1 -1
  195. package/out/us/adapters/usgov/nad/adapter.js +27 -8
  196. package/out/us/adapters/usgov/nad/adapter.js.map +1 -1
  197. package/out/us/recipes/skeleton-sources.d.ts +92 -0
  198. package/out/us/recipes/skeleton-sources.d.ts.map +1 -0
  199. package/out/us/recipes/skeleton-sources.js +121 -0
  200. package/out/us/recipes/skeleton-sources.js.map +1 -0
  201. package/out/us/tools/nad-skeletons.d.ts +120 -0
  202. package/out/us/tools/nad-skeletons.d.ts.map +1 -0
  203. package/out/us/tools/nad-skeletons.js +262 -0
  204. package/out/us/tools/nad-skeletons.js.map +1 -0
  205. package/out/uy/adapters/ide/adapter.d.ts +64 -0
  206. package/out/uy/adapters/ide/adapter.d.ts.map +1 -0
  207. package/out/uy/adapters/ide/adapter.js +206 -0
  208. package/out/uy/adapters/ide/adapter.js.map +1 -0
  209. package/out/ve/recipes/reviewed-postcode-tail.d.ts +6 -2
  210. package/out/ve/recipes/reviewed-postcode-tail.d.ts.map +1 -1
  211. package/out/ve/recipes/reviewed-postcode-tail.js +16 -5
  212. package/out/ve/recipes/reviewed-postcode-tail.js.map +1 -1
  213. package/package.json +14 -14
  214. package/lib/recipes/unit/sources.ts +0 -44
  215. package/lib/tools/fetch/ppd.ts +0 -121
  216. package/out/recipes/unit/sources.d.ts +0 -28
  217. package/out/recipes/unit/sources.d.ts.map +0 -1
  218. package/out/recipes/unit/sources.js +0 -30
  219. package/out/recipes/unit/sources.js.map +0 -1
  220. package/out/tools/fetch/ppd.d.ts +0 -15
  221. package/out/tools/fetch/ppd.d.ts.map +0 -1
  222. package/out/tools/fetch/ppd.js +0 -86
  223. package/out/tools/fetch/ppd.js.map +0 -1
@@ -0,0 +1,128 @@
1
+ {
2
+ "$comment": "Maps each `source` value of the US situs databases (address-points-us-*.db under the data root) to the register rows its data comes from. The house-venue tuple reader in corpus-python/src/mailwoman_train/countries/us/tuples.py keeps a row only when every register row its value maps to holds an elected decision permitting transform and train. `overture:OpenAddresses/<state>/<body>` values map to that body's own row, because OpenAddresses does not relicense what it collects. A value with no entry, such as the bare `openaddresses` of the Hawaii database, which names no body, is not admitted.",
3
+ "sources": {
4
+ "overture:NAD": ["us-property-building-1", "us-geodata-aggregate-1"],
5
+ "overture:OpenAddresses/CA/Alameda County": ["us-property-building-27", "us-geodata-aggregate-1"],
6
+ "overture:OpenAddresses/CA/Alpine County": ["us-property-building-126", "us-geodata-aggregate-1"],
7
+ "overture:OpenAddresses/CA/Amador County": ["us-property-building-112", "us-geodata-aggregate-1"],
8
+ "overture:OpenAddresses/CA/Butte County": ["us-property-building-71", "us-geodata-aggregate-1"],
9
+ "overture:OpenAddresses/CA/Calaveras County": ["us-property-building-101", "us-geodata-aggregate-1"],
10
+ "overture:OpenAddresses/CA/Colusa County": ["us-property-building-122", "us-geodata-aggregate-1"],
11
+ "overture:OpenAddresses/CA/Contra Costa County": ["us-property-building-35", "us-geodata-aggregate-1"],
12
+ "overture:OpenAddresses/CA/County of Los Angeles": ["us-property-building-10", "us-geodata-aggregate-1"],
13
+ "overture:OpenAddresses/CA/Del Norte County": ["us-property-building-118", "us-geodata-aggregate-1"],
14
+ "overture:OpenAddresses/CA/El Dorado County": ["us-property-building-78", "us-geodata-aggregate-1"],
15
+ "overture:OpenAddresses/CA/Fresno County": ["us-property-building-37", "us-geodata-aggregate-1"],
16
+ "overture:OpenAddresses/CA/Glenn County": ["us-property-building-121", "us-geodata-aggregate-1"],
17
+ "overture:OpenAddresses/CA/Humboldt County": ["us-property-building-97", "us-geodata-aggregate-1"],
18
+ "overture:OpenAddresses/CA/Imperial County": ["us-property-building-90", "us-geodata-aggregate-1"],
19
+ "overture:OpenAddresses/CA/Inyo County": ["us-property-building-119", "us-geodata-aggregate-1"],
20
+ "overture:OpenAddresses/CA/Kern County": ["us-property-building-46", "us-geodata-aggregate-1"],
21
+ "overture:OpenAddresses/CA/Kings County": ["us-property-building-98", "us-geodata-aggregate-1"],
22
+ "overture:OpenAddresses/CA/Lake County": ["us-property-building-93", "us-geodata-aggregate-1"],
23
+ "overture:OpenAddresses/CA/Lassen County": ["us-property-building-124", "us-geodata-aggregate-1"],
24
+ "overture:OpenAddresses/CA/Madera County": ["us-property-building-95", "us-geodata-aggregate-1"],
25
+ "overture:OpenAddresses/CA/Marin County": ["us-property-building-3", "us-geodata-aggregate-1"],
26
+ "overture:OpenAddresses/CA/Mariposa County": ["us-property-building-120", "us-geodata-aggregate-1"],
27
+ "overture:OpenAddresses/CA/Mendocino County": ["us-property-building-99", "us-geodata-aggregate-1"],
28
+ "overture:OpenAddresses/CA/Merced County": ["us-property-building-76", "us-geodata-aggregate-1"],
29
+ "overture:OpenAddresses/CA/Modoc County": ["us-property-building-123", "us-geodata-aggregate-1"],
30
+ "overture:OpenAddresses/CA/Mono County": ["us-property-building-113", "us-geodata-aggregate-1"],
31
+ "overture:OpenAddresses/CA/Monterey County": ["us-property-building-67", "us-geodata-aggregate-1"],
32
+ "overture:OpenAddresses/CA/Napa County": ["us-property-building-91", "us-geodata-aggregate-1"],
33
+ "overture:OpenAddresses/CA/Nevada County": ["us-property-building-92", "us-geodata-aggregate-1"],
34
+ "overture:OpenAddresses/CA/Orange County": ["us-property-building-15", "us-geodata-aggregate-1"],
35
+ "overture:OpenAddresses/CA/Placer County": ["us-property-building-54", "us-geodata-aggregate-1"],
36
+ "overture:OpenAddresses/CA/Plumas County": ["us-property-building-109", "us-geodata-aggregate-1"],
37
+ "overture:OpenAddresses/CA/Riverside County": ["us-property-building-20", "us-geodata-aggregate-1"],
38
+ "overture:OpenAddresses/CA/Sacramento County": ["us-property-building-25", "us-geodata-aggregate-1"],
39
+ "overture:OpenAddresses/CA/San Benito County": ["us-property-building-110", "us-geodata-aggregate-1"],
40
+ "overture:OpenAddresses/CA/San Bernardino County": ["us-property-building-19", "us-geodata-aggregate-1"],
41
+ "overture:OpenAddresses/CA/San Diego County": ["us-property-building-17", "us-geodata-aggregate-1"],
42
+ "overture:OpenAddresses/CA/San Francisco County": ["us-property-building-36", "us-geodata-aggregate-1"],
43
+ "overture:OpenAddresses/CA/San Joaquin County": ["us-property-building-48", "us-geodata-aggregate-1"],
44
+ "overture:OpenAddresses/CA/San Luis Obispo County": ["us-property-building-66", "us-geodata-aggregate-1"],
45
+ "overture:OpenAddresses/CA/San Mateo County": ["us-property-building-49", "us-geodata-aggregate-1"],
46
+ "overture:OpenAddresses/CA/Santa Barbara County": ["us-property-building-61", "us-geodata-aggregate-1"],
47
+ "overture:OpenAddresses/CA/Santa Clara County": ["us-property-building-30", "us-geodata-aggregate-1"],
48
+ "overture:OpenAddresses/CA/Santa Cruz County": ["us-property-building-75", "us-geodata-aggregate-1"],
49
+ "overture:OpenAddresses/CA/Shasta County": ["us-property-building-86", "us-geodata-aggregate-1"],
50
+ "overture:OpenAddresses/CA/Sierra County": ["us-property-building-125", "us-geodata-aggregate-1"],
51
+ "overture:OpenAddresses/CA/Siskiyou County": ["us-property-building-111", "us-geodata-aggregate-1"],
52
+ "overture:OpenAddresses/CA/Solano County": ["us-property-building-58", "us-geodata-aggregate-1"],
53
+ "overture:OpenAddresses/CA/Sonoma County": ["us-property-building-50", "us-geodata-aggregate-1"],
54
+ "overture:OpenAddresses/CA/Stanislaus County": ["us-property-building-59", "us-geodata-aggregate-1"],
55
+ "overture:OpenAddresses/CA/Sutter County": ["us-property-building-100", "us-geodata-aggregate-1"],
56
+ "overture:OpenAddresses/CA/Tehama County": ["us-property-building-106", "us-geodata-aggregate-1"],
57
+ "overture:OpenAddresses/CA/Trinity County": ["us-property-building-117", "us-geodata-aggregate-1"],
58
+ "overture:OpenAddresses/CA/Tulare County": ["us-property-building-60", "us-geodata-aggregate-1"],
59
+ "overture:OpenAddresses/CA/Tuolumne County": ["us-property-building-105", "us-geodata-aggregate-1"],
60
+ "overture:OpenAddresses/CA/Yolo County": ["us-property-building-77", "us-geodata-aggregate-1"],
61
+ "overture:OpenAddresses/CA/Yuba County": ["us-property-building-103", "us-geodata-aggregate-1"],
62
+ "overture:OpenAddresses/CO/Governor's Office of Information Technology": [
63
+ "us-property-building-11",
64
+ "us-geodata-aggregate-1"
65
+ ],
66
+ "overture:OpenAddresses/FL/Alachua County": ["us-property-building-62", "us-geodata-aggregate-1"],
67
+ "overture:OpenAddresses/FL/Baker County": ["us-property-building-116", "us-geodata-aggregate-1"],
68
+ "overture:OpenAddresses/FL/Bay County": ["us-property-building-65", "us-geodata-aggregate-1"],
69
+ "overture:OpenAddresses/FL/Brevard County": ["us-property-building-40", "us-geodata-aggregate-1"],
70
+ "overture:OpenAddresses/FL/Broward County": ["us-property-building-31", "us-geodata-aggregate-1"],
71
+ "overture:OpenAddresses/FL/Charlotte County": ["us-property-building-41", "us-geodata-aggregate-1"],
72
+ "overture:OpenAddresses/FL/Citrus County": ["us-property-building-56", "us-geodata-aggregate-1"],
73
+ "overture:OpenAddresses/FL/Clay County": ["us-property-building-83", "us-geodata-aggregate-1"],
74
+ "overture:OpenAddresses/FL/Collier County": ["us-property-building-43", "us-geodata-aggregate-1"],
75
+ "overture:OpenAddresses/FL/Columbia County": ["us-property-building-102", "us-geodata-aggregate-1"],
76
+ "overture:OpenAddresses/FL/Desoto County": ["us-property-building-114", "us-geodata-aggregate-1"],
77
+ "overture:OpenAddresses/FL/Duval County": ["us-property-building-26", "us-geodata-aggregate-1"],
78
+ "overture:OpenAddresses/FL/Flagler County": ["us-property-building-82", "us-geodata-aggregate-1"],
79
+ "overture:OpenAddresses/FL/Florida Department of Revenue": ["us-property-building-32", "us-geodata-aggregate-1"],
80
+ "overture:OpenAddresses/FL/Hardee County": ["us-property-building-115", "us-geodata-aggregate-1"],
81
+ "overture:OpenAddresses/FL/Hendry County": ["us-property-building-104", "us-geodata-aggregate-1"],
82
+ "overture:OpenAddresses/FL/Hernando County": ["us-property-building-69", "us-geodata-aggregate-1"],
83
+ "overture:OpenAddresses/FL/Highlands County": ["us-property-building-64", "us-geodata-aggregate-1"],
84
+ "overture:OpenAddresses/FL/Hillsborough County": ["us-property-building-22", "us-geodata-aggregate-1"],
85
+ "overture:OpenAddresses/FL/Indian River County": ["us-property-building-74", "us-geodata-aggregate-1"],
86
+ "overture:OpenAddresses/FL/Lake County": ["us-property-building-47", "us-geodata-aggregate-1"],
87
+ "overture:OpenAddresses/FL/Lee County": ["us-property-building-24", "us-geodata-aggregate-1"],
88
+ "overture:OpenAddresses/FL/Leon County": ["us-property-building-63", "us-geodata-aggregate-1"],
89
+ "overture:OpenAddresses/FL/Manatee County": ["us-property-building-42", "us-geodata-aggregate-1"],
90
+ "overture:OpenAddresses/FL/Marion County": ["us-property-building-68", "us-geodata-aggregate-1"],
91
+ "overture:OpenAddresses/FL/Martin County": ["us-property-building-79", "us-geodata-aggregate-1"],
92
+ "overture:OpenAddresses/FL/Miami-Dade County": ["us-property-building-14", "us-geodata-aggregate-1"],
93
+ "overture:OpenAddresses/FL/Nassau County": ["us-property-building-96", "us-geodata-aggregate-1"],
94
+ "overture:OpenAddresses/FL/Okaloosa County": ["us-property-building-70", "us-geodata-aggregate-1"],
95
+ "overture:OpenAddresses/FL/Orange County": ["us-property-building-23", "us-geodata-aggregate-1"],
96
+ "overture:OpenAddresses/FL/Osceola County": ["us-property-building-55", "us-geodata-aggregate-1"],
97
+ "overture:OpenAddresses/FL/Palm Beach County": ["us-property-building-21", "us-geodata-aggregate-1"],
98
+ "overture:OpenAddresses/FL/Pasco County": ["us-property-building-38", "us-geodata-aggregate-1"],
99
+ "overture:OpenAddresses/FL/Pinellas County": ["us-property-building-28", "us-geodata-aggregate-1"],
100
+ "overture:OpenAddresses/FL/Polk County": ["us-property-building-33", "us-geodata-aggregate-1"],
101
+ "overture:OpenAddresses/FL/Putnam County": ["us-property-building-84", "us-geodata-aggregate-1"],
102
+ "overture:OpenAddresses/FL/Santa Rosa County": ["us-property-building-80", "us-geodata-aggregate-1"],
103
+ "overture:OpenAddresses/FL/Sarasota County": ["us-property-building-39", "us-geodata-aggregate-1"],
104
+ "overture:OpenAddresses/FL/Seminole County": ["us-property-building-51", "us-geodata-aggregate-1"],
105
+ "overture:OpenAddresses/FL/St. Johns County": ["us-property-building-57", "us-geodata-aggregate-1"],
106
+ "overture:OpenAddresses/FL/St. Lucie County": ["us-property-building-53", "us-geodata-aggregate-1"],
107
+ "overture:OpenAddresses/FL/Sumter County": ["us-property-building-73", "us-geodata-aggregate-1"],
108
+ "overture:OpenAddresses/FL/Volusia County": ["us-property-building-44", "us-geodata-aggregate-1"],
109
+ "overture:OpenAddresses/FL/Walton County": ["us-property-building-89", "us-geodata-aggregate-1"],
110
+ "overture:OpenAddresses/GA/Athens-Clarke County GIS": ["us-property-building-87", "us-geodata-aggregate-1"],
111
+ "overture:OpenAddresses/GA/DeKalb County": ["us-property-building-34", "us-geodata-aggregate-1"],
112
+ "overture:OpenAddresses/ID/City of Boise": ["us-property-building-45", "us-geodata-aggregate-1"],
113
+ "overture:OpenAddresses/MA/MassGIS": ["us-property-building-9", "us-geodata-aggregate-1"],
114
+ "overture:OpenAddresses/MI/Allegan County": ["us-property-building-94", "us-geodata-aggregate-1"],
115
+ "overture:OpenAddresses/MI/Kent County": ["us-property-building-52", "us-geodata-aggregate-1"],
116
+ "overture:OpenAddresses/MI/Muskegon County": ["us-property-building-88", "us-geodata-aggregate-1"],
117
+ "overture:OpenAddresses/MI/Oakland County": ["us-property-building-29", "us-geodata-aggregate-1"],
118
+ "overture:OpenAddresses/MN/Department of Public Safety": ["us-property-building-12", "us-geodata-aggregate-1"],
119
+ "overture:OpenAddresses/MS/Desoto County": ["us-property-building-85", "us-geodata-aggregate-1"],
120
+ "overture:OpenAddresses/MS/MARIS": ["us-property-building-16", "us-geodata-aggregate-1"],
121
+ "overture:OpenAddresses/NV/Carson City": ["us-property-building-108", "us-geodata-aggregate-1"],
122
+ "overture:OpenAddresses/NY/NYC Open Data": ["us-property-building-18", "us-geodata-aggregate-1"],
123
+ "overture:OpenAddresses/OR/Jackson County": ["us-property-building-72", "us-geodata-aggregate-1"],
124
+ "overture:OpenAddresses/OR/State of Oregon": ["us-property-building-13", "us-geodata-aggregate-1"],
125
+ "overture:OpenAddresses/PA/City of Scranton GIS": ["us-property-building-81", "us-geodata-aggregate-1"],
126
+ "overture:OpenAddresses/WI/Waupaca County": ["us-property-building-107", "us-geodata-aggregate-1"]
127
+ }
128
+ }
@@ -67,7 +67,7 @@
67
67
  *
68
68
  * A country whose codex `layoutForCountry` is `null` has no rendering to write the row in.
69
69
  * The row is refused with {@linkcode CORDISRefusal.CountryNoLayout} rather than rendered in another
70
- * country's order: 353 records over 37 countries, Ghana's 77 the most.
70
+ * country's order.
71
71
  *
72
72
  * ## The street line
73
73
  *
@@ -22,16 +22,36 @@ import { TextSpliterator } from "spliterator"
22
22
  * The largest dictionary is 8.4 KB, and each caller loads it once per process at module load.
23
23
  */
24
24
  export async function loadLibpostalDictionary(language: string, filename: string): Promise<Set<string>> {
25
+ return new Set((await loadLibpostalCanonicalForms(language, filename)).keys())
26
+ }
27
+
28
+ /**
29
+ * Loads one curated libpostal dictionary as a map from each lower-cased form
30
+ * to its line's canonical spelling.
31
+ *
32
+ * `ул.` and `улица` both map to `улица`, so a count of distinct canonical values
33
+ * counts street types rather than their spellings.
34
+ * A form two lines share keeps the first line's canonical spelling.
35
+ */
36
+ export async function loadLibpostalCanonicalForms(language: string, filename: string): Promise<Map<string, string>> {
25
37
  const text = await readLocalTextFile(resourceDictionaryPath("libpostal", language, filename))
26
- const set = new Set<string>()
38
+ const forms = new Map<string, string>()
27
39
 
28
40
  for (const line of TextSpliterator.from(text)) {
29
41
  if (line.startsWith("#")) continue
30
42
 
43
+ let canonical: string | null = null
44
+
31
45
  for (const form of TextSpliterator.from(line, { delimiter: "|" })) {
32
- set.add(form.toLowerCase())
46
+ const lower = form.toLowerCase()
47
+
48
+ canonical ??= lower
49
+
50
+ if (!forms.has(lower)) {
51
+ forms.set(lower, canonical)
52
+ }
33
53
  }
34
54
  }
35
55
 
36
- return set
56
+ return forms
37
57
  }
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import { formatAddressRow } from "@mailwoman/codex/address/format"
14
+ import { countryPostcodeFormat, matchCountryPostcode } from "@mailwoman/codex/postcode/country-formats"
14
15
  import { tryParsingJSON } from "@mailwoman/core/json"
15
16
  import { extractDelimited } from "@mailwoman/core/scripting/arguments"
16
17
  import { stripCombiningMarks } from "@mailwoman/normalize/fold"
@@ -71,6 +72,15 @@ interface OSMCorpusRow {
71
72
  district?: string | null
72
73
  province?: string | null
73
74
  country?: string | null
75
+ /**
76
+ * The containing administrative area's name, which `emit-corpus-jsonl --locality-level`
77
+ * writes for a record without `addr:city`.
78
+ */
79
+ boundary_locality?: string | null
80
+ /**
81
+ * The same for a record without `addr:suburb`, from `--dependent-locality-level`.
82
+ */
83
+ boundary_dependent_locality?: string | null
74
84
  }
75
85
 
76
86
  const MAX_STREET_WORDS = 8
@@ -150,10 +160,13 @@ function parseLine(line: string): OSMCorpusRow | null {
150
160
  * A row whose `addr:street` holds a line rather than a name stays refused:
151
161
  * the mapper supplied a street, and the value is a line.
152
162
  *
163
+ * A postcode is kept when the whole value has `country`'s postcode format.
164
+ *
153
165
  * Each refusal and each discarded component increments its reason in `dropped`.
154
166
  */
155
167
  export function componentsForOSMRow(
156
168
  row: OSMCorpusRow,
169
+ country: string,
157
170
  dropped?: Pick<AdapterOptions, "dropped">
158
171
  ): CanonicalRow["components"] | null {
159
172
  const tally = dropped ?? {}
@@ -189,10 +202,19 @@ export function componentsForOSMRow(
189
202
 
190
203
  const postcode = clean(row.postcode)
191
204
 
192
- if (postcode && /^\d{4,6}$/u.test(postcode)) {
193
- components.postcode = postcode
194
- } else if (postcode) {
195
- countDropped(tally, "component:postcode:not-4-to-6-digits")
205
+ if (postcode) {
206
+ // The country's own format decides, so Argentina's `C1425ABC`, Brunei's `BS8811` and Chile's
207
+ // seven digits stay postcodes, and a value outside the country's form is dropped by name.
208
+ const matched = matchCountryPostcode(postcode, country)
209
+
210
+ if (matched) {
211
+ components.postcode = matched
212
+ } else {
213
+ countDropped(
214
+ tally,
215
+ countryPostcodeFormat(country) ? "component:postcode:not-country-format" : "component:postcode:country-has-none"
216
+ )
217
+ }
196
218
  }
197
219
 
198
220
  const city = clean(row.city)
@@ -200,19 +222,28 @@ export function componentsForOSMRow(
200
222
 
201
223
  if (split) {
202
224
  components.locality = split.locality
225
+ } else {
226
+ // The containing boundary's name stands in only where the mapper tagged no city,
227
+ // so a tagged value is never replaced by a position.
228
+ const boundary = clean(row.boundary_locality)
229
+
230
+ if (boundary) {
231
+ components.locality = boundary
232
+ countDropped(tally, "kept:locality-from-boundary")
233
+ }
203
234
  }
204
235
 
205
- // Dependent-locality candidates in priority order (suburb, subdistrict, district, place, city head);
206
- // `district` never becomes `region`, because Vietnam's country template
207
- // renders it only when no city is present.
208
- const dependent = [row.suburb, row.subdistrict, row.district, row.place, split?.head]
236
+ // Dependent-locality candidates in priority order (suburb, subdistrict, district, place,
237
+ // city head, then the containing boundary's name); `district` never becomes `region`,
238
+ // because Vietnam's country template renders it only when no city is present.
239
+ const dependent = [row.suburb, row.subdistrict, row.district, row.place, split?.head, row.boundary_dependent_locality]
209
240
  .map((value) => clean(value))
210
241
  .find(
211
242
  (value) =>
212
243
  value !== null &&
213
244
  !value.includes(",") &&
214
245
  (street === null || !sameName(value, street)) &&
215
- (split === null || !sameName(value, split.locality))
246
+ (!components.locality || !sameName(value, components.locality))
216
247
  )
217
248
 
218
249
  if (dependent) {
@@ -221,7 +252,7 @@ export function componentsForOSMRow(
221
252
 
222
253
  const province = clean(row.province)
223
254
 
224
- if (province && (!split || !sameName(province, split.locality))) {
255
+ if (province && (!components.locality || !sameName(province, components.locality))) {
225
256
  components.region = province
226
257
  }
227
258
 
@@ -317,7 +348,7 @@ export function createOSMAdapter(): CorpusAdapter {
317
348
  countDropped(opts, "kept:country-untagged")
318
349
  }
319
350
 
320
- const components = componentsForOSMRow(row, opts)
351
+ const components = componentsForOSMRow(row, country, opts)
321
352
 
322
353
  if (!components) continue
323
354
 
package/lib/adapters.ts CHANGED
@@ -50,9 +50,11 @@ import { defaultAdapterRegistry } from "#adapters/registry"
50
50
  import { wofAdminAdapter } from "#adapters/wof/admin/json/adapter"
51
51
  import { wofPostalcodeAdapter } from "#adapters/wof/postalcode-json/adapter"
52
52
  import { gnafAdapter } from "#au/adapters/gnaf/adapter"
53
+ import { azerbaijanPlacesAdapter } from "#az/adapters/opendata/adapter"
53
54
  import { brusselsAdapter } from "#be/adapters/brussels/adapter"
54
55
  import { vlaanderenAdapter } from "#be/adapters/vlaanderen/adapter"
55
56
  import { wallonieAdapter } from "#be/adapters/wallonie/adapter"
57
+ import { gbpaAdapter } from "#bs/adapters/gbpa/adapter"
56
58
  import { czCuzkAdapter } from "#cz/adapters/cuzk/adapter"
57
59
  import { dkInspireAdapter } from "#dk/adapters/inspire/adapter"
58
60
  import { adsAdapter } from "#ee/adapters/ads/adapter"
@@ -61,11 +63,15 @@ import { esCatastroAdapter } from "#es/adapters/catastro/adapter"
61
63
  import { esGipuzkoaAdapter } from "#es/adapters/gipuzkoa/adapter"
62
64
  import { esNavarraAdapter } from "#es/adapters/navarra/adapter"
63
65
  import { ryhtiAdapter } from "#fi/adapters/ryhti/adapter"
66
+ import { adressurFaroeAdapter } from "#fo/adapters/adressur/adapter"
64
67
  import { annuaireEducationAdapter } from "#fr/adapters/annuaire-education/adapter"
65
68
  import { banAdapter } from "#fr/adapters/ban/adapter"
66
69
  import { finessAdapter } from "#fr/adapters/finess/adapter"
67
70
  import { gbOSOpenAdapter } from "#gb/adapters/os-open/adapter"
71
+ import { guamAddressPointsAdapter } from "#gu/adapters/bsp/adapter"
72
+ import { isleOfManLandRegistryAdapter } from "#im/adapters/land-registry/adapter"
68
73
  import { itANACAdapter } from "#it/adapters/anac/adapter"
74
+ import { llvLiechtensteinAdapter } from "#li/adapters/llv/adapter"
69
75
  import { bdAdressesAdapter } from "#lu/adapters/bd-adresses/adapter"
70
76
  import { varisAdapter } from "#lv/adapters/varis/adapter"
71
77
  import { nlKadasterAdapter } from "#nl/adapters/kadaster/adapter"
@@ -85,6 +91,7 @@ import { usgovImlsPlsAdapter } from "#us/adapters/usgov/imls-pls/adapter"
85
91
  import { USGovIRSBMFAdapter } from "#us/adapters/usgov/irs-bmf/adapter"
86
92
  import { usgovNADAdapter } from "#us/adapters/usgov/nad/adapter"
87
93
  import { usgovNPPESAdapter } from "#us/adapters/usgov/nppes/adapter"
94
+ import { ideUruguayAdapter } from "#uy/adapters/ide/adapter"
88
95
 
89
96
  /**
90
97
  * Built-in adapters.
@@ -107,6 +114,13 @@ export const BUILTIN_ADAPTERS: readonly CorpusAdapter[] = [
107
114
  banAdapter,
108
115
  matrikkelenAdapter,
109
116
  ryhtiAdapter,
117
+ ideUruguayAdapter,
118
+ llvLiechtensteinAdapter,
119
+ adressurFaroeAdapter,
120
+ isleOfManLandRegistryAdapter,
121
+ gbpaAdapter,
122
+ azerbaijanPlacesAdapter,
123
+ guamAddressPointsAdapter,
110
124
  czCuzkAdapter,
111
125
  dkInspireAdapter,
112
126
  adsAdapter,