vindetta 0.25.0 → 0.26.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3dbbe61deb1b5f0e99e9008cf72c6245fd4dbd0c
4
- data.tar.gz: fcd8b4049b037d0f9b6d3014982ebe5f6be94b10
2
+ SHA256:
3
+ metadata.gz: d17115ba1622676f7ec5f5754946f226cbda385ec41b0bb76c269d07b9d9657b
4
+ data.tar.gz: a639b9184e39f2a630fb6535c65f2c4c0ae36a1f8555c98712d7e5688d555954
5
5
  SHA512:
6
- metadata.gz: fed19a59cae3e7a4ccafbeeac0b723efc82671ddef1b391a9d80af0d2ed5d03578ee4a27a6dad7200b3cd2b9cd9c2820e927037174dc859aae1db62703a75244
7
- data.tar.gz: 64b175741142d7f8f1ff645fab7e573a4677e777cce29731585e69a69b2c687f7a670491e689acd2cf5e2c1793eb922ba557b232537bf4ced7ecbd0c0e1d7b7f
6
+ metadata.gz: bbd07e6cfdc8b0c7eeb0ba7923231289b1fc73be6866ecb3a7cb792bf5fa1d0bd2b7c8e4c145f9cf12270e211aa8e92d4bdb2e0072221204bcadefe1ac8a7b8d
7
+ data.tar.gz: 52fce861df144063ad9d52c3d57c6aa45c38c4abe1c6953b258cad252aa02e1d63809c643591b54d7243a3236acee71ee57cb9b415fbe4648adee26eb78abe5e
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  gemspec
data/Guardfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  guard :rspec, cmd: "bundle exec rspec" do
2
4
  require "guard/rspec/dsl"
