vehicles 0.6.1 → 0.8.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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +274 -0
  4. data/README.md +55 -10
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +5 -4
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/fr-departements.yml +191 -0
  14. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  15. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  16. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  17. data/data/plates/_decode/hr-cities.yml +315 -0
  18. data/data/plates/_decode/ie-counties.yml +227 -0
  19. data/data/plates/_decode/in-state-codes.yml +169 -0
  20. data/data/plates/_decode/is-districts-1938.yml +116 -0
  21. data/data/plates/_decode/it-provinces.yml +348 -0
  22. data/data/plates/_decode/jp-office-marks.yml +960 -0
  23. data/data/plates/_decode/jp-use-marks.yml +205 -0
  24. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  25. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  26. data/data/plates/_decode/lu-series-order.yml +638 -0
  27. data/data/plates/_decode/mx-entity-series.yml +380 -0
  28. data/data/plates/_decode/my-index-marks.yml +271 -0
  29. data/data/plates/_decode/no-counties-1913.yml +148 -0
  30. data/data/plates/_decode/no-districts.yml +901 -0
  31. data/data/plates/_decode/pl-powiats.yml +567 -0
  32. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  33. data/data/plates/_decode/ro-counties.yml +213 -0
  34. data/data/plates/_decode/se-diplomatic.yml +220 -0
  35. data/data/plates/_decode/si-regions.yml +123 -0
  36. data/data/plates/_decode/sk-districts.yml +314 -0
  37. data/data/plates/_decode/th-registration-elements.yml +208 -0
  38. data/data/plates/_decode/ua-regions.yml +393 -0
  39. data/data/plates/_decode/za-licence-marks.yml +215 -0
  40. data/data/plates/_meta/classes.yml +1 -0
  41. data/data/plates/_meta/separators.yml +102 -0
  42. data/data/plates/ad.yml +961 -0
  43. data/data/plates/ar.yml +762 -0
  44. data/data/plates/at.yml +1424 -0
  45. data/data/plates/au-act.yml +472 -0
  46. data/data/plates/au-nsw.yml +282 -0
  47. data/data/plates/au-nt.yml +431 -0
  48. data/data/plates/au-qld.yml +272 -0
  49. data/data/plates/au-sa.yml +248 -0
  50. data/data/plates/au-tas.yml +302 -0
  51. data/data/plates/au-vic.yml +215 -0
  52. data/data/plates/au-wa.yml +309 -0
  53. data/data/plates/be.yml +1840 -0
  54. data/data/plates/br.yml +1152 -0
  55. data/data/plates/ca-ab.yml +430 -0
  56. data/data/plates/ca-bc.yml +697 -0
  57. data/data/plates/ca-mb.yml +499 -0
  58. data/data/plates/ca-nb.yml +537 -0
  59. data/data/plates/ca-nl.yml +743 -0
  60. data/data/plates/ca-ns.yml +808 -0
  61. data/data/plates/ca-nt.yml +610 -0
  62. data/data/plates/ca-nu.yml +280 -0
  63. data/data/plates/ca-on.yml +881 -0
  64. data/data/plates/ca-pe.yml +592 -0
  65. data/data/plates/ca-qc.yml +1036 -0
  66. data/data/plates/ca-sk.yml +256 -0
  67. data/data/plates/ca-yt.yml +656 -0
  68. data/data/plates/ch.yml +1273 -0
  69. data/data/plates/cn.yml +1431 -0
  70. data/data/plates/cy.yml +688 -0
  71. data/data/plates/cz.yml +1179 -0
  72. data/data/plates/de.yml +553 -118
  73. data/data/plates/dk.yml +1647 -0
  74. data/data/plates/ee.yml +1275 -0
  75. data/data/plates/es.yml +228 -32
  76. data/data/plates/fi.yml +1271 -0
  77. data/data/plates/fr.yml +1265 -0
  78. data/data/plates/gb.yml +1188 -0
  79. data/data/plates/gr.yml +721 -0
  80. data/data/plates/hr.yml +860 -0
  81. data/data/plates/hu.yml +959 -0
  82. data/data/plates/ie.yml +775 -0
  83. data/data/plates/in.yml +1172 -0
  84. data/data/plates/is.yml +667 -0
  85. data/data/plates/it.yml +1317 -0
  86. data/data/plates/jp.yml +3650 -0
  87. data/data/plates/kr.yml +1375 -0
  88. data/data/plates/li.yml +1010 -0
  89. data/data/plates/lt.yml +879 -0
  90. data/data/plates/lu.yml +842 -0
  91. data/data/plates/lv.yml +924 -0
  92. data/data/plates/mc.yml +1024 -0
  93. data/data/plates/mt.yml +854 -0
  94. data/data/plates/mx.yml +1372 -0
  95. data/data/plates/my.yml +685 -0
  96. data/data/plates/nl.yml +44 -0
  97. data/data/plates/no.yml +1018 -0
  98. data/data/plates/nz.yml +1699 -0
  99. data/data/plates/pl.yml +1296 -0
  100. data/data/plates/pt.yml +847 -0
  101. data/data/plates/ro.yml +785 -0
  102. data/data/plates/se.yml +1091 -0
  103. data/data/plates/si.yml +1105 -0
  104. data/data/plates/sk.yml +1439 -0
  105. data/data/plates/sm.yml +1119 -0
  106. data/data/plates/th.yml +1150 -0
  107. data/data/plates/ua.yml +1672 -0
  108. data/data/plates/us-ak.yml +763 -0
  109. data/data/plates/us-al.yml +457 -0
  110. data/data/plates/us-ar.yml +427 -0
  111. data/data/plates/us-as.yml +454 -0
  112. data/data/plates/us-az.yml +430 -0
  113. data/data/plates/us-ca.yml +892 -0
  114. data/data/plates/us-co.yml +452 -0
  115. data/data/plates/us-ct.yml +427 -0
  116. data/data/plates/us-dc.yml +614 -0
  117. data/data/plates/us-de.yml +551 -0
  118. data/data/plates/us-fl.yml +319 -96
  119. data/data/plates/us-ga.yml +644 -0
  120. data/data/plates/us-gu.yml +658 -0
  121. data/data/plates/us-hi.yml +585 -0
  122. data/data/plates/us-ia.yml +438 -0
  123. data/data/plates/us-id.yml +531 -0
  124. data/data/plates/us-il.yml +516 -0
  125. data/data/plates/us-in.yml +324 -0
  126. data/data/plates/us-ks.yml +351 -0
  127. data/data/plates/us-ky.yml +770 -0
  128. data/data/plates/us-la.yml +568 -0
  129. data/data/plates/us-ma.yml +379 -0
  130. data/data/plates/us-md.yml +536 -0
  131. data/data/plates/us-me.yml +445 -0
  132. data/data/plates/us-mi.yml +408 -0
  133. data/data/plates/us-mn.yml +411 -0
  134. data/data/plates/us-mo.yml +356 -0
  135. data/data/plates/us-mp.yml +402 -0
  136. data/data/plates/us-ms.yml +432 -0
  137. data/data/plates/us-mt.yml +619 -0
  138. data/data/plates/us-nc.yml +602 -0
  139. data/data/plates/us-nd.yml +419 -0
  140. data/data/plates/us-ne.yml +483 -0
  141. data/data/plates/us-nh.yml +394 -0
  142. data/data/plates/us-nj.yml +547 -0
  143. data/data/plates/us-nm.yml +574 -0
  144. data/data/plates/us-nv.yml +655 -0
  145. data/data/plates/us-ny.yml +592 -0
  146. data/data/plates/us-oh.yml +404 -0
  147. data/data/plates/us-ok.yml +513 -0
  148. data/data/plates/us-or.yml +392 -0
  149. data/data/plates/us-pa.yml +506 -0
  150. data/data/plates/us-pr.yml +507 -0
  151. data/data/plates/us-ri.yml +445 -0
  152. data/data/plates/us-sc.yml +605 -0
  153. data/data/plates/us-sd.yml +428 -0
  154. data/data/plates/us-tn.yml +471 -0
  155. data/data/plates/us-tx.yml +535 -0
  156. data/data/plates/us-ut.yml +384 -0
  157. data/data/plates/us-va.yml +567 -0
  158. data/data/plates/us-vi.yml +489 -0
  159. data/data/plates/us-vt.yml +458 -0
  160. data/data/plates/us-wa.yml +484 -0
  161. data/data/plates/us-wi.yml +509 -0
  162. data/data/plates/us-wv.yml +446 -0
  163. data/data/plates/us-wy.yml +523 -0
  164. data/data/plates/va.yml +604 -0
  165. data/data/plates/za.yml +1141 -0
  166. data/data/vehicles.json +160653 -105090
  167. data/lib/vehicles/configuration.rb +17 -3
  168. data/lib/vehicles/dataset.rb +73 -18
  169. data/lib/vehicles/fuzzy.rb +115 -0
  170. data/lib/vehicles/http.rb +48 -0
  171. data/lib/vehicles/make.rb +36 -6
  172. data/lib/vehicles/mcp_server.rb +5 -5
  173. data/lib/vehicles/model.rb +21 -2
  174. data/lib/vehicles/plates/series.rb +172 -18
  175. data/lib/vehicles/plates/template_fill.rb +188 -0
  176. data/lib/vehicles/plates/templates.rb +162 -0
  177. data/lib/vehicles/plates.rb +12 -0
  178. data/lib/vehicles/providers/hosted_provider.rb +28 -55
  179. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  180. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  181. data/lib/vehicles/version.rb +1 -1
  182. data/lib/vehicles.rb +32 -16
  183. data/rakelib/data_refresh.rake +109 -0
  184. data/rakelib/plates_refresh.rake +29 -0
  185. data/sig/vehicles.rbs +18 -0
  186. metadata +164 -2
