vindetta 0.25.0 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
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']