Skip to content

EPAVin subclass to fetch data from epa's fueleconomy.gov #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 183 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
183 commits
Select commit Hold shift + click to select a range
95d842b
Intramodule imports should not be fully qualified (breaks further int…
dankegel Jul 2, 2016
31d6bef
Move tricky imports into __init__ so they don't need to be repeated i…
dankegel Jul 2, 2016
5ced5bc
Add class EPAVin with magical EPA vin decoding powers. MPG? Got it!…
dankegel Jul 2, 2016
6b8e0cb
Correct make for 3GN and 5YF. Add test for 2T1.
dankegel Jul 2, 2016
a839865
Let user select amount of verbosity and ambiguity he wants. Also sup…
dankegel Jul 2, 2016
616d416
In test mode, use nhtsa model where appropriate
dankegel Jul 2, 2016
2d3e3af
Handle WMI 1GN
dankegel Jul 2, 2016
44f882a
Handle RWD attribute better; get vsn right in test mode.
dankegel Jul 2, 2016
d19a721
Handle 24 kWh Leaf
dankegel Jul 2, 2016
1c4bf00
Handle 'New Beetle' even when EPA thinks it's just 'Beetle'
dankegel Jul 3, 2016
f4e3018
Add special case for stray C on end of CLK320?
dankegel Jul 3, 2016
f0ae8cd
Let highly motivated users retry a fetch with last year's EPA data if…
dankegel Jul 3, 2016
d9f9506
Handle Caravan/Grand Caravan
dankegel Jul 3, 2016
266217d
Default to FWD? Helps Ford Fusion S but not Titanium :-(
dankegel Jul 3, 2016
04ffb5b
Handle WMI 3C4
dankegel Jul 3, 2016
13c8d51
Handle Versa Note... as far as we can. No way to tell which transmis…
dankegel Jul 3, 2016
9ae2736
Handle NV200 and its odd co-branding.
dankegel Jul 3, 2016
f92cc64
Handle WMI 5XX = Kia
dankegel Jul 3, 2016
93b06e5
Add test for Nissan Rogue (built by KNM / Renault Samsung)
dankegel Jul 3, 2016
8fc9817
epa: use 'Doors' in fuzzy match, too (EPA considers Civic 2dr and Civ…
dankegel Jul 4, 2016
c902349
nhtsa: handle honda civic 2016 FC1 vds by setting Turbo flag
dankegel Jul 4, 2016
0ff29c0
Handle WMI 3MZ
dankegel Jul 4, 2016
670d696
Add one more attribute for doors
dankegel Jul 4, 2016
724ef18
Get 'make' right for Subaru
dankegel Jul 4, 2016
f69d661
Get make right for WMI 3CZ
dankegel Jul 4, 2016
7e93c4e
epa: handle Ford F-150 model name
dankegel Jul 5, 2016
21ce499
Add cautionary note about GVWR and F-150
dankegel Jul 5, 2016
6582dac
Add 228i xDrive Convertible test case, fix all the problems that expo…
dankegel Jul 6, 2016
65da232
Handle Volvo CC suffix on model names
dankegel Jul 6, 2016
ea790ff
Handle Volvo S60/S60I
dankegel Jul 6, 2016
6450899
Handle Jaguar series R by faking a whole-word match on the R
dankegel Jul 6, 2016
34a28d9
Handle WMI SAD
dankegel Jul 6, 2016
54c0350
Handle 2WD a bit better; improves decoding for Mazda CX-3. Note one …
dankegel Jul 6, 2016
e5e00f3
Add link to BMW 2015 decoding guide
dankegel Jul 6, 2016
6af66f5
Get make right for WMI JF2
dankegel Jul 6, 2016
329ebb9
Handle WMI LYV
dankegel Jul 6, 2016
22b142d
Handle Mini Cooper S Hardtop
dankegel Jul 8, 2016
205606e
Handle Toyota 4-Runner
dankegel Jul 8, 2016
14ba0bf
Expose an anonvin getter, use it when talking to NHTSA
dankegel Jul 9, 2016
e45b614
Handle BMW models (and others?) where EPA removed a space
dankegel Jul 10, 2016
c28218b
Handle WMI 1GB better
dankegel Jul 10, 2016
b345306
Remove a hack that equated 4WD with AWD, add a test case
dankegel Jul 10, 2016
60f06a4
Handle WMI 2GC better
dankegel Jul 10, 2016
531e668
Handle WMIs 2GN and 3GC better
dankegel Jul 10, 2016
b586329
Support Chevy Spark EV
dankegel Jul 10, 2016
00fbb7b
Handle WMI KL7 better
dankegel Jul 10, 2016
6087516
epa: Add nhtsaGVWRClass method
dankegel Jul 10, 2016
67cb651
Handle WMI 55S
dankegel Jul 12, 2016
39f9f24
Handle Infiniti special cases better.
dankegel Jul 12, 2016
11ed336
Infiniti Q70L is approximately a Q70
dankegel Jul 12, 2016
1330464
Handle 2013 EX35/EX27
dankegel Jul 12, 2016
b6e1959
Handle Nissan Altima
dankegel Jul 12, 2016
92db91a
Get Make right for WMI 2T2
dankegel Jul 15, 2016
e0a449f
Add special case for dog's breakfast Series2 on Lexus NX
dankegel Jul 15, 2016
a101050
Handle WMI 58A
dankegel Jul 15, 2016
7ff212a
Handle WMI ZAC
dankegel Jul 15, 2016
84dadf7
Handle WMI ZFB and Fiat 500L
dankegel Jul 15, 2016
4cbd564
Handle Fiat 500X
dankegel Jul 15, 2016
b4f9ca9
Correct WMI ZAM
dankegel Jul 15, 2016
9cbd747
Handle Chevrolet Suburban 1500 and 2500
dankegel Jul 15, 2016
b189e4a
Add WMI 5XY
dankegel Jul 16, 2016
8bd8c4d
Handle BWM i3
dankegel Jul 16, 2016
947d9f2
Hrm, guess NHTSA started returning FWD instead of AWD for 1GNKRHKD2GJ…
dankegel Jul 16, 2016
2f76b84
That darn MINI
dankegel Jul 16, 2016
b2d3817
WMI WP1
dankegel Jul 17, 2016
2366015
Handle WMI 4JG; handle odd GLE550e-4M coding
dankegel Jul 17, 2016
26099eb
Handle WMI 1ZV
dankegel Jul 18, 2016
edd4bf9
WMI 5YM
dankegel Jul 18, 2016
ecbdb0c
WMI 3TM
dankegel Jul 18, 2016
bd67379
WMI 4A4
dankegel Jul 18, 2016
2dc2d51
WMI 5GR
dankegel Jul 18, 2016
4365ed2
WMI 8BR
dankegel Jul 18, 2016
2abf0fa
WMI YH4
dankegel Jul 18, 2016
a579199
Handle Fisker, a one-model make
dankegel Jul 18, 2016
b5a7b92
Handle Mazda 2
dankegel Jul 19, 2016
ef34aec
WMI WBX
dankegel Jul 19, 2016
8634da5
WMI KL1
dankegel Jul 19, 2016
486a32f
Handle another sDrive variation
dankegel Jul 19, 2016
62a5f09
Narrow previous special case to avoid nuking C-Class
dankegel Jul 19, 2016
a970808
Handle Mazda6. OMG. Heuristics getting ugly.
dankegel Jul 19, 2016
66cfe0b
Two more special cases
dankegel Jul 21, 2016
229a7f9
Whaddaya know, not all cars have same size serial numbers.
dankegel Jul 21, 2016
d49a364
WMI JTN is Scion, kind of.
dankegel Jul 21, 2016
f5065d7
Add WMIs JTK and ML3
dankegel Jul 26, 2016
d1c87a8
Add special case for Captiva Sport
dankegel Jul 27, 2016
fb2d266
Be less picky about co2 values, as epa just changed its test method.
dankegel Sep 30, 2016
2c122b7
Disable nhtsa make test, as it's too hard to distinguish between scio…
dankegel Sep 30, 2016
1587ca5
Add squish function; many little decoding "fixes"; update some epa co…
dankegel Sep 30, 2016
c48774f
epa.py: react better to missing data in NHTSA result
dankegel Oct 1, 2016
a9d2738
Kludge^2: give negative bonus if Hybrid in candidate but not attributes
dankegel Oct 4, 2016
aafc0e8
Handle cars with Hybrid / nothybrid in Series, and take secondary fue…
dankegel Oct 6, 2016
04c3a5b
Tweak heuristics harder so Sonata is less likely to misfire as hybrid
dankegel Oct 6, 2016
f091265
epa: heuristic tweakfest. Also, start paying some attention to Elect…
dankegel Oct 7, 2016
33902ac
epa: handle bmw: 4x4 = hint for xDrive
dankegel Oct 8, 2016
563da37
epa: bmw AWD = xDrive hint
dankegel Oct 8, 2016
b889aa3
epa: mini cooper hardtop: the kludge is still needed in 2017
dankegel Oct 8, 2016
bab50be
epa: Acura: AWD -> 4WD
dankegel Oct 8, 2016
9755a21
WMI 3KP
dankegel Oct 8, 2016
ee69720
Correct sequential number length for Aston and Jaguar
dankegel Oct 12, 2016
380f857
Handle WMI SCC better.
dankegel Oct 14, 2016
f15c591
WMI SHH
dankegel Oct 15, 2016
165749e
WMI 1J8. Also fix a short SNI test.
dankegel Oct 15, 2016
e68d650
WMI 2HJ
dankegel Oct 15, 2016
55f7351
WMI 3A8
dankegel Oct 15, 2016
53a018a
WMI 5N3
dankegel Oct 15, 2016
352fe93
Handle Toyota Yaris; handle WMI 5YJ
dankegel Oct 15, 2016
eae6d66
WMI 5NM
dankegel Oct 15, 2016
a51c82c
WMI WD3
dankegel Oct 15, 2016
c1f4bfc
WMI SJK
dankegel Oct 15, 2016
ea59397
WMI LRB
dankegel Oct 15, 2016
286d546
WMI JC1
dankegel Oct 15, 2016
979e683
WMI 3G1
dankegel Oct 17, 2016
e1a855b
WMI KL4
dankegel Oct 17, 2016
534b571
Handle Ram fiasco?
dankegel Oct 17, 2016
7954d4f
base-4m means 4matic, or something.
dankegel Oct 17, 2016
eef2d6f
One more test case showing breaking Trim on dashes not always good
dankegel Oct 17, 2016
43ae809
4-matic: a bridge too far for now
dankegel Oct 17, 2016
5a06966
Use BatteryKWh_to if present to match some Teslas.
dankegel Oct 20, 2016
8fc2585
WMI 5KB
dankegel Oct 22, 2016
4654cc3
WMI 5Y2
dankegel Oct 22, 2016
385c6b9
WMI 6G3
dankegel Oct 22, 2016
6aca690
WMI JGN?
dankegel Oct 22, 2016
9660c76
WMI 1B3
dankegel Oct 22, 2016
d98c181
WMI WD4
dankegel Oct 22, 2016
1f41a78
WMI WDA, WDZ, 8BT
dankegel Oct 22, 2016
23da8d2
WMI 54D?
dankegel Oct 22, 2016
9b510d3
WMI WME, handle strange smart car decoding by vpic
dankegel Oct 22, 2016
c4e9ece
WMI 2CT
dankegel Oct 22, 2016
2bd17b3
WMI 454?
dankegel Oct 22, 2016
3774e4d
WMI 2FD
dankegel Oct 22, 2016
26b8ea5
WMI 1D4
dankegel Oct 22, 2016
a753c5e
WMI 2C8
dankegel Oct 22, 2016
5551ad3
WMI 1Z7
dankegel Oct 22, 2016
bdef391
WMI 5GT? Hummer H2
dankegel Oct 22, 2016
49bf7f2
WMI WB1?
dankegel Oct 22, 2016
49c2bf6
Subaru Impreza: handle confusion between wagon in name and wagon in b…
dankegel Oct 22, 2016
2ece4e3
Handle Golf GTI
dankegel Oct 22, 2016
c1f68b4
Handle 2013 Infiniti qx56
dankegel Oct 22, 2016
ffdf082
WMI JTL
dankegel Oct 22, 2016
c7511e3
Handle modifiers in middle of model name, like Yukon Frigging XL
dankegel Oct 22, 2016
c0f8160
Use 'Hybrid' anywhere in trim as clue
dankegel Oct 22, 2016
411de7f
Fix regression in Nissan Murano
dankegel Oct 22, 2016
4e1db6a
Fix regression in Camry
dankegel Oct 22, 2016
4e27d28
One more Scion regression
dankegel Oct 22, 2016
657380a
Be a little less trusting of the word Hybrid in trim. Add Porsche 91…
dankegel Oct 23, 2016
663dc16
WMI 3C8
dankegel Oct 23, 2016
16134ec
WMI 2A8
dankegel Oct 23, 2016
fe6c719
WMI 2D8, WMI WWD?
dankegel Oct 23, 2016
f81d93e
WMI VWG?
dankegel Oct 23, 2016
c2853d1
Repaired damaged country table?
dankegel Oct 23, 2016
6f848e4
WMI 1D8
dankegel Oct 23, 2016
7d40243
WMI 5GZ
dankegel Oct 23, 2016
3b3f140
WMI 3ME
dankegel Oct 23, 2016
9d7aaa1
WMI 3A4
dankegel Oct 23, 2016
3a52265
WMI 2B4
dankegel Oct 23, 2016
9c7e07f
WMI 3B7
dankegel Oct 23, 2016
93cd8ad
WMI 1B7, 2V8
dankegel Oct 23, 2016
92b35b2
WMI 2S3
dankegel Oct 23, 2016
a1845d2
WMI VF9
dankegel Oct 23, 2016
cffa165
WMI SBM
dankegel Oct 23, 2016
a8eb242
WMI JB3?
dankegel Oct 23, 2016
c42cd75
Handle models with puffery in the middle of the model name, like the …
dankegel Oct 23, 2016
9c339ab
Handle Volvo XC
dankegel Oct 24, 2016
ec296e2
Toyota Scion -> Toyota Corolla
dankegel Oct 24, 2016
3a4d39a
Toyota, tomato...
dankegel Oct 24, 2016
6bc610f
More Scion swing dance action
dankegel Oct 24, 2016
d8ca5f7
WMI 2CN
dankegel Oct 24, 2016
efc5efe
WMI 1NX, KMH
dankegel Oct 24, 2016
1cfc79d
Genesis make starts in 2017
dankegel Oct 24, 2016
f4320a6
Fix Yukon regression...?
dankegel Oct 24, 2016
2281f02
Allow 4matic to be spelled 4-M, too
dankegel Oct 24, 2016
8c43e28
Fix regressions caused by 2281f02f
dankegel Oct 25, 2016
c69827c
Fix one more regression, and turn off a weasely test skip
dankegel Oct 25, 2016
4b9a7e2
Fix one more regression...
dankegel Oct 25, 2016
325b6bc
Better partial construction if epa lookup fails. Still too messy. S…
dankegel Oct 25, 2016
9329474
Handle Fiat 500e and Spark EV
dankegel Oct 28, 2016
49bcbca
epa.py: don't look up model for trucks with GVWR 2H or higher
dankegel Oct 29, 2016
f1c7476
epa.py main: output a bit more data, check for missing cyl and disp v…
dankegel Nov 7, 2016
559ea69
Handle Ford E-250
dankegel Nov 11, 2016
72debad
epa.py: even some 2H trucks have epa data
dankegel Nov 19, 2016
2c94472
Allow fetching multiple models from epa in case of ambiguity.
dankegel Dec 13, 2016
402bb8e
Link to GM's vincard page
dankegel Dec 13, 2016
fdef720
Support Bolt
dankegel Dec 15, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,4 @@ References
* http://www.nisrinc.com/include/common/VIN.html
* http://vpic.nhtsa.dot.gov
* http://vpic.nhtsa.dot.gov/mid/
* http://gm.oemdtc.com/2772/vehicle-identification-number-vin-information-1960-2017
189 changes: 154 additions & 35 deletions libvin/decoding.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
(c) Copyright 2016 Dan Kegel <[email protected]>
"""

from libvin.static import *
from static import *

class Vin(object):
def __init__(self, vin):
Expand Down Expand Up @@ -42,38 +42,66 @@ def is_pre_2010(self):
"""
return self.vin[6].isdigit()

@property
def is_valid(self):
def calculate_checkdigit(self, v):
"""
Returns True if a VIN is valid, otherwise returns False.
Returns calculated check digit of the given VIN string.
"""
products = [VIN_WEIGHT[i] * VIN_TRANSLATION[j] for i, j in enumerate(v)]
check_digit = sum(products) % 11
if check_digit == 10:
check_digit = 'X'
return str(check_digit)

def seqnumlen(self):
"""
Return length of the sequential number field for this vendor
"""
if len(self.vin) != 17:
if self.less_than_500_built_per_year:
return 3
elif self.wmi == 'SCC':
# SCC Lotus https://vpic.nhtsa.dot.gov/mid/home/displayfile/32155
# SCC Lotus 2008 ftp://ftp.nhtsa.dot.gov/mfrmail/ORG3319.pdf
return 4
elif self.wmi == "SCF" or self.wmi == "SAJ":
# SCF Aston-Martin https://vpic.nhtsa.dot.gov/mid/home/displayfile/1742
# SAJ Jaguar https://vpic.nhtsa.dot.gov/mid/home/displayfile/28722
return 5
else:
return 6

def anonvin(self):
"""
Return an anonymized VIN, where the sequential number has been replaced with zeroes.
"""
v = self.vin[0:17 - self.seqnumlen()] + '0' * self.seqnumlen()
return v[0:8]+ self.calculate_checkdigit(v) + v[9:17]

def __is_valid(self, v):
"""
Returns True if the given VIN is valid, otherwise returns False.
"""
if len(v) != 17:
"""
For model years 1981 to present, the VIN is composed of 17
alphanumeric values
"""
return False

if any(x in 'IOQ' for x in self.vin):
if any(x in 'IOQ' for x in v):
"""
The letters I,O, Q are prohibited from any VIN position
"""
return False

if self.vin[9] in 'UZ0':
if v[9] in 'UZ0':
"""
The tenth position of the VIN represents the Model Year and
does not permit the use of the characters U and Z, as well
as the numeric zero (0)
"""
return False

products = [VIN_WEIGHT[i] * VIN_TRANSLATION[j] for i, j in enumerate(self.vin)]
check_digit = sum(products) % 11
if check_digit == 10:
check_digit = 'X'

if self.vin[8] != str(check_digit):
if v[8] != self.calculate_checkdigit(v):
"""
The ninth position of the VIN is a calculated value based on
the other 16 alphanumeric values, it's called the
Expand All @@ -84,6 +112,13 @@ def is_valid(self):

return True

@property
def is_valid(self):
"""
Returns True if a VIN is valid, otherwise returns False.
"""
return self.__is_valid(self.vin)

@property
def less_than_500_built_per_year(self):
"""
Expand Down Expand Up @@ -123,10 +158,7 @@ def vsn(self):
"""
Returns the Vehicle Sequential Number
"""
if self.less_than_500_built_per_year:
return self.vin[-3:]
else:
return self.vin[-6:]
return self.vin[-self.seqnumlen():]

@property
def wmi(self):
Expand Down Expand Up @@ -154,44 +186,119 @@ def make(self):
'''
man = self.manufacturer
for suffix in [
'Argentina',
'Australia',
'Canada',
'Cars',
'China',
'France',
'Germany',
'Hungary',
'Mexico',
'Motor Company',
'Spain',
'Thailand',
'Truck USA',
'Turkey',
'UK',
'USA',
'USA - trucks',
'USA (AutoAlliance International)',
]:
if man.endswith(suffix):
man = man.replace(" %s" % suffix, "")

if self.vin[0:5] == '3MYDL':
# Mazda builds Yaris for Toyota, see https://vpic.nhtsa.dot.gov/mid/home/displayfile/32354
# 3MYDLBZV4GY112482 is 2016 Scion still
if self.vin.startswith('3MYDLBZV'):
return 'Scion'
return 'Toyota'

if man == "General Motors":
return "GMC"
make = man
# 2012 and later: first 3 positions became overloaded, some 'make' aka brand info moved further in; see
# https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/Chrysler/VIN_Codes
# http://www.allpar.com/mopar/vin-decoder.html
if self.year > 2011:
if man == 'Chrysler':
if man == 'Chrysler' or man == 'Dodge':
# 3C4FY48B62T305332 is a 2002 Chrysler PT Cruiser
if self.year > 2001 and self.year <= 2011:
brandcode = self.vin[1]
if brandcode == 'B':
return 'Dodge'
elif brandcode == 'C':
return 'Chrysler'
if man == 'Chrysler' or man == 'FCA' or man == 'Fiat':
# 2012 and later: first 3 positions became overloaded, some 'make' aka brand info moved further in; see
# https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/Chrysler/VIN_Codes
# http://www.allpar.com/mopar/vin-decoder.html
# https://vpic.nhtsa.dot.gov/mid/home/displayfile/32250
if self.year > 2011:
brandcode = self.vin[4]
if brandcode == 'D':
make = 'Dodge'
return 'Dodge'
if brandcode == 'F':
make = 'Fiat'
return 'Fiat'
if brandcode == 'J':
make = 'Jeep'
return 'Jeep'
if brandcode == 'R':
return 'Ram'
if man == 'Hyundai':
brandcode = self.vin[3]
if self.year > 2016 and brandcode == 'G':
return 'Genesis'
if man == 'Kia':
# WTF?
if self.year > 2011:
brandcode = self.vin[3]
if brandcode == 'Z':
return 'Hyundai'
if "FUJI HEAVY INDUSTRIES" in man.upper():
brandcode = self.vin[4]
if brandcode == 'N':
if self.year > 2016:
return 'Toyota'
return 'Scion'
return 'Subaru'
if man == 'Toyota':
if self.vin.startswith('JTNJJXB0'):
# 2012-2014 Scion iQ
return 'Scion'
if self.year == 2016:
# JTNKARJEXGJ522381 is 2016 Scion iM still, as far as EPA is concerned
if self.vin.startswith('JTNKARJE'):
return 'Scion'

if man == 'Nissan':
# FIXME: this was gathered from just four test cases, probably needs updating
brandcode = self.vin[3:5]
if brandcode == 'CV':
make = 'Infiniti'
if brandcode == 'BS':
make = 'Infiniti'
if brandcode == 'CS':
make = 'Infiniti'
return make
# Sources, by model year:
# MY05 https://vpic.nhtsa.dot.gov/mid/home/displayfile/28822
# MY11 ftp://safercar.gov/MfrMail/ORG6337.pdf
# MY12 ftp://safercar.gov/MfrMail/ORG7377.pdf
# MY13 ftp://ftp.nhtsa.dot.gov/mfrmail/ORG7846.pdf
# MY16 https://vpic.nhtsa.dot.gov/mid/home/displayfile/29173
# MY16 https://vpic.nhtsa.dot.gov/mid/home/displayfile/31784
# 01234567
# 1N4AZ0CP3EC336448 is 2014 nissan leaf
# 5N1AZ2MG1GN146218 is 2016 Nissan Murano
# 5N1BV28U17N100517 is 2007 Nissan Quest
# 5N1DL0MNXHC508030 is 2017 Infiniti QX60
# JN1FV7AP1GM421263 is 2016 Infiniti Q50
# JN8AZ2NE0D9060764 is 2013 infiniti qx56
# JNRAS08UX3X101869 is 2003 Infiniti fx35
v46 = self.vin[4:6]
v47 = self.vin[4:7]
if (
v46 == 'J0' or # 2016 Infiniti QX60, 2011 Infiniti EX35
v46 == 'L0' or #
v46 == 'S1' or #
v46 == 'V6' or # 2011 Infiniti G37, G25
v46 == 'V7' or # 2016 Infiniti Q50
v46 == 'Y1' or # 2011 Infiniti M56, M37
v47 == 'Z2N'): # 2011 Infiniti QX56
return 'Infiniti'
if man == 'Renault Samsung':
# FIXME: they build other makes, too
return 'Nissan'
if man == 'Subaru-Isuzu Automotive':
return 'Subaru'
return man

@property
def year(self):
Expand All @@ -207,3 +314,15 @@ def year(self):
def decode(vin):
v = Vin(vin)
return v.decode()

import sys

def main():
if sys.argv[1] == "squish":
for line in sys.stdin:
vin = line.strip()
v = Vin(vin)
print v.anonvin()

if __name__ == "__main__":
main()
Loading