3
5
 
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Vindetta
2
-
2
+ [![Gem version](http://img.shields.io/gem/v/vindetta.svg)](http://rubygems.org/gems/vindetta)
3
3
  [![Build Status](https://travis-ci.org/kyledecot/vindetta.svg?branch=master)](https://travis-ci.org/kyledecot/vindetta)
4
4
  [![Code Climate](https://codeclimate.com/github/kyledecot/vindetta/badges/gpa.svg)](https://codeclimate.com/github/kyledecot/vindetta)
5
5
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "pry"
4
5
  require "bundler/setup"
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "vindetta"
5
+ require "vindetta/cli"
4
6
 
5
7
  exit Vindetta::CLI.run(ARGV)
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "vindetta/calculator"
2
- require "vindetta/cli"
3
4
  require "vindetta/decoder"
4
5
  require "vindetta/generator"
5
6
  require "vindetta/standard"
@@ -1,25 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vindetta
2
4
  class Calculator
3
5
  InvalidCharacterError = Class.new(StandardError)
4
6
 
5
7
  def self.check_digit(vin)
6
- transliterator = -> (c) do
8
+ transliterator = lambda do |c|
7
9
  index = "0123456789.ABCDEFGH..JKLMN.P.R..STUVWXYZ".chars.index(c)
8
10
 
9
11
  raise InvalidCharacterError if index.nil?
10
12
 
11
- index % 10
13
+ index % 10
12
14
  end
13
15
 
14
- summer = -> (sum, (a, b)) do
16
+ summer = lambda do |sum, (a, b)|
15
17
  sum + (a * b)
16
18
  end
17
19
 
18
20
  sum = vin
19
- .chars
20
- .map(&transliterator)
21
- .zip([8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2])
22
- .reduce(0, &summer)
21
+ .chars
22
+ .map(&transliterator)
23
+ .zip([8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2])
24
+ .reduce(0, &summer)
23
25
 
24
26
  "0123456789X"[sum % 11]
25
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "gli"
2
4
  require "vindetta/version"
3
5
  require "i18n"
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vindetta
2
4
  class Decoder
5
+ attr_reader :standard
6
+
3
7
  BASE_MODEL_YEAR = 1980
4
- ALPHA = ('A'..'Z').to_a
8
+ ALPHA = ("A".."Z").to_a
5
9
  NUMERIC = ("0".."9").to_a
6
10
 
7
11
  def initialize(standard)
@@ -9,19 +13,30 @@ module Vindetta
9
13
  end
10
14
 
11
15
  def vin(vin)
12
- {
13
- :plant_code => vin[PLANT_CODE_INDEX],
14
- :wmi => vin[WMI_RANGE],
15
- :check_digit => vin[CHECK_DIGIT_INDEX],
16
- :production_number => vin[PRODUCTION_NUMBER_RANGE],
17
- :model_year => model_year(vin),
16
+ {
17
+ plant_code: vin[PLANT_CODE_INDEX],
18
+ wmi: vin[WMI_RANGE],
19
+ check_digit: vin[CHECK_DIGIT_INDEX],
20
+ production_number: vin[PRODUCTION_NUMBER_RANGE],
21
+ model_year: model_year(vin),
22
+ region: region(vin)
18
23
  }
19
24
  end
20
25
 
21
26
  private
22
27
 
28
+ def region(vin)
29
+ character = vin[0]
30
+ position = standard.wmi.detect { |p| p["name"] == "region" }
31
+
32
+ position["mapping"][character]
33
+ end
34
+
23
35
  def model_year(vin)
24
- index = ((ALPHA - %w[I O Q U Z]) + (NUMERIC - %w[0])).find_index { |c| c == vin[9] }
36
+ position = standard.vis.detect { |p| p["name"] === "model_year" }
37
+ characters = position["characters"]
38
+
39
+ index = characters.find_index { |c| c == vin[9] }
25
40
 
26
41
  if ALPHA.include?(vin[6])
27
42
  BASE_MODEL_YEAR + index + 30
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vindetta
2
4
  class Generator
3
5
  attr_reader :standard
@@ -6,31 +8,28 @@ module Vindetta
6
8
  @standard = standard
7
9
  end
8
10
 
9
- def vin(options = {})
10
- "#{wmi}#{vds}#{vis}".tap do |vin|
11
+ def vin(_options = {})
12
+ String.new("#{wmi}#{vds}#{vis}").tap do |vin|
11
13
  vin[CHECK_DIGIT_INDEX] = Calculator.check_digit(vin)
12
14
  end
13
15
  end
14
16
 
15
17
  def wmi(_options = {})
16
- @wmis ||= begin
17
- path = File.expand_path("../data/wmi.yaml", __FILE__)
18
- YAML.load_file(path)["wmi"].keys
19
- end
20
-
21
- "#{@wmis.sample}".rjust(standard.wmi.length, "9")
18
+ characters("wmi").map(&:sample).join
22
19
  end
23
20
 
24
21
  def vds(_options = {})
25
- characters = standard.vds.map(&:characters)
26
-
27
- characters.map(&:sample).join
22
+ characters("vds").map(&:sample).join
28
23
  end
29
24
 
30
25
  def vis(_options = {})
31
- characters = standard.vis.map(&:characters)
26
+ characters("vis").map(&:sample).join
27
+ end
28
+
29
+ private
32
30
 
33
- characters.map(&:sample).join
31
+ def characters(section)
32
+ standard.send(section).map { |p| p["characters"] }
34
33
  end
35
34
  end
36
35
  end
@@ -1,4 +1,6 @@
1
- require 'vindetta/standard/iso3779'
1
+ # frozen_string_literal: true
2
+
3
+ require "vindetta/standard/iso3779"
2
4
 
3
5
  module Vindetta
4
6
  module Standard
@@ -1,65 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vindetta
2
4
  module Standard
3
5
  class ISO3779
4
- LENGTH = 17
5
-
6
6
  def self.wmi
7
- OpenStruct.new(
8
- :length => 3
9
- )
7
+ @wmi ||= yml.fetch("wmi")
8
+ end
9
+
10
+ def self.length
11
+ @length ||= yml.fetch("length")
10
12
  end
11
13
 
12
14
  def self.vds
13
- @vds ||= [
14
- OpenStruct.new({
15
- :characters => "0123456789ABCDEFGHJKLMNPRSTUVWXYZ".chars
16
- }),
17
- OpenStruct.new({
18
- :characters => "0123456789ABCDEFGHJKLMNPRSTUVWXYZ".chars
19
- }),
20
- OpenStruct.new({
21
- :characters => "0123456789ABCDEFGHJKLMNPRSTUVWXYZ".chars
22
- }),
23
- OpenStruct.new({
24
- :characters => "0123456789ABCDEFGHJKLMNPRSTUVWXYZ".chars
25
- }),
26
- OpenStruct.new({
27
- :characters => "0123456789ABCDEFGHJKLMNPRSTUVWXYZ".chars
28
- }),
29
- OpenStruct.new({
30
- :characters => "0123456789ABCDEFGHJKLMNPRSTUVWXYZ".chars
31
- })
32
- ]
15
+ @vds ||= yml.fetch("vds")
33
16
  end
34
17
 
35
18
  def self.vis
36
- @vis ||= [
37
- OpenStruct.new({
38
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "V", "W", "X", "Y"]
39
- }),
40
- OpenStruct.new({
41
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
42
- }),
43
- OpenStruct.new({
44
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
45
- }),
46
- OpenStruct.new({
47
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
48
- }),
49
- OpenStruct.new({
50
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
51
- }),
52
- OpenStruct.new({
53
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
54
- }),
55
- OpenStruct.new({
56
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
57
- }),
58
- OpenStruct.new({
59
- :characters => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
60
- })
61
- ]
19
+ @vis ||= yml.fetch("vis")
62
20
  end
21
+
22
+ def self.yml
23
+ @yml ||= YAML.load_file("lib/vindetta/standard/iso3779.yml")
24
+ end
25
+
26
+ private_class_method :yml
63
27
  end
64
28
  end
65
29
  end
@@ -0,0 +1,63 @@
1
+ ---
2
+ length: 17
3
+
4
+ wmi:
5
+ - name: region
6
+ characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
7
+ mapping:
8
+ "A": Africa
9
+ "B": Africa
10
+ "C": Africa
11
+ "D": Africa
12
+ "E": Africa
13
+ "F": Africa
14
+ "G": Africa
15
+ "H": Africa
16
+ "J": Asia
17
+ "K": Asia
18
+ "L": Asia
19
+ "M": Asia
20
+ "N": Asia
21
+ "P": Asia
22
+ "R": Asia
23
+ "S": Europe
24
+ "T": Europe
25
+ "U": Europe
26
+ "V": Europe
27
+ "W": Europe
28
+ "X": Europe
29
+ "Y": Europe
30
+ "Z": Europe
31
+ "1": North America
32
+ "2": North America
33
+ "3": North America
34
+ "4": North America
35
+ "5": South America
36
+ "6": Oceania
37
+ "7": Oceania
38
+ "8": South America
39
+ "9": South America
40
+ "0": South America
41
+ - name: country
42
+ characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
43
+ - name: manufacturer
44
+ characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
45
+
46
+ vds:
47
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
48
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
49
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
50
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
51
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
52
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
53
+ vis:
54
+ -
55
+ name: model_year
56
+ characters: ["A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "V", "W", "X", "Y", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
57
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
58
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
59
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
60
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
61
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
62
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
63
+ - characters: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vindetta
2
4
  class Validator
3
5
  attr_reader :standard
@@ -7,29 +9,23 @@ module Vindetta
7
9
  end
8
10
 
9
11
  def vin(vin)
10
- return false unless vin.length == standard::LENGTH
12
+ return false unless vin.length == standard.length
11
13
 
12
14
  Calculator.check_digit(vin) == Decoder.new(Vindetta::Standard::ISO3779).vin(vin)[:check_digit]
13
15
  rescue Calculator::InvalidCharacterError
14
- false
16
+ false
15
17
  end
16
18
 
17
19
  def wmi(wmi)
18
- return false unless wmi.length == standard.wmi.length
19
-
20
- true
20
+ wmi.length == standard.wmi.length
21
21
  end
22
22
 
23
23
  def vds(vds)
24
- return false unless vds.length == standard.vds.length
25
-
26
- true
24
+ vds.length == standard.vds.length
27
25
  end
28
26
 
29
27
  def vis(vis)
30
- return false unless vis.length == standard.vis.length
31
-
32
- true
28
+ vis.length == standard.vis.length
33
29
  end
34
30
  end
35
31
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Vindetta
2
- VERSION = "0.25.0".freeze
4
+ VERSION = "0.26.0"
3
5
  end
@@ -1,4 +1,6 @@
1
- lib = File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require "vindetta/version"
4
6
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vindetta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.0
4
+ version: 0.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Decot
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-31 00:00:00.000000000 Z
11
+ date: 2020-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gli
@@ -161,12 +161,12 @@ files:
161
161
  - lib/vindetta.rb
162
162
  - lib/vindetta/calculator.rb
163
163
  - lib/vindetta/cli.rb
164
- - lib/vindetta/data/wmi.yaml
165
164
  - lib/vindetta/decoder.rb
166
165
  - lib/vindetta/generator.rb
167
166
  - lib/vindetta/locale/en.yml
168
167
  - lib/vindetta/standard.rb
169
168
  - lib/vindetta/standard/iso3779.rb
169
+ - lib/vindetta/standard/iso3779.yml
170
170
  - lib/vindetta/validator.rb
171
171
  - lib/vindetta/version.rb
172
172
  - vindetta.gemspec
@@ -189,8 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
189
  - !ruby/object:Gem::Version
190
190
  version: '0'
191
191
  requirements: []
192
- rubyforge_project:
193
- rubygems_version: 2.6.11
192
+ rubygems_version: 3.0.3
194
193
  signing_key:
195
194
  specification_version: 4
196
195
  summary: Ruby gem for generating VINs
@@ -1,474 +0,0 @@
1
- ---
2
-
3
- wmi:
4
- AAV: Volkswagen South Africa
5
- AC5: Hyundai South Africa
6
- ADD: Hyundai South Africa
7
- AFA: Ford South Africa
8
- AHT: Toyota South Africa
9
- JA3: Mitsubishi
10
- JA4: Mitsubishi
11
- JA: Isuzu
12
- JD: Daihatsu
13
- JF: Fuji Heavy Industries (Subaru)
14
- JH: Honda
15
- JK: Kawasaki (motorcycles)
16
- JL5: Mitsubishi Fuso
17
- JMB: Mitsubishi Motors
18
- JMY: Mitsubishi Motors
19
- JMZ: Mazda
20
- JN: Nissan
21
- JS: Suzuki
22
- JT: Toyota
23
- JY: Yamaha (motorcycles)
24
- KL: Daewoo General Motors South Korea
25
- KM: Hyundai
26
- KMY: Daelim (motorcycles)
27
- KM1: Hyosung (motorcycles)
28
- KN: Kia
29
- KNM: Renault Samsung
30
- KPA: SsangYong
31
- KPT: SsangYong
32
- LAN: Changzhou Yamasaki Motorcycle
33
- LBB: Zhejiang Qianjiang Motorcycle (Keeway/Generic)
34
- LBE: Beijing Hyundai
35
- LBM: Zongshen Piaggio
36
- LBP: Chongqing Jainshe Yamaha (motorcycles)
37
- LB2: Geely Motorcycles
38
- LCE: Hangzhou Chunfeng Motorcycles (CFMOTO)
39
- LDC: Dong Feng Peugeot Citroen (DPCA), China
40
- LDD: Dandong Huanghai Automobile
41
- LDN: SouEast Motor
42
- LDY: Zhongtong Coach, China
43
- LET: Jiangling-Isuzu Motors, China
44
- LE4: Beijing Benz, China
45
- LFB: FAW, China (busses)
46
- LFG: Taizhou Chuanl Motorcycle Manufacturing
47
- LFP: FAW, China (passenger vehicles)
48
- LFT: FAW, China (trailers)
49
- LFV: FAW-Volkswagen, China
50
- LFW: FAW JieFang, China
51
- LFY: Changshu Light Motorcycle Factory
52
- LGB: Dong Feng (DFM), China
53
- LGH: Qoros (formerly Dong Feng (DFM)), China
54
- LGX: BYD Auto, China
55
- LHB: Beijing Automotive Industry Holding
56
- LH1: FAW-Haima, China
57
- LJC: JAC, China
58
- LJ1: JAC, China
59
- LKL: Suzhou King Long, China
60
- LL6: Hunan Changfeng Manufacture Joint-Stock
61
- LL8: Linhai (ATV)
62
- LMC: Suzuki Hong Kong (motorcycles)
63
- LPR: Yamaha Hong Kong (motorcycles)
64
- LSG: Shanghai General Motors, China
65
- LSJ: MG Motor UK Limited - SAIC Motor, Shanghai, China
66
- LSV: Shanghai Volkswagen, China
67
- LSY: Brilliance Zhonghua
68
- LTV: Toyota Tian Jin
69
- LUC: Guangqi Honda, China
70
- LVS: Ford Chang An
71
- LVV: Chery, China
72
- LVZ: Dong Feng Sokon Motor Company (DFSK)
73
- LZM: MAN China
74
- LZE: Isuzu Guangzhou, China
75
- LZG: Shaanxi Automobile Group, China
76
- LZP: Zhongshan Guochi Motorcycle (Baotian)
77
- LZY: Yutong Zhengzhou, China
78
- LZZ: Chongqing Shuangzing Mech & Elec (Howo)
79
- L4B: Xingyue Group (motorcycles)
80
- L5C: KangDi (ATV)
81
- L5K: Zhejiang Yongkang Easy Vehicle
82
- L5N: Zhejiang Taotao, China (ATV & motorcycles)
83
- L5Y: Merato Motorcycle Taizhou Zhongneng
84
- L85: Zhejiang Yongkang Huabao Electric Appliance
85
- L8X: Zhejiang Summit Huawin Motorcycle
86
- MAB: Mahindra & Mahindra
87
- MAC: Mahindra & Mahindra
88
- MAJ: Ford India
89
- MAK: Honda Siel Cars India
90
- MAL: Hyundai
91
- MAT: Tata Motors
92
- MA1: Mahindra & Mahindra
93
- MA3: Suzuki India (Maruti)
94
- MA6: GM India
95
- MA7: Mitsubishi India (formerly Honda)
96
- MBH: Suzuki India (Maruti)
97
- MBJ: Toyota India
98
- MBR: Mercedes-Benz India
99
- MB1: Ashok Leyland
100
- MCA: Fiat India
101
- MCB: GM India
102
- MC2: Volvo Eicher commercial vehicles limited.
103
- MDH: Nissan India
104
- MD2: Bajaj Auto
105
- MEE: Renault India
106
- MEX: Volkswagen India
107
- MHF: Toyota Indonesia
108
- MHR: Honda Indonesia
109
- MLC: Suzuki Thailand
110
- MLH: Honda Thailand
111
- MMB: Mitsubishi Thailand
112
- MMC: Mitsubishi Thailand
113
- MMM: Chevrolet Thailand
114
- MMT: Mitsubishi Thailand
115
- MM8: Mazda Thailand
116
- MNB: Ford Thailand
117
- MNT: Nissan Thailand
118
- MPA: Isuzu Thailand
119
- MP1: Isuzu Thailand
120
- MRH: Honda Thailand
121
- MR0: Toyota Thailand
122
- NLA: Honda Türkiye
123
- NLE: Mercedes-Benz Türk Truck
124
- NLH: Hyundai Assan
125
- NLT: TEMSA
126
- NMB: Mercedes-Benz Türk Buses
127
- NMC: BMC
128
- NM0: Ford Turkey
129
- NM4: Tofaş Türk
130
- NMT: Toyota Türkiye
131
- NNA: Isuzu Turkey
132
- PE1: Ford Phillipines
133
- PE3: Mazda Phillipines
134
- PL1: Proton, Malaysia
135
- PNA: NAZA, Malaysia (Peugeot)
136
- RA1: Steyr Trucks International FZE, UAE
137
- RFB: Kymco, Taiwan
138
- RFG: Sanyang SYM, Taiwan
139
- RFL: Adly, Taiwan
140
- RFT: CPI, Taiwan
141
- RF3: Aeon Motor, Taiwan
142
- SAL: Land Rover
143
- SAJ: Jaguar
144
- SAR: Rover
145
- SB1: Toyota UK
146
- SBM: McLaren
147
- SCA: Rolls Royce
148
- SCB: Bentley
149
- SCC: Lotus Cars
150
- SCE: DeLorean Motor Cars N. Ireland (UK)
151
- SCF: Aston
152
- SDB: Peugeot UK (formerly Talbot)
153
- SED: General Motors Luton Plant
154
- SEY: LDV
155
- SFA: Ford UK
156
- SFD: Alexander Dennis UK
157
- SHH: Honda UK
158
- SHS: Honda UK
159
- SJN: Nissan UK
160
- SKF: Vauxhall
161
- SLP: JCB Research UK
162
- SMT: Triumph Motorcycles
163
- SUF: Fiat Auto Poland
164
- SUL: FSC (Poland)
165
- SUP: FSO-Daewoo (Poland)
166
- SUU: Solaris Bus & Coach (Poland)
167
- TCC: Micro Compact Car AG (smart 1998-1999)
168
- TDM: QUANTYA Swiss Electric Movement (Switzerland)
169
- TK9: SOR buses (Czech Republic)
170
- TMA: Hyundai Motor Manufacturing Czech
171
- TMB: Škoda (Czech Republic)
172
- TMK: Karosa (Czech Republic)
173
- TMP: Škoda trolleybuses (Czech Republic)
174
- TMT: Tatra (Czech Republic)
175
- TM9: Škoda trolleybuses (Czech Republic)
176
- TNE: TAZ
177
- TN9: Karosa (Czech Republic)
178
- TRA: Ikarus Bus
179
- TRU: Audi Hungary
180
- TSE: Ikarus Egyedi Autobuszgyar, (Hungary)
181
- TSM: Suzuki Hungary
182
- TW1: Toyota Caetano Portugal
183
- TYA: Mitsubishi Trucks Portugal
184
- TYB: Mitsubishi Trucks Portugal
185
- UU1: Renault Dacia, (Romania)
186
- UU3: ARO
187
- UU6: Daewoo Romania
188
- U5Y: Kia Motors Slovakia
189
- U6Y: Kia Motors Slovakia
190
- VAG: Magna Steyr Puch
191
- VAN: MAN Austria
192
- VBK: KTM (Motorcycles)
193
- VF1: Renault
194
- VF2: Renault
195
- VF3: Peugeot
196
- VF4: Talbot
197
- VF6: Renault (Trucks & Buses)
198
- VF7: Citroën
199
- VF8: Matra
200
- VF9: Bugatti
201
- 795: Bugatti
202
- VG5: MBK (motorcycles)
203
- VLU: Scania France
204
- VN1: SOVAB (France)
205
- VNE: Irisbus (France)
206
- VNK: Toyota France
207
- VNV: Renault-Nissan
208
- VSA: Mercedes-Benz Spain
209
- VSE: Suzuki Spain (Santana Motors)
210
- VSK: Nissan Spain
211
- VSS: SEAT
212
- VSX: Opel Spain
213
- VS6: Ford Spain
214
- VS7: Citroën Spain
215
- VS9: Carrocerias Ayats (Spain)
216
- VTH: Derbi (motorcycles)
217
- VTL: Yamaha Spain (motorcycles)
218
- VTT: Suzuki Spain (motorcycles)
219
- VV9: TAURO Spain
220
- VWA: Nissan Spain
221
- VWV: Volkswagen Spain
222
- VX1: Zastava / Yugo Serbia
223
- WAG: Neoplan
224
- WAU: Audi
225
- WA1: Audi SUV
226
- WBA: BMW
227
- WBS: BMW M
228
- WBY: BMW
229
- WDA: Daimler
230
- WDB: Mercedes-Benz
231
- WDC: DaimlerChrysler
232
- WDD: Mercedes-Benz
233
- WDF: Mercedes-Benz (commercial vehicles)
234
- WEB: Evobus GmbH (Mercedes-Bus)
235
- WJM: Iveco Magirus
236
- WF0: Ford Germany
237
- WKK: Kässbohrer/Setra
238
- WMA: MAN Germany
239
- WME: smart
240
- WMW: MINI
241
- WMX: Mercedes-AMG
242
- WP0: Porsche
243
- WP1: Porsche SUV
244
- W0L: Opel
245
- W0V: Opel
246
- WUA: quattro GmbH
247
- WVG: Volkswagen MPV/SUV
248
- WVW: Volkswagen
249
- WV1: Volkswagen Commercial Vehicles
250
- WV2: Volkswagen Bus/Van
251
- WV3: Volkswagen Trucks
252
- XLB: Volvo (NedCar)
253
- XLE: Scania Netherlands
254
- XLR: DAF (trucks)
255
- XL9: Spyker
256
- 363: Spyker
257
- XMC: Mitsubishi (NedCar)
258
- XTA: Lada/AvtoVAZ (Russia)
259
- XTC: KAMAZ (Russia)
260
- XTH: GAZ (Russia)
261
- XTT: UAZ/Sollers (Russia)
262
- XTY: LiAZ (Russia)
263
- XUF: General Motors Russia
264
- XUU: AvtoTor (Russia, General Motors SKD)
265
- XW8: Volkswagen Group Russia
266
- XWB: UZ-Daewoo (Uzbekistan)
267
- XWE: AvtoTor (Russia, Hyundai-Kia SKD)
268
- X1M: PAZ (Russia)
269
- X4X: AvtoTor (Russia, BMW SKD)
270
- X7L: Renault AvtoFramos (Russia)
271
- X7M: Hyundai TagAZ (Russia)
272
- YBW: Volkswagen Belgium
273
- YB1: Volvo Trucks Belgium
274
- YCM: Mazda Belgium
275
- YE2: Van Hool (buses)
276
- YH2: BRP Finland (Lynx snowmobiles)
277
- YK1: Saab-Valmet Finland
278
- YS2: Scania AB
279
- YS3: Saab
280
- YS4: Scania Bus
281
- YTN: Saab NEVS
282
- YT9: Koenigsegg
283
- 007: Koenigsegg
284
- YT9: Carvia
285
- 034: Carvia
286
- YU7: Husaberg (motorcycles)
287
- YV1: Volvo Cars
288
- YV4: Volvo Cars
289
- YV2: Volvo Trucks
290
- YV3: Volvo Buses
291
- Y3M: MAZ (Belarus)
292
- Y6D: Zaporozhets/AvtoZAZ (Ukraine)
293
- ZAA: Autobianchi
294
- ZAM: Maserati
295
- ZAP: Piaggio/Vespa/Gilera
296
- ZAR: Alfa Romeo
297
- ZBN: Benelli
298
- ZCG: Cagiva SpA / MV Agusta
299
- ZCF: Iveco
300
- ZDM: Ducati Motor Holdings SpA
301
- ZDF: Ferrari Dino
302
- ZD0: Yamaha Italy
303
- ZD3: Beta Motor
304
- ZD4: Aprilia
305
- ZFA: Fiat
306
- ZFC: Fiat V.I.
307
- ZFF: Ferrari
308
- ZGU: Moto Guzzi
309
- ZHW: Lamborghini
310
- ZJM: Malaguti
311
- ZJN: Innocenti
312
- ZKH: Husqvarna Motorcycles Italy
313
- ZLA: Lancia
314
- ZOM: OM
315
- Z8M: Marussia (Russia)
316
- 1B3: Dodge
317
- 1C3: Chrysler
318
- 1C6: Chrysler
319
- 1D3: Dodge
320
- 1FA: Ford Motor Company
321
- 1FB: Ford Motor Company
322
- 1FC: Ford Motor Company
323
- 1FD: Ford Motor Company
324
- 1FM: Ford Motor Company
325
- 1FT: Ford Motor Company
326
- 1FU: Freightliner
327
- 1FV: Freightliner
328
- 1F9: FWD Corp.
329
- 1G: General Motors USA
330
- 1GC: Chevrolet Truck USA
331
- 1GT: GMC Truck USA
332
- 1G1: Chevrolet USA
333
- 1G2: Pontiac USA
334
- 1G3: Oldsmobile USA
335
- 1G4: Buick USA
336
- 1G6: Cadillac USA
337
- 1G8: Saturn USA
338
- 1GM: Pontiac USA
339
- 1GY: Cadillac USA
340
- 1H: Honda USA
341
- 1HD: Harley-Davidson
342
- 1J4: Jeep
343
- 1L: Lincoln USA
344
- 1ME: Mercury USA
345
- 1M1: Mack Truck USA
346
- 1M2: Mack Truck USA
347
- 1M3: Mack Truck USA
348
- 1M4: Mack Truck USA
349
- 1M9: Mynatt Truck & Equipment
350
- 1N: Nissan USA
351
- 1NX: NUMMI USA
352
- 1P3: Plymouth USA
353
- 1R9: Roadrunner Hay Squeeze USA
354
- 1VW: Volkswagen USA
355
- 1XK: Kenworth USA
356
- 1XP: Peterbilt USA
357
- 1YV: Mazda USA (AutoAlliance International)
358
- 1ZV: Ford (AutoAlliance International)
359
- 2A4: Chrysler Canada
360
- 2BP: Bombardier Recreational Products
361
- 2B3: Dodge Canada
362
- 2B7: Dodge Canada
363
- 2C3: Chrysler Canada
364
- 2CN: CAMI
365
- 2D3: Dodge Canada
366
- 2FA: Ford Motor Company Canada
367
- 2FB: Ford Motor Company Canada
368
- 2FC: Ford Motor Company Canada
369
- 2FM: Ford Motor Company Canada
370
- 2FT: Ford Motor Company Canada
371
- 2FU: Freightliner
372
- 2FV: Freightliner
373
- 2FZ: Sterling
374
- 2G: General Motors Canada
375
- 2G1: Chevrolet Canada
376
- 2G2: Pontiac Canada
377
- 2G3: Oldsmobile Canada
378
- 2G4: Buick Canada
379
- 2HG: Honda Canada
380
- 2HK: Honda Canada
381
- 2HJ: Honda Canada
382
- 2HM: Hyundai Canada
383
- 2M: Mercury
384
- 2NV: Nova Bus Canada
385
- 2P3: Plymouth Canada
386
- 2T: Toyota Canada
387
- 2V4: Volkswagen Canada
388
- 2V8: Volkswagen Canada
389
- 2WK: Western Star
390
- 2WL: Western Star
391
- 2WM: Western Star
392
- 3C4: Chrysler Mexico
393
- 3D3: Dodge Mexico
394
- 3FA: Ford Motor Company Mexico
395
- 3FE: Ford Motor Company Mexico
396
- 3G: General Motors Mexico
397
- 3H: Honda Mexico
398
- 3JB: BRP Mexico (all-terrain vehicles)
399
- 3MD: Mazda Mexico
400
- 3MZ: Mazda Mexico
401
- 3N: Nissan Mexico
402
- 3P3: Plymouth Mexico
403
- 3VW: Volkswagen Mexico
404
- 4F: Mazda USA
405
- 4JG: Mercedes-Benz USA
406
- 4M: Mercury
407
- 4RK: Nova Bus USA
408
- 4S: Subaru-Isuzu Automotive
409
- 4T: Toyota
410
- 4T9: Lumen Motors
411
- 4UF: Arctic Cat Inc.
412
- 4US: BMW USA
413
- 4UZ: Frt-Thomas Bus
414
- 4V1: Volvo
415
- 4V2: Volvo
416
- 4V3: Volvo
417
- 4V4: Volvo
418
- 4V5: Volvo
419
- 4V6: Volvo
420
- 4VL: Volvo
421
- 4VM: Volvo
422
- 4VZ: Volvo
423
- 538: Zero Motorcycles (USA)
424
- 5F: Honda USA-Alabama
425
- 5L: Lincoln
426
- 5N1: Nissan USA
427
- 5NP: Hyundai USA
428
- 5T: Toyota USA - trucks
429
- 5YJ: Tesla Motors
430
- 6AB: MAN Australia
431
- 6F4: Nissan Motor Company Australia
432
- 6F5: Kenworth Australia
433
- 6FP: Ford Motor Company Australia
434
- 6G1: General Motors-Holden (post Nov 2002)
435
- 6G2: Pontiac Australia (GTO & G8)
436
- 6H8: General Motors-Holden (pre Nov 2002)
437
- 6MM: Mitsubishi Motors Australia
438
- 6T1: Toyota Motor Corporation Australia
439
- 6U9: Privately Imported car in Australia
440
- 8AD: Peugeot Argentina
441
- 8AF: Ford Motor Company Argentina
442
- 8AG: Chevrolet Argentina
443
- 8AJ: Toyota Argentina
444
- 8AK: Suzuki Argentina
445
- 8AP: Fiat Argentina
446
- 8AW: Volkswagen Argentina
447
- 8A1: Renault Argentina
448
- 8GD: Peugeot Chile
449
- 8GG: Chevrolet Chile
450
- 935: Citroën Brazil
451
- 936: Peugeot Brazil
452
- 93H: Honda Brazil
453
- 93R: Toyota Brazil
454
- 93U: Audi Brazil
455
- 93V: Audi Brazil
456
- 93X: Mitsubishi Motors Brazil
457
- 93Y: Renault Brazil
458
- 94D: Nissan Brazil
459
- 9BD: Fiat Brazil
460
- 9BF: Ford Motor Company Brazil
461
- 9BG: Chevrolet Brazil
462
- 9BM: Mercedes-Benz Brazil
463
- 9BR: Toyota Brazil
464
- 9BS: Scania Brazil
465
- 9BW: Volkswagen Brazil
466
- 9FB: Renault Colombia
467
-
468
- region:
469
- 'Africa': [A, B, C, D, E, F, G, H]
470
- 'Asia': [J, K, L, M, N, O, P, Q, R]
471
- 'Europe': [S, T, U, V, W, X, Y, Z]
472
- 'North America': ['1', '2', '3', '4', '5']
473
- 'Oceania': ['6', '7']
474
- 'South America': ['8', '9', '0']