vehicles 0.9.0 → 0.9.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +57 -7
- data/README.md +353 -69
- data/data/PROVENANCE-vehicles.md +2 -2
- data/data/plates/PROVENANCE.md +2 -2
- data/data/plates/_decode/at-districts.yml +2 -2
- data/data/plates/_decode/cn-issuing-offices.yml +2 -2
- data/data/plates/_decode/cn-provinces.yml +2 -2
- data/data/plates/_decode/cz-kraj.yml +1 -1
- data/data/plates/_decode/dk-serial-blocks.yml +1 -1
- data/data/plates/_decode/es-provinces.yml +1 -1
- data/data/plates/_decode/fr-departements.yml +2 -2
- data/data/plates/_decode/gb-age-identifiers.yml +1 -1
- data/data/plates/_decode/gb-memory-tags.yml +1 -1
- data/data/plates/_decode/gr-prefectures.yml +1 -1
- data/data/plates/_decode/hr-cities.yml +3 -3
- data/data/plates/_decode/ie-counties.yml +3 -3
- data/data/plates/_decode/in-state-codes.yml +2 -2
- data/data/plates/_decode/it-provinces.yml +3 -3
- data/data/plates/_decode/jp-office-marks.yml +2 -2
- data/data/plates/_decode/jp-use-marks.yml +2 -2
- data/data/plates/_decode/kr-authority-marks.yml +1 -1
- data/data/plates/_decode/mx-entity-series.yml +1 -1
- data/data/plates/_decode/my-index-marks.yml +4 -4
- data/data/plates/_decode/pt-trailer-services.yml +1 -1
- data/data/plates/_decode/ro-counties.yml +1 -1
- data/data/plates/_decode/se-diplomatic.yml +1 -1
- data/data/plates/_decode/si-regions.yml +1 -1
- data/data/plates/_decode/ua-regions.yml +1 -1
- data/data/plates/_meta/classes.yml +1 -1
- data/data/plates/_meta/separators.yml +1 -1
- data/data/plates/ad.yml +555 -52
- data/data/plates/ar.yml +8 -8
- data/data/plates/at.yml +91 -10
- data/data/plates/au-act.yml +13 -13
- data/data/plates/au-nsw.yml +9 -9
- data/data/plates/au-nt.yml +13 -14
- data/data/plates/au-qld.yml +7 -7
- data/data/plates/au-sa.yml +7 -7
- data/data/plates/au-tas.yml +10 -10
- data/data/plates/au-vic.yml +6 -6
- data/data/plates/au-wa.yml +8 -8
- data/data/plates/be.yml +11 -11
- data/data/plates/br.yml +14 -14
- data/data/plates/ca-ab.yml +10 -10
- data/data/plates/ca-bc.yml +6 -6
- data/data/plates/ca-mb.yml +4 -4
- data/data/plates/ca-nb.yml +9 -9
- data/data/plates/ca-nl.yml +11 -11
- data/data/plates/ca-ns.yml +12 -12
- data/data/plates/ca-nt.yml +7 -7
- data/data/plates/ca-nu.yml +7 -7
- data/data/plates/ca-on.yml +21 -21
- data/data/plates/ca-pe.yml +13 -13
- data/data/plates/ca-qc.yml +11 -11
- data/data/plates/ca-sk.yml +6 -6
- data/data/plates/ca-yt.yml +6 -6
- data/data/plates/ch.yml +14 -14
- data/data/plates/cn.yml +9 -9
- data/data/plates/cy.yml +6 -6
- data/data/plates/cz.yml +9 -9
- data/data/plates/de.yml +8 -8
- data/data/plates/dk.yml +12 -12
- data/data/plates/ee.yml +13 -13
- data/data/plates/eg.yml +708 -0
- data/data/plates/es.yml +8 -8
- data/data/plates/fi.yml +14 -14
- data/data/plates/fr.yml +12 -12
- data/data/plates/gb.yml +16 -16
- data/data/plates/gr.yml +14 -14
- data/data/plates/hr.yml +15 -15
- data/data/plates/hu.yml +16 -16
- data/data/plates/ie.yml +7 -7
- data/data/plates/in.yml +7 -7
- data/data/plates/is.yml +3 -3
- data/data/plates/it.yml +21 -21
- data/data/plates/jp.yml +121 -121
- data/data/plates/kr.yml +6 -6
- data/data/plates/li.yml +6 -6
- data/data/plates/lt.yml +10 -10
- data/data/plates/lu.yml +4 -4
- data/data/plates/lv.yml +9 -9
- data/data/plates/mc.yml +4 -4
- data/data/plates/mt.yml +5 -5
- data/data/plates/mx.yml +7 -7
- data/data/plates/my.yml +18 -18
- data/data/plates/ng.yml +346 -0
- data/data/plates/nl.yml +5 -5
- data/data/plates/no.yml +7 -7
- data/data/plates/nz.yml +18 -18
- data/data/plates/pl.yml +4 -4
- data/data/plates/pt.yml +13 -5
- data/data/plates/ro.yml +14 -14
- data/data/plates/se.yml +13 -13
- data/data/plates/si.yml +8 -8
- data/data/plates/sk.yml +15 -15
- data/data/plates/sm.yml +7 -7
- data/data/plates/th.yml +10 -10
- data/data/plates/tr.yml +432 -0
- data/data/plates/ua.yml +9 -9
- data/data/plates/us-ak.yml +11 -11
- data/data/plates/us-al.yml +12 -12
- data/data/plates/us-ar.yml +15 -15
- data/data/plates/us-as.yml +10 -10
- data/data/plates/us-az.yml +10 -10
- data/data/plates/us-ca.yml +13 -13
- data/data/plates/us-co.yml +14 -14
- data/data/plates/us-ct.yml +24 -24
- data/data/plates/us-dc.yml +7 -7
- data/data/plates/us-de.yml +10 -10
- data/data/plates/us-fl.yml +17 -17
- data/data/plates/us-ga.yml +10 -10
- data/data/plates/us-gu.yml +11 -11
- data/data/plates/us-hi.yml +11 -11
- data/data/plates/us-ia.yml +9 -9
- data/data/plates/us-id.yml +13 -13
- data/data/plates/us-il.yml +11 -11
- data/data/plates/us-in.yml +9 -9
- data/data/plates/us-ks.yml +8 -8
- data/data/plates/us-ky.yml +11 -11
- data/data/plates/us-la.yml +11 -11
- data/data/plates/us-ma.yml +10 -10
- data/data/plates/us-md.yml +7 -7
- data/data/plates/us-me.yml +16 -16
- data/data/plates/us-mi.yml +8 -8
- data/data/plates/us-mn.yml +13 -13
- data/data/plates/us-mo.yml +13 -13
- data/data/plates/us-mp.yml +12 -12
- data/data/plates/us-ms.yml +8 -8
- data/data/plates/us-mt.yml +12 -12
- data/data/plates/us-nc.yml +12 -12
- data/data/plates/us-nd.yml +10 -10
- data/data/plates/us-ne.yml +10 -10
- data/data/plates/us-nh.yml +8 -8
- data/data/plates/us-nj.yml +8 -8
- data/data/plates/us-nm.yml +14 -14
- data/data/plates/us-nv.yml +18 -18
- data/data/plates/us-ny.yml +17 -17
- data/data/plates/us-oh.yml +13 -13
- data/data/plates/us-ok.yml +12 -12
- data/data/plates/us-or.yml +15 -15
- data/data/plates/us-pa.yml +14 -14
- data/data/plates/us-pr.yml +15 -15
- data/data/plates/us-ri.yml +10 -10
- data/data/plates/us-sc.yml +7 -7
- data/data/plates/us-sd.yml +12 -12
- data/data/plates/us-tn.yml +8 -8
- data/data/plates/us-tx.yml +17 -17
- data/data/plates/us-ut.yml +12 -12
- data/data/plates/us-va.yml +14 -14
- data/data/plates/us-vi.yml +16 -16
- data/data/plates/us-vt.yml +9 -9
- data/data/plates/us-wa.yml +18 -18
- data/data/plates/us-wi.yml +8 -8
- data/data/plates/us-wv.yml +9 -9
- data/data/plates/us-wy.yml +10 -10
- data/data/plates/va.yml +7 -7
- data/data/plates/za.yml +11 -11
- data/data/vehicles.json +121081 -62015
- data/lib/generators/vehicles/templates/initializer.rb +21 -12
- data/lib/generators/vehicles/templates/vehicles_refresh_job.rb +8 -4
- data/lib/vehicles/color.rb +8 -1
- data/lib/vehicles/colors.rb +14 -10
- data/lib/vehicles/configuration.rb +82 -3
- data/lib/vehicles/data_source.rb +220 -0
- data/lib/vehicles/dataset.rb +38 -6
- data/lib/vehicles/dataset_resolution.rb +39 -3
- data/lib/vehicles/dataset_slice.rb +90 -0
- data/lib/vehicles/hosted_result.rb +94 -0
- data/lib/vehicles/http.rb +75 -7
- data/lib/vehicles/id_lookup.rb +37 -0
- data/lib/vehicles/kind_rule.rb +63 -0
- data/lib/vehicles/labels.rb +131 -0
- data/lib/vehicles/make.rb +45 -19
- data/lib/vehicles/model.rb +66 -19
- data/lib/vehicles/model_match.rb +16 -2
- data/lib/vehicles/model_matcher.rb +6 -7
- data/lib/vehicles/plates/series.rb +87 -8
- data/lib/vehicles/plates/template_fill.rb +2 -2
- data/lib/vehicles/plates/templates.rb +9 -5
- data/lib/vehicles/plates.rb +54 -8
- data/lib/vehicles/providers/hosted_provider.rb +145 -32
- data/lib/vehicles/providers/local_provider.rb +2 -2
- data/lib/vehicles/refresh_result.rb +74 -0
- data/lib/vehicles/refresher.rb +190 -54
- data/lib/vehicles/release_checks.rb +72 -0
- data/lib/vehicles/text_matcher.rb +19 -10
- data/lib/vehicles/validators/vehicle_make_validator.rb +18 -1
- data/lib/vehicles/validators/vehicle_model_validator.rb +17 -1
- data/lib/vehicles/version.rb +1 -1
- data/lib/vehicles.rb +119 -67
- data/rakelib/data_refresh.rake +1 -1
- data/rakelib/plates_refresh.rake +1 -1
- data/sig/vehicles.rbs +67 -13
- metadata +13 -2
data/data/PROVENANCE-vehicles.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
(the gem projection) at a release tag:
|
|
5
5
|
|
|
6
6
|
- **Source**: https://github.com/vehiclesdb/vehiclesdb `dist/vehicles.json`
|
|
7
|
-
- **Tag**: `v2026.11.
|
|
8
|
-
- **country_ranks**:
|
|
7
|
+
- **Tag**: `v2026.11.6` (commit `7b2b37f41e676ad42cdc0b1dfed1460670f1595b`), dataset version `2026.11.6`
|
|
8
|
+
- **country_ranks**: 16223 model(s) carried it natively; 0 merged from
|
|
9
9
|
the same tag's `catalog/<kind>/models.json` `popularity.by_country[cc].rank`
|
|
10
10
|
- **License**: CC-BY 4.0 (see the data repo's LICENSE + ATTRIBUTION.md)
|
|
11
11
|
|
data/data/plates/PROVENANCE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Bundled plates dataset (
|
|
1
|
+
# Bundled plates dataset (full corpus)
|
|
2
2
|
|
|
3
3
|
Copy of `plates/` from the public data repo (EXCLUDING `_art/`),
|
|
4
4
|
refreshed on gem releases:
|
|
5
5
|
|
|
6
6
|
- **Source**: https://github.com/vehiclesdb/vehiclesdb `plates/`
|
|
7
|
-
- **Commit**: `
|
|
7
|
+
- **Commit**: `db0ec0abf7eae90b719a0a66f40b231f903bfac6`
|
|
8
8
|
- **License**: CC-BY 4.0 (see the data repo's LICENSE + ATTRIBUTION.md)
|
|
9
9
|
|
|
10
10
|
Refresh: `rake plates:refresh` (this file is generated by it).
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# discharges the delegation by pointing at ANLAGE 5d: "Die Bezeichnung der den
|
|
9
9
|
# Zulassungsschein ausstellenden Behörde im Kennzeichen bestimmt sich nach
|
|
10
10
|
# Anlage 5d." Anlage 5d is a CLOSED, PRIMARY, 98-row table printed inside the
|
|
11
|
-
# regulation — so unlike the German ~400-code Bundesanzeiger list (
|
|
11
|
+
# regulation — so unlike the German ~400-code Bundesanzeiger list (the plates spec
|
|
12
12
|
# §2.4), it is authored here in full, verbatim, in the annex's own order
|
|
13
13
|
# (by Bundesland, then as the annex prints them).
|
|
14
14
|
#
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
# at-historic, at-electric, at-dealer-probefahrt, at-temporary-*,
|
|
24
24
|
# at-trailer-foreign, at-wunschkennzeichen) via region_encoding.
|
|
25
25
|
#
|
|
26
|
-
# PERIOD DISCIPLINE (
|
|
26
|
+
# PERIOD DISCIPLINE (the plates spec §2.4): these are the codes in the CONSOLIDATED
|
|
27
27
|
# Anlage 5d in force on the access date (Fassung im RIS seit 26.09.2024,
|
|
28
28
|
# NOR40265416). Austrian district reform has repeatedly merged Bezirke
|
|
29
29
|
# (Bruck-Mürzzuschlag, Hartberg-Fürstenfeld, Murtal and Südoststeiermark are
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
# 豫V (Zhengzhou), announced by 郑州市人民政府 for 2020-09-16 and
|
|
45
45
|
# cited below — it is NOT in Annex A because Annex A predates it.
|
|
46
46
|
#
|
|
47
|
-
# PERIOD DISCIPLINE (
|
|
47
|
+
# PERIOD DISCIPLINE (the plates spec § 2.4). Rows are the 2007 state and are never
|
|
48
48
|
# deleted: a plate issued under an old code stays on the road, and several of
|
|
49
49
|
# the place names below have since been renamed or reorganised (襄樊市 →
|
|
50
50
|
# 襄阳市 2010; 巢湖市 dissolved 2011; 铜仁地区/毕节地区/海东地区/吐鲁番地区/
|
|
@@ -92,7 +92,7 @@ period_note: >-
|
|
|
92
92
|
2007 is the year GA 36-2007 came into force (实施 2007-11-01), NOT the year
|
|
93
93
|
these codes began: most of them were already allocated under GA 36-1992 and
|
|
94
94
|
the 1992-format plates that carry them were issued from 1992 onward. This is
|
|
95
|
-
the instrument-in-force case in
|
|
95
|
+
the instrument-in-force case in the plates spec § 2.4 exactly — a consolidation
|
|
96
96
|
documenting an older practice. The 2014 and 2018 editions each reissued
|
|
97
97
|
Annex A and neither text is public, so no row here can be dated later than
|
|
98
98
|
2007 and none can be shown to have been withdrawn.
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
# rather than by this table will disagree with the road.
|
|
69
69
|
#
|
|
70
70
|
# ============================================================================
|
|
71
|
-
# PERIOD DISCIPLINE (
|
|
71
|
+
# PERIOD DISCIPLINE (the plates spec § 2.4) — ONE ROW IS YOUNGER THAN THE OTHERS
|
|
72
72
|
# ============================================================================
|
|
73
73
|
# GA 36-2007's 前言 lists, among the changes that edition made to GA 36-1992,
|
|
74
74
|
# verbatim: "――增加了重庆的简称;" and "――增加了"渝"、"港"、"澳"、"使"、"警"、
|
|
@@ -591,7 +591,7 @@ limits:
|
|
|
591
591
|
dataset with the British mark, which names the six-month period of first
|
|
592
592
|
registration to 2050.
|
|
593
593
|
cross_file_divergences: >-
|
|
594
|
-
RECORDED, NOT AVERAGED (
|
|
594
|
+
RECORDED, NOT AVERAGED (the plates spec § 5.3). Two `row_period_start` values in
|
|
595
595
|
`classification_han` above disagree with the period on the plates/cn.yml
|
|
596
596
|
series that uses the same character, and the disagreement is left standing
|
|
597
597
|
for the verifier rather than reconciled by one file overwriting the other.
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
# parse API that learned one and inferred the other would be wrong on twelve of
|
|
22
22
|
# the fourteen rows. Both are authored here, in the instrument's own order.
|
|
23
23
|
#
|
|
24
|
-
# PERIOD DISCIPLINE (
|
|
24
|
+
# PERIOD DISCIPLINE (the plates spec §2.4). The fourteen kraje were created by
|
|
25
25
|
# ústavní zákon č. 347/1997 Sb. and have not been re-cut since, so unlike the
|
|
26
26
|
# German and Austrian tables this one has no withdrawn rows and no merger
|
|
27
27
|
# history. What DID change is the meaning of the code on a plate, and it
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
# * `secondary-wikipedia` — the rest of the pre-2012 rows. Both the English
|
|
40
40
|
# and the Danish Wikipedia article carry a pre-2012 block table, each
|
|
41
41
|
# crediting the enthusiast register nrpl.dk. THE TWO TABLES DISAGREE, and
|
|
42
|
-
#
|
|
42
|
+
# the plates spec §5.3 says record disagreements rather than average them, so
|
|
43
43
|
# conflicting rows carry both readings and a `conflict:` note. Nothing here
|
|
44
44
|
# is presented as an instrument.
|
|
45
45
|
#
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
# Referenced by: es-provincial (plates/es.yml) via region_encoding.
|
|
12
12
|
#
|
|
13
|
-
# PERIOD DISCIPLINE (
|
|
13
|
+
# PERIOD DISCIPLINE (the plates spec §2.4 — "province codes changed over time"):
|
|
14
14
|
# these codes are the set in force in the CONSOLIDATED Anexo XVIII, and they
|
|
15
15
|
# use the CURRENT official province names (Illes Balears, Girona, Lleida,
|
|
16
16
|
# Ourense, A Coruña). Historic contraseñas that predate the RGV and appear on
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
# avoir de lien avec le domicile du titulaire du certificat
|
|
22
22
|
# d'immatriculation." A SIV plate DOES NOT DECODE. Reading region off a
|
|
23
23
|
# modern French plate is the single most expensive mistake a plate-parse
|
|
24
|
-
# API can make, and
|
|
24
|
+
# API can make, and the plates spec §2.4 already names it ("France's SIV
|
|
25
25
|
# département band is OWNER-CHOSEN, not geographic ... the decode table
|
|
26
26
|
# must say so or the parse API will lie"). It says so.
|
|
27
27
|
#
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
# 96 metropolitan départements including Corse-du-Sud (2A) and Haute-Corse (2B),
|
|
43
43
|
# plus the five overseas départements 971-974 and 976. Fetched 2026-08-02.
|
|
44
44
|
#
|
|
45
|
-
# PERIOD DISCIPLINE (
|
|
45
|
+
# PERIOD DISCIPLINE (the plates spec §2.4 — decode tables rot). This is the list in
|
|
46
46
|
# force TODAY. Historic FNI codes that are NOT in it are NOT invented here:
|
|
47
47
|
# * 20 = Corse before the 1976 split into 2A/2B;
|
|
48
48
|
# * 75 covering the whole former Seine before the 1968 Île-de-France
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# § 23(4) does not reach the composition of a mark, so the twice-yearly code
|
|
6
6
|
# is an administrative allocation published in DVLA's leaflet INF104 and, for
|
|
7
7
|
# the export series, in HMRC's VAT manual. Both are authority publications and
|
|
8
|
-
# therefore PRIMARY under
|
|
8
|
+
# therefore PRIMARY under the plates spec § 4.
|
|
9
9
|
#
|
|
10
10
|
# THE RULE, and it is complete and mechanical:
|
|
11
11
|
# a vehicle first registered March-August of year YY takes the code YY
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
# Secretary of State under § 23(1), and DVLA publishes it in the leaflet
|
|
10
10
|
# INF104. So where plates/_decode/es-provinces.yml is enacted law and the
|
|
11
11
|
# German district list is a Bundesanzeiger publication, this is a leaflet —
|
|
12
|
-
# and a leaflet from the issuing authority is still a PRIMARY (
|
|
12
|
+
# and a leaflet from the issuing authority is still a PRIMARY (the plates spec § 4:
|
|
13
13
|
# "Government/authority pages ... PRIMARY").
|
|
14
14
|
#
|
|
15
15
|
# Every row below is INF104 (4/22) § 05 "DVLA memory tags and age identifiers",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
# plate. This is the Greek analogue of the two-table trap recorded in
|
|
78
78
|
# plates/_decode/it-provinces.yml.
|
|
79
79
|
#
|
|
80
|
-
# PERIOD DISCIPLINE (
|
|
80
|
+
# PERIOD DISCIPLINE (the plates spec §2.4). 34 of the 195 rows are combinations that
|
|
81
81
|
# are ALLOCATED BUT NOT YET IN ISSUE (`status: allocated-not-yet-issued`). They
|
|
82
82
|
# are kept, not dropped, because they are the forward half of the allocation —
|
|
83
83
|
# but a consumer must not report them as observed geography, and a validator
|
|
@@ -81,7 +81,7 @@ period_note: >-
|
|
|
81
81
|
period, so the 1990s code set is not asserted here.
|
|
82
82
|
|
|
83
83
|
# ---------------------------------------------------------------------------
|
|
84
|
-
# THE DIACRITIC PROBLEM — a
|
|
84
|
+
# THE DIACRITIC PROBLEM — a the plates spec §2.6 finding, recorded, not folded away.
|
|
85
85
|
# ---------------------------------------------------------------------------
|
|
86
86
|
diacritics:
|
|
87
87
|
affected_codes: ["ČK", "KŽ", "PŽ", "ŠI", "VŽ", "ŽU"]
|
|
@@ -91,7 +91,7 @@ diacritics:
|
|
|
91
91
|
it as A-Z 0-9), so no `format.pattern` or `format.regex` in plates/hr.yml
|
|
92
92
|
can spell them: the area-code position is written `[A-Z]{2}` there and is
|
|
93
93
|
therefore NARROWER than the issuing grammar for these six areas. Per
|
|
94
|
-
|
|
94
|
+
the plates spec §2.7 that is still `matching: strict` — narrower is strict — but
|
|
95
95
|
a consumer matching a photographed Croatian plate MUST either ASCII-fold the
|
|
96
96
|
input or widen the class itself. Extending the serial alphabet is a schema
|
|
97
97
|
amendment (§2.6), not a data entry, and is NOT attempted here.
|
|
@@ -110,7 +110,7 @@ diacritics:
|
|
|
110
110
|
|
|
111
111
|
# ---------------------------------------------------------------------------
|
|
112
112
|
# What moved between the 2008 annex and the 2017 annex, from diffing the two
|
|
113
|
-
# primaries. Recorded because decode tables rot (
|
|
113
|
+
# primaries. Recorded because decode tables rot (the plates spec §9) and because it
|
|
114
114
|
# shows the annex is maintained at the MUNICIPALITY level, not the code level.
|
|
115
115
|
# ---------------------------------------------------------------------------
|
|
116
116
|
changed_2008_2017:
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
# POST-MERGER identifiers T (Tipperary), L (Limerick City and County) and
|
|
24
24
|
# W (Waterford City and County).
|
|
25
25
|
#
|
|
26
|
-
# THE DISCREPANCY IS REAL AND IS RECORDED, NOT AVERAGED (
|
|
26
|
+
# THE DISCREPANCY IS REAL AND IS RECORDED, NOT AVERAGED (the plates spec §5.3): the
|
|
27
27
|
# VRT First Schedule table still reads TN / TS / LK / L / WD / W and has never
|
|
28
28
|
# been amended to add T or to merge LK into L and WD into W, while the
|
|
29
29
|
# trade-licence table WAS amended for exactly that reason — S.I. 328/2013's own
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
# Referenced by: plates/ie.yml (ie-standard-1987, ie-standard-1991,
|
|
37
37
|
# ie-standard-2013, ie-trade-1993) via region_encoding.
|
|
38
38
|
#
|
|
39
|
-
# PERIOD DISCIPLINE (
|
|
39
|
+
# PERIOD DISCIPLINE (the plates spec §2.4): these are the marks assignable to
|
|
40
40
|
# vehicles FIRST REGISTERED on or after 1 January 1987. The pre-1987 marks are a
|
|
41
41
|
# different, disjoint set and are handled in `historic_pre_1987` below — they are
|
|
42
42
|
# NOT in `codes:` and a pre-1987 plate must never be decoded through it. Marks
|
|
@@ -193,7 +193,7 @@ historic_pre_1987:
|
|
|
193
193
|
exhaustive_list_note: >-
|
|
194
194
|
The complete pre-1987 mark list is the 1958 Schedule as amended fourteen
|
|
195
195
|
times, and merging those fourteen insertions row-by-row is gate-L4 work
|
|
196
|
-
(
|
|
196
|
+
(the plates spec §7). It is deliberately NOT half-done here: a partial list read
|
|
197
197
|
as complete would make a parse API declare real plates invalid, which is
|
|
198
198
|
worse than declaring them unresolved. The amending instruments, all read and
|
|
199
199
|
all conforming to the expansion rule above, are pinned so the merge can be
|
|
@@ -98,7 +98,7 @@ cautions:
|
|
|
98
98
|
are the registering authority (RTO district) code, which no central
|
|
99
99
|
instrument enumerates and which each State creates, merges and renumbers on
|
|
100
100
|
its own. There are well over a thousand of them. They are deliberately not
|
|
101
|
-
tabled (
|
|
101
|
+
tabled (the plates spec § 2.4 mechanism-note rule) and a decode must not guess.
|
|
102
102
|
|
|
103
103
|
# ---------------------------------------------------------------------------
|
|
104
104
|
# CODES. `evidence: instrument` = the row is quoted verbatim in a gazette
|
|
@@ -146,7 +146,7 @@ codes:
|
|
|
146
146
|
- { code: "WB", name: "West Bengal", type: state, evidence: corroboration-only, verify: true }
|
|
147
147
|
|
|
148
148
|
# ---------------------------------------------------------------------------
|
|
149
|
-
# WITHDRAWN CODES. Rows are never deleted (
|
|
149
|
+
# WITHDRAWN CODES. Rows are never deleted (the plates spec § 2.4 period discipline):
|
|
150
150
|
# every one of these is still on live, valid plates, because an Indian
|
|
151
151
|
# registration mark is not reissued when a State is renamed or merged.
|
|
152
152
|
# ---------------------------------------------------------------------------
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
# (c) legally not part of the plate. On a pre-1993 plate the sigla is in the mark
|
|
34
34
|
# and denotes the province OF REGISTRATION (art. 320 D.P.R. 420/1959). Same two
|
|
35
35
|
# letters, opposite semantics, and a parse API must not blend them. This is
|
|
36
|
-
# Italy's version of the French SIV caution recorded in
|
|
36
|
+
# Italy's version of the French SIV caution recorded in the plates spec §2.4.
|
|
37
37
|
jurisdiction: it
|
|
38
38
|
topic: provinces
|
|
39
39
|
authority:
|
|
@@ -57,7 +57,7 @@ period_note: >-
|
|
|
57
57
|
later (Monza-Brianza MB, Fermo FM, Barletta-Andria-Trani BT in 2004-2009, Sud
|
|
58
58
|
Sardegna SU in 2016) never appeared on a provincial-era plate at all.
|
|
59
59
|
|
|
60
|
-
# PERIOD DISCIPLINE (
|
|
60
|
+
# PERIOD DISCIPLINE (the plates spec §2.4). D.P.R. 20 luglio 2017, n. 140 (GU
|
|
61
61
|
# 22-09-2017 n. 222) withdrew four sigle and added one, and its art. 2 comma 2
|
|
62
62
|
# states the rule every decode table of this kind needs, verbatim:
|
|
63
63
|
# "I veicoli dotati di targhe di immatricolazione con le sigle delle province,
|
|
@@ -82,7 +82,7 @@ withdrawn_rule_source: "https://www.normattiva.it/do/atto/caricaAKN?dataGU=19921
|
|
|
82
82
|
# * Three sigle carry a heraldic device the appendix describes in words and
|
|
83
83
|
# which a render pipeline must not silently drop: Aosta ("La O è sormontata
|
|
84
84
|
# dallo stemma"), Bolzano ("La Z è sormontata dallo stemma"), Trento ("La N è
|
|
85
|
-
# sormontata dallo stemma").
|
|
85
|
+
# sormontata dallo stemma"). The plates spec §3 placeholder rule applies to those
|
|
86
86
|
# three emblems.
|
|
87
87
|
maximal_munch: false
|
|
88
88
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
# 250 cm3), and § 63-4(2) to 検査対象外軽自動車 (125-250 cm3 motorcycles).
|
|
19
19
|
# One decode table therefore serves every series in plates/jp.yml.
|
|
20
20
|
#
|
|
21
|
-
# THE SCRIPT LINE (
|
|
21
|
+
# THE SCRIPT LINE (the plates spec §2.6). These marks are written in kanji and
|
|
22
22
|
# hiragana. They are NOT in the dataset's serial alphabet (A-Z 0-9), so they
|
|
23
23
|
# can never appear in a `format.pattern` or a `format.regex`; plates/jp.yml
|
|
24
24
|
# carries them as a `format.fields[]` entry with `script: kanji-hiragana` and
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
# boundary change stays valid afterwards. A decoder must therefore treat a mark
|
|
36
36
|
# as evidence of the base of use AT FIRST REGISTRATION (or last renumbering),
|
|
37
37
|
# never as a current-location signal. This is the same caution plates/gb.yml
|
|
38
|
-
# records for DVLA memory tags and
|
|
38
|
+
# records for DVLA memory tags and the plates spec §2.4 records for the French SIV.
|
|
39
39
|
#
|
|
40
40
|
# ROWS ARE NEVER DELETED. No mark has been withdrawn from 別表第一 in any
|
|
41
41
|
# revision e-Gov publishes (2017-04-01 onward): the table has only grown,
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
# instrument states a reason, and none is claimed here. What IS a sourced fact is
|
|
38
38
|
# the omission itself, which is why every set below is written out in full.
|
|
39
39
|
#
|
|
40
|
-
# SCRIPT AND CODEPOINTS (
|
|
40
|
+
# SCRIPT AND CODEPOINTS (the plates spec §4, the identity-is-form rule). The hiragana
|
|
41
41
|
# are recorded in the instrument's own characters. The Roman letters are
|
|
42
42
|
# recorded TWICE: `chars` carries the instrument's FULL-WIDTH forms exactly as
|
|
43
43
|
# e-Gov publishes them (A = U+FF21, not U+0041), and `ascii` carries the
|
|
44
44
|
# half-width normalisation that plates/jp.yml's regexes are written in, because
|
|
45
|
-
#
|
|
45
|
+
# the plates spec §2.6 confines the dataset's serial alphabet to A-Z and 0-9. The
|
|
46
46
|
# plate itself is embossed, not typeset; the width distinction is an artefact of
|
|
47
47
|
# the statute's typography, and recording both is what keeps that honest.
|
|
48
48
|
jurisdiction: jp
|
|
@@ -71,7 +71,7 @@ maximal_munch_note: >-
|
|
|
71
71
|
no mark is a prefix of another. Read exactly two syllables and stop.
|
|
72
72
|
|
|
73
73
|
# ---------------------------------------------------------------------------
|
|
74
|
-
# NAMING DRIFT, RECORDED (
|
|
74
|
+
# NAMING DRIFT, RECORDED (the plates spec §9 "region-decode tables rot").
|
|
75
75
|
# Two of the seventeen jurisdictions have been renamed since the notice's list
|
|
76
76
|
# was last set, and the notice still prints the OLD full names. The two-syllable
|
|
77
77
|
# MARKS are unaffected — 강원 and 전북 are what the plate shows either way — so
|
|
@@ -376,5 +376,5 @@ verification:
|
|
|
376
376
|
Apéndice C also carries per-entity allocations for autobuses, remolques,
|
|
377
377
|
convertidores, motocicletas (three grammars), demostración, ecológicos,
|
|
378
378
|
ambulancias, bomberos, protección civil and escoltas. They are sourced at
|
|
379
|
-
exactly the same quality and are omitted for scope (
|
|
379
|
+
exactly the same quality and are omitted for scope (the plates spec §2.5).
|
|
380
380
|
Extending this file needs no new sourcing, only transcription.
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
# Called once per code, 2026-08-03 00:47:43 to 00:49:21 (+08).
|
|
34
34
|
# 28 of 32 returned a reading.
|
|
35
35
|
# The second endpoint is the closest thing Malaysia has to the registry
|
|
36
|
-
# corpora
|
|
36
|
+
# corpora the plates spec §5.2 uses elsewhere: it is the authority stating, on the
|
|
37
37
|
# record and to the minute, what it is issuing. Those readings are the evidence
|
|
38
38
|
# behind BOTH standard series in plates/my.yml and are reproduced per row as
|
|
39
39
|
# `observed_2026_08_03`.
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
# each colliding pair — so Sibu, Sri Aman and Limbang, which are real Sarawak
|
|
53
53
|
# divisions with real plates on the road, have no row in the live list at all.
|
|
54
54
|
# Both captures are recorded below and neither is silently preferred
|
|
55
|
-
# (
|
|
55
|
+
# (the plates spec §5.3: record disagreements, never average them). The practical
|
|
56
56
|
# reading is that the JPJ code is a QUERY KEY for a counter, not a bijection
|
|
57
57
|
# with a place, and a decode consumer must treat the mapping as MANY-TO-ONE in
|
|
58
58
|
# both directions.
|
|
@@ -133,7 +133,7 @@ areas:
|
|
|
133
133
|
codes:
|
|
134
134
|
- { code: SA, area: "Kota Kinabalu (West Coast)", observed_2026_08_03: "SJT 4199", form: prefix, evidence: agency-api, note: "queried as SA, issuing SJ-series — the drift is explicit here" }
|
|
135
135
|
- { code: SB, area: Beaufort, observed_2026_08_03: "SB 1644 L", form: suffix, evidence: agency-api }
|
|
136
|
-
- { code: SD, area: "Lahat Datu", observed_2026_08_03: "SPA 3076", form: prefix, evidence: agency-api, note: "JPJ spells it 'Lahat Datu'; the town is conventionally Lahad Datu. The authority's spelling is kept, per
|
|
136
|
+
- { code: SD, area: "Lahat Datu", observed_2026_08_03: "SPA 3076", form: prefix, evidence: agency-api, note: "JPJ spells it 'Lahat Datu'; the town is conventionally Lahad Datu. The authority's spelling is kept, per the plates spec §5.3." }
|
|
137
137
|
- { code: SK, area: Kudat, observed_2026_08_03: "SK 4097 H", form: suffix, evidence: agency-api }
|
|
138
138
|
- { code: SM, area: Sandakan, observed_2026_08_03: null, form: unknown, evidence: agency-api, note: "one of TWO codes JPJ maps to Sandakan; see the disagreement note in the header" }
|
|
139
139
|
- { code: SS, area: Sandakan, observed_2026_08_03: "SMW 5063", form: prefix, evidence: agency-api, note: "queried as SS, issuing SM-series" }
|
|
@@ -210,7 +210,7 @@ diplomatic_dc:
|
|
|
210
210
|
gap: >-
|
|
211
211
|
THE COUNTRY-CODE TABLE IS NOT ON THIS PAGE and was not located anywhere.
|
|
212
212
|
The number group above is the RANK group; the sending state's code is a
|
|
213
|
-
separate printed group whose allocation is unsourced.
|
|
213
|
+
separate printed group whose allocation is unsourced. The plates spec puts
|
|
214
214
|
diplomatic decode tables at L4 and this one is deliberately left there
|
|
215
215
|
rather than guessed.
|
|
216
216
|
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
# gazette printed. From the 2006 instrument's entry into force the operative
|
|
24
24
|
# code is VI; VS is on the road on every trailer plated between 2005 and 2006
|
|
25
25
|
# and on every earlier one issued under the same code. A parse API must accept
|
|
26
|
-
# BOTH — which is exactly the "decode tables rot" hazard
|
|
26
|
+
# BOTH — which is exactly the "decode tables rot" hazard the plates spec §9 names,
|
|
27
27
|
# caught here inside a single fourteen-month window.
|
|
28
28
|
#
|
|
29
29
|
# WHAT THIS TABLE IS NOT: it is not a district-code table for cars. There has
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
# the DIGIT BLOCK ALWAYS FOLLOWS THE CODE. In "B12ABC" the character after B
|
|
33
33
|
# is a digit, so the code is one letter; in "BC12ABC" it is a letter, so the
|
|
34
34
|
# code is two. The rule is mechanical and total, and it survives separator
|
|
35
|
-
# stripping (
|
|
35
|
+
# stripping (the plates spec §2.6), which is exactly when a decoder needs it most.
|
|
36
36
|
#
|
|
37
37
|
# 3. THESE ARE NOT THE PRE-1992 CODES. The communist-era system used a different
|
|
38
38
|
# territorial letter set built on the administrative regions of the day — the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# plates/_decode/se-diplomatic.yml — Swedish beskickningsskylt country codes.
|
|
2
2
|
#
|
|
3
|
-
# WHY THIS IS A _decode FILE AND NOT AN INLINE TABLE (
|
|
3
|
+
# WHY THIS IS A _decode FILE AND NOT AN INLINE TABLE (the plates spec §2.4): 128
|
|
4
4
|
# rows is past the "small" threshold that put FZV Anlage 2 inline in de.yml,
|
|
5
5
|
# and it is a CLOSED, PRIMARY list — Transportstyrelsen publishes the whole
|
|
6
6
|
# thing, so it qualifies on the other limb of the rule ("a reference … if the
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
# NOT A COMPLETE ARMS CATALOGUE. This file names the upravne enote whose seat
|
|
37
37
|
# municipality supplies each shield; it does NOT carry the 58 blazons, their
|
|
38
38
|
# artwork or their licensing. Municipal arms are protected independently of
|
|
39
|
-
# copyright and
|
|
39
|
+
# copyright and the plates spec §3 puts them in the placeholder slot
|
|
40
40
|
# (`design.emblem.rendered: placeholder` in plates/si.yml). Recorded gap:
|
|
41
41
|
# a per-upravna-enota arms ledger.
|
|
42
42
|
jurisdiction: si
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
# The two never appear on the same plate.
|
|
28
28
|
#
|
|
29
29
|
# ---------------------------------------------------------------------------
|
|
30
|
-
# THE SCRIPT PROBLEM — recorded, never folded away (
|
|
30
|
+
# THE SCRIPT PROBLEM — recorded, never folded away (the plates spec §2.6).
|
|
31
31
|
# ---------------------------------------------------------------------------
|
|
32
32
|
script:
|
|
33
33
|
printed: Cyrillic (Ukrainian)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# The controlled vocabulary of plate classes (
|
|
1
|
+
# The controlled vocabulary of plate classes (the plates spec §2.3). A class is a
|
|
2
2
|
# LEGAL/ADMINISTRATIVE issuance category, not a design variant. A
|
|
3
3
|
# jurisdiction's variant becomes its OWN SERIES iff format OR design OR
|
|
4
4
|
# period differs from the standard series; a color-only variant of the same
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# plates/_meta/separators.yml — THE NORMATIVE SEPARATOR CHARACTER SET.
|
|
2
2
|
#
|
|
3
|
-
#
|
|
3
|
+
# the plates spec §2.6 declares this contract in prose; this file is its
|
|
4
4
|
# machine-readable form, and `scripts/lint_plates.rb` enforces the dataset
|
|
5
5
|
# against THIS file (single source of truth — the lint hardcodes nothing).
|
|
6
6
|
#
|