@@ -0,0 +1,102 @@
1
+ # plates/_meta/separators.yml — THE NORMATIVE SEPARATOR CHARACTER SET.
2
+ #
3
+ # PRD-PLATES §2.6 declares this contract in prose; this file is its
4
+ # machine-readable form, and `scripts/lint_plates.rb` enforces the dataset
5
+ # against THIS file (single source of truth — the lint hardcodes nothing).
6
+ #
7
+ # WHY IT EXISTS (issue #124, from the vehicles gem 0.6.0 implementation):
8
+ # a consumer with a separator-forgiving tier canonicalizes user input by
9
+ # deleting punctuation, and derives separator-free twins of our regexes to
10
+ # match against. That derivation is only sound if the dataset commits, once
11
+ # and normatively, to which characters are EVER separators and which are
12
+ # serial-significant. Without the commitment, deleting a character might
13
+ # destroy a serial. With it, deletion is information-preserving by
14
+ # construction, and every consumer forgives exactly the same punctuation.
15
+ #
16
+ # Grow this file by PR with a rationale — never ad hoc in data files.
17
+ schema_version: 1
18
+
19
+ # ---------------------------------------------------------------------------
20
+ # 1. The serial alphabet. Every character a SERIAL is made of, dataset-wide.
21
+ # Disjoint from `forgiving` below: that disjointness is the whole contract.
22
+ # ---------------------------------------------------------------------------
23
+ serial_alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
24
+ serial_alphabet_note: >-
25
+ Uppercase A-Z and 0-9 and nothing else. No plate serial in this dataset
26
+ contains punctuation, and none ever will: a jurisdiction that prints a
27
+ glyph inside the serial (rather than between groups) is a schema amendment,
28
+ not a data entry. Serials are RECORDED uppercase; consumers upcase input
29
+ before matching, since every regex in the dataset is written in uppercase.
30
+ case: upper
31
+
32
+ # ---------------------------------------------------------------------------
33
+ # 2. EMITTED — the only characters this dataset itself ever writes as a
34
+ # separator, in `format.pattern`, `format.regex`, `format.regex_strict`
35
+ # and `format.regex_statutory`. The lint rejects any other literal.
36
+ # ---------------------------------------------------------------------------
37
+ emitted:
38
+ - char: "-"
39
+ codepoint: "U+002D"
40
+ name: HYPHEN-MINUS
41
+ note: >-
42
+ The group separator as printed on NL (2-2-2 sidecodes), DE
43
+ (Unterscheidungszeichen - Erkennungsnummer) and ES state/diplomatic
44
+ plates. In NL it is a physical feature of the plate, not typography.
45
+ - char: " "
46
+ codepoint: "U+0020"
47
+ name: SPACE
48
+ note: >-
49
+ The printed GAP where the authority prescribes group spacing in
50
+ millimetres but no separator glyph: ES ordinary (Anexo XVIII Cuadro 1,
51
+ 41 mm inter-group), DE between Erkennungsnummer groups, US-FL.
52
+
53
+ # ---------------------------------------------------------------------------
54
+ # 3. FORGIVING — the characters a lenient consumer MAY delete from user input
55
+ # (and from a regex, to derive its separator-free twin) before matching.
56
+ # A superset of `emitted`: humans, OCR and copy-paste substitute these
57
+ # freely. None of them is ever serial-significant (§1), so deleting them
58
+ # cannot destroy a serial — that is the guarantee this list exists to make.
59
+ # Deleting them from a regex means deleting the literal or the
60
+ # separator-only class AND its quantifier (`[- ]`, ` ?` -> nothing).
61
+ # ---------------------------------------------------------------------------
62
+ forgiving:
63
+ - { char: " ", codepoint: "U+0020", name: SPACE }
64
+ - { char: "\t", codepoint: "U+0009", name: "CHARACTER TABULATION" }
65
+ - { char: " ", codepoint: "U+00A0", name: "NO-BREAK SPACE" }
66
+ - { char: " ", codepoint: "U+2007", name: "FIGURE SPACE" }
67
+ - { char: " ", codepoint: "U+202F", name: "NARROW NO-BREAK SPACE" }
68
+ - { char: "-", codepoint: "U+002D", name: HYPHEN-MINUS }
69
+ - { char: "‐", codepoint: "U+2010", name: HYPHEN }
70
+ - { char: "‑", codepoint: "U+2011", name: "NON-BREAKING HYPHEN" }
71
+ - { char: "‒", codepoint: "U+2012", name: "FIGURE DASH" }
72
+ - { char: "–", codepoint: "U+2013", name: "EN DASH" }
73
+ - { char: "—", codepoint: "U+2014", name: "EM DASH" }
74
+ - { char: "―", codepoint: "U+2015", name: "HORIZONTAL BAR" }
75
+ - { char: "−", codepoint: "U+2212", name: "MINUS SIGN" }
76
+ - { char: "·", codepoint: "U+00B7", name: "MIDDLE DOT" }
77
+ - { char: "•", codepoint: "U+2022", name: BULLET }
78
+ - { char: ".", codepoint: "U+002E", name: "FULL STOP" }
79
+ - { char: "_", codepoint: "U+005F", name: "LOW LINE" }
80
+ - { char: "/", codepoint: "U+002F", name: SOLIDUS }
81
+ forgiving_note: >-
82
+ The vehicles gem 0.6.0 strips [\s\-–—·.] — a subset of this list. Widening
83
+ it to the full list is safe by construction (nothing here is ever
84
+ serial-significant) and covers the Unicode dashes an OCR or a word
85
+ processor produces. SOLIDUS and LOW LINE are here because keyboards and
86
+ URL slugs produce them, not because any plate prints them.
87
+
88
+ # ---------------------------------------------------------------------------
89
+ # 4. NOT separators — glyphs that look like punctuation but are NOT, so no
90
+ # consumer may strip them. Recorded so the list above stays honest as
91
+ # coverage grows past the L0 pilot.
92
+ # ---------------------------------------------------------------------------
93
+ never_separator_note: >-
94
+ Nothing in the L0 pilot (NL, ES, DE, US-FL). Known candidates for later
95
+ gates, each of which is a SYMBOL inside the plate's identity rather than a
96
+ gap between serial groups, and none of which may be deleted: the coats of
97
+ arms / seals that sit between groups on several German and Austrian plates
98
+ (a design element, carried in `design.emblem`, never in the serial); the
99
+ hyphen INSIDE the ES military "-VE" suffix, which is a literal part of a
100
+ sourced token rather than a group boundary — it is spelled as an emitted
101
+ hyphen today and a separator-stripping consumer collapses "ET-1234-VE" to
102
+ "ET1234VE", which is correct and still unambiguous.