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.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -7
  3. data/README.md +353 -69
  4. data/data/PROVENANCE-vehicles.md +2 -2
  5. data/data/plates/PROVENANCE.md +2 -2
  6. data/data/plates/_decode/at-districts.yml +2 -2
  7. data/data/plates/_decode/cn-issuing-offices.yml +2 -2
  8. data/data/plates/_decode/cn-provinces.yml +2 -2
  9. data/data/plates/_decode/cz-kraj.yml +1 -1
  10. data/data/plates/_decode/dk-serial-blocks.yml +1 -1
  11. data/data/plates/_decode/es-provinces.yml +1 -1
  12. data/data/plates/_decode/fr-departements.yml +2 -2
  13. data/data/plates/_decode/gb-age-identifiers.yml +1 -1
  14. data/data/plates/_decode/gb-memory-tags.yml +1 -1
  15. data/data/plates/_decode/gr-prefectures.yml +1 -1
  16. data/data/plates/_decode/hr-cities.yml +3 -3
  17. data/data/plates/_decode/ie-counties.yml +3 -3
  18. data/data/plates/_decode/in-state-codes.yml +2 -2
  19. data/data/plates/_decode/it-provinces.yml +3 -3
  20. data/data/plates/_decode/jp-office-marks.yml +2 -2
  21. data/data/plates/_decode/jp-use-marks.yml +2 -2
  22. data/data/plates/_decode/kr-authority-marks.yml +1 -1
  23. data/data/plates/_decode/mx-entity-series.yml +1 -1
  24. data/data/plates/_decode/my-index-marks.yml +4 -4
  25. data/data/plates/_decode/pt-trailer-services.yml +1 -1
  26. data/data/plates/_decode/ro-counties.yml +1 -1
  27. data/data/plates/_decode/se-diplomatic.yml +1 -1
  28. data/data/plates/_decode/si-regions.yml +1 -1
  29. data/data/plates/_decode/ua-regions.yml +1 -1
  30. data/data/plates/_meta/classes.yml +1 -1
  31. data/data/plates/_meta/separators.yml +1 -1
  32. data/data/plates/ad.yml +555 -52
  33. data/data/plates/ar.yml +8 -8
  34. data/data/plates/at.yml +91 -10
  35. data/data/plates/au-act.yml +13 -13
  36. data/data/plates/au-nsw.yml +9 -9
  37. data/data/plates/au-nt.yml +13 -14
  38. data/data/plates/au-qld.yml +7 -7
  39. data/data/plates/au-sa.yml +7 -7
  40. data/data/plates/au-tas.yml +10 -10
  41. data/data/plates/au-vic.yml +6 -6
  42. data/data/plates/au-wa.yml +8 -8
  43. data/data/plates/be.yml +11 -11
  44. data/data/plates/br.yml +14 -14
  45. data/data/plates/ca-ab.yml +10 -10
  46. data/data/plates/ca-bc.yml +6 -6
  47. data/data/plates/ca-mb.yml +4 -4
  48. data/data/plates/ca-nb.yml +9 -9
  49. data/data/plates/ca-nl.yml +11 -11
  50. data/data/plates/ca-ns.yml +12 -12
  51. data/data/plates/ca-nt.yml +7 -7
  52. data/data/plates/ca-nu.yml +7 -7
  53. data/data/plates/ca-on.yml +21 -21
  54. data/data/plates/ca-pe.yml +13 -13
  55. data/data/plates/ca-qc.yml +11 -11
  56. data/data/plates/ca-sk.yml +6 -6
  57. data/data/plates/ca-yt.yml +6 -6
  58. data/data/plates/ch.yml +14 -14
  59. data/data/plates/cn.yml +9 -9
  60. data/data/plates/cy.yml +6 -6
  61. data/data/plates/cz.yml +9 -9
  62. data/data/plates/de.yml +8 -8
  63. data/data/plates/dk.yml +12 -12
  64. data/data/plates/ee.yml +13 -13
  65. data/data/plates/eg.yml +708 -0
  66. data/data/plates/es.yml +8 -8
  67. data/data/plates/fi.yml +14 -14
  68. data/data/plates/fr.yml +12 -12
  69. data/data/plates/gb.yml +16 -16
  70. data/data/plates/gr.yml +14 -14
  71. data/data/plates/hr.yml +15 -15
  72. data/data/plates/hu.yml +16 -16
  73. data/data/plates/ie.yml +7 -7
  74. data/data/plates/in.yml +7 -7
  75. data/data/plates/is.yml +3 -3
  76. data/data/plates/it.yml +21 -21
  77. data/data/plates/jp.yml +121 -121
  78. data/data/plates/kr.yml +6 -6
  79. data/data/plates/li.yml +6 -6
  80. data/data/plates/lt.yml +10 -10
  81. data/data/plates/lu.yml +4 -4
  82. data/data/plates/lv.yml +9 -9
  83. data/data/plates/mc.yml +4 -4
  84. data/data/plates/mt.yml +5 -5
  85. data/data/plates/mx.yml +7 -7
  86. data/data/plates/my.yml +18 -18
  87. data/data/plates/ng.yml +346 -0
  88. data/data/plates/nl.yml +5 -5
  89. data/data/plates/no.yml +7 -7
  90. data/data/plates/nz.yml +18 -18
  91. data/data/plates/pl.yml +4 -4
  92. data/data/plates/pt.yml +13 -5
  93. data/data/plates/ro.yml +14 -14
  94. data/data/plates/se.yml +13 -13
  95. data/data/plates/si.yml +8 -8
  96. data/data/plates/sk.yml +15 -15
  97. data/data/plates/sm.yml +7 -7
  98. data/data/plates/th.yml +10 -10
  99. data/data/plates/tr.yml +432 -0
  100. data/data/plates/ua.yml +9 -9
  101. data/data/plates/us-ak.yml +11 -11
  102. data/data/plates/us-al.yml +12 -12
  103. data/data/plates/us-ar.yml +15 -15
  104. data/data/plates/us-as.yml +10 -10
  105. data/data/plates/us-az.yml +10 -10
  106. data/data/plates/us-ca.yml +13 -13
  107. data/data/plates/us-co.yml +14 -14
  108. data/data/plates/us-ct.yml +24 -24
  109. data/data/plates/us-dc.yml +7 -7
  110. data/data/plates/us-de.yml +10 -10
  111. data/data/plates/us-fl.yml +17 -17
  112. data/data/plates/us-ga.yml +10 -10
  113. data/data/plates/us-gu.yml +11 -11
  114. data/data/plates/us-hi.yml +11 -11
  115. data/data/plates/us-ia.yml +9 -9
  116. data/data/plates/us-id.yml +13 -13
  117. data/data/plates/us-il.yml +11 -11
  118. data/data/plates/us-in.yml +9 -9
  119. data/data/plates/us-ks.yml +8 -8
  120. data/data/plates/us-ky.yml +11 -11
  121. data/data/plates/us-la.yml +11 -11
  122. data/data/plates/us-ma.yml +10 -10
  123. data/data/plates/us-md.yml +7 -7
  124. data/data/plates/us-me.yml +16 -16
  125. data/data/plates/us-mi.yml +8 -8
  126. data/data/plates/us-mn.yml +13 -13
  127. data/data/plates/us-mo.yml +13 -13
  128. data/data/plates/us-mp.yml +12 -12
  129. data/data/plates/us-ms.yml +8 -8
  130. data/data/plates/us-mt.yml +12 -12
  131. data/data/plates/us-nc.yml +12 -12
  132. data/data/plates/us-nd.yml +10 -10
  133. data/data/plates/us-ne.yml +10 -10
  134. data/data/plates/us-nh.yml +8 -8
  135. data/data/plates/us-nj.yml +8 -8
  136. data/data/plates/us-nm.yml +14 -14
  137. data/data/plates/us-nv.yml +18 -18
  138. data/data/plates/us-ny.yml +17 -17
  139. data/data/plates/us-oh.yml +13 -13
  140. data/data/plates/us-ok.yml +12 -12
  141. data/data/plates/us-or.yml +15 -15
  142. data/data/plates/us-pa.yml +14 -14
  143. data/data/plates/us-pr.yml +15 -15
  144. data/data/plates/us-ri.yml +10 -10
  145. data/data/plates/us-sc.yml +7 -7
  146. data/data/plates/us-sd.yml +12 -12
  147. data/data/plates/us-tn.yml +8 -8
  148. data/data/plates/us-tx.yml +17 -17
  149. data/data/plates/us-ut.yml +12 -12
  150. data/data/plates/us-va.yml +14 -14
  151. data/data/plates/us-vi.yml +16 -16
  152. data/data/plates/us-vt.yml +9 -9
  153. data/data/plates/us-wa.yml +18 -18
  154. data/data/plates/us-wi.yml +8 -8
  155. data/data/plates/us-wv.yml +9 -9
  156. data/data/plates/us-wy.yml +10 -10
  157. data/data/plates/va.yml +7 -7
  158. data/data/plates/za.yml +11 -11
  159. data/data/vehicles.json +121081 -62015
  160. data/lib/generators/vehicles/templates/initializer.rb +21 -12
  161. data/lib/generators/vehicles/templates/vehicles_refresh_job.rb +8 -4
  162. data/lib/vehicles/color.rb +8 -1
  163. data/lib/vehicles/colors.rb +14 -10
  164. data/lib/vehicles/configuration.rb +82 -3
  165. data/lib/vehicles/data_source.rb +220 -0
  166. data/lib/vehicles/dataset.rb +38 -6
  167. data/lib/vehicles/dataset_resolution.rb +39 -3
  168. data/lib/vehicles/dataset_slice.rb +90 -0
  169. data/lib/vehicles/hosted_result.rb +94 -0
  170. data/lib/vehicles/http.rb +75 -7
  171. data/lib/vehicles/id_lookup.rb +37 -0
  172. data/lib/vehicles/kind_rule.rb +63 -0
  173. data/lib/vehicles/labels.rb +131 -0
  174. data/lib/vehicles/make.rb +45 -19
  175. data/lib/vehicles/model.rb +66 -19
  176. data/lib/vehicles/model_match.rb +16 -2
  177. data/lib/vehicles/model_matcher.rb +6 -7
  178. data/lib/vehicles/plates/series.rb +87 -8
  179. data/lib/vehicles/plates/template_fill.rb +2 -2
  180. data/lib/vehicles/plates/templates.rb +9 -5
  181. data/lib/vehicles/plates.rb +54 -8
  182. data/lib/vehicles/providers/hosted_provider.rb +145 -32
  183. data/lib/vehicles/providers/local_provider.rb +2 -2
  184. data/lib/vehicles/refresh_result.rb +74 -0
  185. data/lib/vehicles/refresher.rb +190 -54
  186. data/lib/vehicles/release_checks.rb +72 -0
  187. data/lib/vehicles/text_matcher.rb +19 -10
  188. data/lib/vehicles/validators/vehicle_make_validator.rb +18 -1
  189. data/lib/vehicles/validators/vehicle_model_validator.rb +17 -1
  190. data/lib/vehicles/version.rb +1 -1
  191. data/lib/vehicles.rb +119 -67
  192. data/rakelib/data_refresh.rake +1 -1
  193. data/rakelib/plates_refresh.rake +1 -1
  194. data/sig/vehicles.rbs +67 -13
  195. metadata +13 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad4bfedaec8a545537a02ae2952769d89ebe8fda56a3643687030af44482009e
4
- data.tar.gz: 19589e34b13ea5ce0a31e06482378a5324f4b9b3897f91c31e72375d9b5639a5
3
+ metadata.gz: aa213b02a603746bbd7c6bfca44ca4dd68b4d22a24d82fdf2a4e4742447f0d70
4
+ data.tar.gz: b1cf8cddd58344ec2bc8bc780619103f4b4f0374f34472595a48531247022d8f
5
5
  SHA512:
6
- metadata.gz: d26f0e4edf6cbe436184469c069dacc6df746aa77241acecfe5cf77cbd4dc88d48b1d3d084cf2bdddf02fa32709c39b72eaba7f0fc6f4a7254e1e08ee7b5a6ad
7
- data.tar.gz: e1ddc6f6bcc52f4b08e1377bae670e97ecf4e4dd9937712c685c73c28813df3c8a910b90459ec8ebe9b09eafe3d16255380cfe8155146d2c07db0003c9c0a8a7
6
+ metadata.gz: c02046f4ca89a6abbcdb7666db048bd28650960e28d4f41c277d0dba9efd4ef1489abf2534e80fb7d7be21b3451d824cc5150cc1c77145b47b26b9b4b36aecab
7
+ data.tar.gz: 0c9bebfcb0fe391fdb1119a071aa019495283ca056be8a4ad94632d88a407b5318cb5289de6d2126b672ca3bf2c461f47fe466e6a81b9a5ecef97aa67a07d0e2
data/CHANGELOG.md CHANGED
@@ -7,6 +7,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.2] - 2026-11-10
11
+
12
+ Everything below the plates fixes comes from dogfooding the gem in a production Rails app (CarHey) and making each workaround it had to write a general feature.
13
+
14
+ ### Upgrade notes
15
+ - **Car-only apps: pass `kind: :car` (or `kinds: [:car]`) when you canonicalize.** Without a kind the collision rule now answers the most-registered kind, so `match_model("Volkswagen", "Caddy")` is `van/volkswagen/caddy` (Berlingo, Transit, Hilux… likewise). Stored ids are unaffected; only what an unhinted string means changes. CarHey: `Vehicle.canonical_identity` must call `Vehicles.match_model(make, model, kind: :car)`.
16
+ - `refresh!` now refuses releases it used to accept; check `Vehicles.refresh.reason` if your data stops moving.
17
+ - `Model#==` compares ids: code that relied on a car and a van "being equal" (Set/uniq/hash keys) now keeps both.
18
+
19
+ ### Changed (behaviour)
20
+ - **One kind-collision rule, shared by every VehiclesDB surface** (`Vehicles::KindRule`; vehiclesdb RESOLUTION.md §3). When one nameplate is several records (Iveco "Daily" is a van, a truck and a bus) and no kind is given, `Vehicles.model`, `Make#model`, `match_model` and `identify` pick the lowest `mass_decile`, then van → car → bus → truck → moped → motorcycle, then the id. Until 0.9.1 the gem preferred the car (else file order) while the SDKs used another tie-break, so the stored id depended on the door a user came through. Backtested on register counts, the rule picks the most-registered kind in 87% of collision groups (car-first: 43%). Pass `kind:` to keep a kind.
21
+ - **`Model#==`, `eql?` and `hash` compare the canonical id**, not the composite slug: the car and the van of one nameplate are no longer equal (they used to collapse in sets, `uniq` and hash keys).
22
+ - `Vehicles.refresh!` keeps returning true/false, but now true means "the app has the latest release" (written, or already current), and it refuses releases it used to accept (see Safe refresh).
23
+ - `Model#image(year:)` sends `year` to the API instead of silently dropping it; the API answers `422 unsupported_filter` until year-accurate images ship, so `image(year:)` is nil and `images_result` says why.
24
+ - A refreshed cache older than the gem's bundled data, or in a schema the gem does not read, is no longer served.
25
+ - `Model#to_h` gains `id`, `model_slug`, `forms`, `registration_years`; `ModelMatch#to_h` gains `id` and `confident`.
26
+
27
+ ### Added
28
+ - **Safe refresh.** `Vehicles.refresh` returns a `Vehicles::RefreshResult` (`status` :updated/:current/:rejected/:failed, `reason`, `version`, `previous_version`, `message`; never raises). It reads the release manifest first (`config.manifest_url`, derived from `data_url`): an unsupported schema or an older version is refused and the same version downloads nothing. The payload is fetched from the announced release (jsDelivr `@latest` pinned to it), must carry that version and schema, match the manifest's per-kind model counts and its sha256 when published, keep every kind and (kind, country) slice at or above `config.refresh_min_ratio` (0.9) of the data in use, and pass the optional `config.refresh_guard`. Written atomically.
29
+ - **Every process adopts a new dataset on its own**: at most every `config.reload_check_interval` seconds (default 5) a call stats the file and reloads when it changed — no restart, no executor hook. A corrupt file never replaces the dataset in memory. `config.cache_dir` (or `VEHICLES_CACHE_DIR`) puts the cache on a shared volume, so one refresh reaches every container. README: "Staying current" has the multi-container recipe.
30
+ - **Canonical ids**: `Model#id` (`"car/volkswagen/golf"`), `Vehicles.by_id(id, follow: true)` (follows `former_ids`; a split id answers nil), `Vehicles.successor(id)` (the id to store now), `Vehicles.live?(id)`. Make `former_slugs` are read when the dataset publishes them (`Make#former_slugs`, `Vehicles.make("old-slug")`, `by_id` across a make rename); a no-op until then.
31
+ - **`kinds:`** on `Vehicles.model`, `match_model`, `identify`, `by_id`, `catalog` and `Make#model`: a hard filter on every rung, ids included (`identify("bus/iveco/daily", kinds: [:car])` → nil). `kind:` keeps scoping the name rungs and never overrides an explicit id.
32
+ - **`ModelMatch#confident?`**: an answer from a curated rung (exact, former_id, fold, alias, form, cleaned), never fuzzy or ambiguous — the recommended threshold for writing a match back without asking.
33
+ - **Per-country catalog**: `country:` on `Vehicles.catalog`, `makes`, `models`, `make_options` and `model_options` (models with official evidence there, in that country's own order). `top_models(limit: nil)` returns every match.
34
+ - **Labels in English and Spanish** (the same strings as the JS/Python SDKs): `Vehicles.colors(locale: :es)`, `Vehicles.color_options(locale: :es)`, `Color#label(:es)`, `Vehicles.kind_label` / `kind_options`, `Vehicles.body_type_label` / `body_type_options`. `Vehicles.color` resolves Spanish input ("Rojo", "marrón", "plateada", "granate"). English labels for `wagon`/`coupe` read "Wagon"/"Coupe".
35
+ - **Hosted errors are no longer silent**: `Model#images_result` returns a `Vehicles::HostedResult` (`reason`, `status`, the API's own `error` code, `url(size)`); `config.on_hosted_error` and a warn log line fire for 401/402/403/429/5xx/timeouts (never for a missing image). Image payloads are cached (`config.image_cache`, in-process by default; `image_cache_ttl` 1 day capped by the payload's `expires_at`, `image_miss_ttl` 10 min for 404s; errors never cached). `exact_color: true` answers nil instead of another color's image and remembers the palette so an unavailable color costs no request. ActiveSupport notifications `request.vehicles` / `refresh.vehicles` when present.
36
+ - **`Vehicles.dataset_slice(kind:, kinds:, country:, region:)`**: the `catalog` scope as records in the shape of the published `dist/vehicles.json` (a Hash, ready for `to_json`): make and model slugs, kinds, aliases, forms, former ids, availability, deciles, country ranks and registration years, plus the release's version and CC-BY attribution. It is what the make-model-dropdown widget's `data` option (0.4.1) and the JS/Python SDKs' dataset mode read, so a page can embed its scope and resolve stored values and canonical ids with no CDN or API request. Lean: no `regions` or `body_type`, and with `country:` the per-country fields keep only that country (Spain's cars on data 2026.11.3: ~360 KB of JSON, ~57 KB gzipped). README: a Rails recipe that embeds it.
37
+ - `Model#registration_years`: `{ first:, last: }` — the first and last year in official registrations, when the dataset publishes it (dataset 2026.11.3 publishes it for ~9,900 of 16,032 records). A hint, never a validation bound; `Model#years` docs now say plainly that production years are not published yet.
38
+ - Plates: `Match#reason` (`:ok`, `:unverifiable`, `:excluded_letters`, `:bad_shape`, `:empty`, `:unknown_jurisdiction` — the API's codes), `Match#excluded_letters`, `Match#passenger?` and `Series#passenger?` (issued to passenger-carrying vehicles; trailer and tractor series are not).
39
+ - Validators take `kind:`, `kinds:` and `country:` (`vehicle_make: { kind: :car, country: :es }`).
40
+ - `Plates::Match#near_misses`: the series whose shape a plate has but whose issuing alphabet it breaks ("1234 ABC" → `es-national-2000`: Spain issues no vowels, Ñ or Q). Empty whenever the plate hits a strict series. Lets a form explain the rejection. `Series#matching` and `Series#recall_lenient_regexp` back it, and `Series#letters` (the issued letter set, when the dataset enumerates one) tells a form whether the alphabet is what failed.
41
+
42
+ ### Fixed
43
+ - The hosted client follows a former id's `301` (same origin only, so the key never leaves the host): images no longer vanish around a rename or a gem/API version skew.
44
+ - `Vehicles.regions` follows the dataset in effect (it was memoized once per process).
45
+ - Docs: the "car catalog is tens of KB" claim (it is ~63 KB worldwide, ~14 KB for one country), `Model::KINDS` ("all :car"), and the initializer's "EU market" text.
46
+ - **`Plates::Series#strict?` now reads the dataset's `matching:` key** (the plates spec §2.7, normative) instead of inferring strictness from a `regex_strict` twin being present. The spec forbids that inference: most strict series need no twin because their `regex` already is the issuing grammar. 668 strict series were answering `strict? == false` before, among them Portugal's whole national range (AA-00-AA) and the Spanish CD/CC/OI/TA, military and police series. `Match#strict?` follows. Found by dogfooding: 2 of CarHey's 3 Portuguese cars validated as "recall-only".
47
+ - `Match#formatted` / `Series#format_serial` no longer invent a split when the series' regex can split a serial more than one way (`Series#ambiguous_split?`): "CD12345" and "CD123456" come back as stored instead of "CD-1234-5" / the representative "CD-123-456". This runs before the display-pattern walk; 22 series with variable-width groups (ES diplomatic, personalised and special-index plates) are affected.
48
+ - `Plates.template_series` (what `Plates.render` draws) prefers strict hits over recall-only ones: a Spanish "CD-123-456" is drawn as the diplomatic series, not as the 1900–1971 numeric catch-all it also fits.
49
+
50
+ ### Changed
51
+ - Bundled data refreshed to VehiclesDB v2026.11.6 (16,327 models) and its conformance file from vehiclesdb main (with the vehiclesdb#397 kind-collision cases and the corrected E-Klasse case). Since 2026.11.3 the dataset is the first release to publish make `former_slugs` (`Vehicles.make("renault-alpine")` is Alpine, `by_id("car/renault-alpine/a110")` follows it), model `registration_years` and per-file `sha256`/`bytes` in the manifest's `dist_files`, which `Vehicles.refresh` now verifies on real releases. The gem's readers already used the shipped names.
52
+ - v2026.11.2, bundled earlier in this cycle, restyled names such as "León", "XCeed", "ProCeed".
53
+ - Bundled plates corpus refreshed to vehiclesdb `db0ec0a`: adds Egypt, Nigeria and Türkiye (127 jurisdictions, 1,409 series) and the Andorra and Austria verification corrections.
54
+
55
+ ## [0.9.1] - 2026-11-09
56
+
57
+ ### Changed
58
+ - Bundled data refreshed to VehiclesDB v2026.11.1: 15,635 models. Passenger versions of van-based MPVs now also publish in kind `car` (Caddy, Berlingo, Kangoo, Rifter, Tourneo Custom/Courier/Connect, Transit Custom, Doblò and more), plus the VW Multivan, GWM Ora 5, Ebro S800/S900, the Alfa Romeo 6C/8C classics and 24 typo-twin folds. Every retired id resolves through `former_ids`. Spanish new-car registrations landing on a published record go from 90.2% to 96.5%.
59
+
10
60
  ## [0.9.0] - 2026-11-09
11
61
 
12
62
  ### Changed
@@ -118,7 +168,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
118
168
  template per window, not one per call. Keys carry the template schema and
119
169
  gem version.
120
170
  - `Vehicles::Plates::TemplateFill`: the reference filler, moved verbatim from
121
- vehiclesdb-web (`fill`, `metadata`, `groups`, and the shared fit formulas
171
+ the VehiclesDB web app (`fill`, `metadata`, `groups`, and the shared fit formulas
122
172
  `fit_size` / `recentered_baseline` the VehiclesDB renderer will call from
123
173
  here), plus `shape_of` and a `label:` option for a localized accessible
124
174
  name. Standard library only; the file loads on its own in a gem-less Ruby.
@@ -264,7 +314,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
264
314
 
265
315
  ### Changed
266
316
 
267
- - Plates dataset refreshed — the overnight swarm passes' settlements
317
+ - Plates dataset refreshed — the overnight verification passes' settlements
268
318
  land: the Cypriot centre date mark, Brazil's square-dot printed form
269
319
  and photographed moto split, San Marino's structured legend/sigla
270
320
  fields, Ukraine's statutory line counts, California's pixel-sampled
@@ -381,7 +431,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
381
431
 
382
432
  ## [0.6.0] - 2026-07-27
383
433
 
384
- License plates become a first-class citizen: the PRD-PLATES registration-mark
434
+ License plates become a first-class citizen: the VehiclesDB registration-mark
385
435
  dataset ships in the gem, bundled and offline like everything else.
386
436
 
387
437
  ### Added
@@ -401,20 +451,20 @@ The hosted images API is **live** — this release points the wired-up provider
401
451
  seam at the real thing.
402
452
 
403
453
  ### Added
404
- - `Model#image(color:, size:)` returns a rendered variant URL from the live
454
+ - `Model#image(color:, size:)` returns an image variant URL from the live
405
455
  VehiclesDB images API (`:sm` 320×180, `:md` 640×360, `:lg` 1280×720, webp).
406
456
  Mint a key at <https://vehiclesdb.com/settings/api-keys> and set
407
457
  `config.api_key`; without a key it stays nil, as always.
408
458
  - `Model#images(color:)` returns the full payload: every variant with
409
- dimensions, the rendered palette for the model, served-vs-requested color
410
- (un-rendered colors fall back honestly instead of 404ing), provenance.
459
+ dimensions, the available palette for the model, served-vs-requested color
460
+ (unavailable colors fall back honestly instead of 404ing), provenance.
411
461
 
412
462
  ### Changed
413
463
  - `config.api_base_url` default is now `https://vehiclesdb.com` (the live API
414
464
  origin; endpoint paths carry `/v1`). It must be an ORIGIN — no path suffix.
415
465
  - `Model#image` accepts `year:` but does not send it: `year`/`trim` are
416
466
  reserved filters server-side (the API 422s on them by contract) until
417
- year-accurate renders ship.
467
+ year-accurate images ship.
418
468
 
419
469
  ## [0.4.1] - 2026-07-26
420
470