Last active
August 21, 2019 15:49
-
-
Save Elijas/6c7fe14c2987567f754ab0a875a17996 to your computer and use it in GitHub Desktop.
Solution for Assignment "Car registration"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## Note: del b doesn't call __del__, because it's not guaranteed. Probably because there's a still reference to it in the _registered_cars dictionary | |
import re | |
from enum import Enum, auto | |
class REGISTRATION_STATUS(Enum): | |
SUCCESS = auto() | |
INVALID_NUMBER = auto() | |
ALREADY_REGISTERED = auto() | |
NUMBER_CHANGED = auto() | |
class TEXT: | |
CAR_LIST_PREFIX = 'Registered cars: ' | |
NO_REGISTERED_CARS = 'There are no registered cars at this moment' | |
STATUS = { | |
REGISTRATION_STATUS.SUCCESS: 'Successfully registered', | |
REGISTRATION_STATUS.NUMBER_CHANGED: 'The car has already number assigned', | |
REGISTRATION_STATUS.INVALID_NUMBER: 'Not valid number', | |
REGISTRATION_STATUS.ALREADY_REGISTERED: 'Already registered number' | |
} | |
CAR_NUMBER_REGEXP = re.compile('^[A-Z]{3}-[0-9]{3}$') | |
class Car: | |
_registered_cars = {} | |
def _is_registered(self): | |
return self._car_number in self._registered_cars and self._registered_cars[self.car_number] is self | |
def _register(self, car_number): | |
if not self._is_registered(): | |
if car_number not in self._registered_cars: | |
self._registered_cars[car_number] = self | |
self._registration_status = REGISTRATION_STATUS.SUCCESS | |
self._car_number = car_number | |
else: | |
self._registration_status = REGISTRATION_STATUS.ALREADY_REGISTERED | |
else: | |
self._registration_status = REGISTRATION_STATUS.ALREADY_REGISTERED | |
def __init__(self, car_number=None): | |
self._car_number = None | |
self._registration_status = None | |
if car_number: | |
self.car_number = car_number | |
@property | |
def car_number(self): | |
return self._car_number | |
@car_number.setter | |
def car_number(self, car_number): | |
if not CAR_NUMBER_REGEXP.match(car_number): | |
self._registration_status = REGISTRATION_STATUS.INVALID_NUMBER | |
return | |
if self._is_registered() and car_number != self._car_number: | |
self._registration_status = REGISTRATION_STATUS.NUMBER_CHANGED | |
return | |
self._register(car_number) | |
@property | |
def registered_cars(self): | |
car_numbers = list(self._registered_cars.keys()) | |
return f"{TEXT.CAR_LIST_PREFIX}{', '.join(car_numbers)}" if car_numbers else TEXT.NO_REGISTERED_CARS | |
@property | |
def car_count(self): | |
return len(self._registered_cars) | |
@property | |
def status(self): | |
return TEXT.STATUS[self._registration_status] | |
def __del__(self): | |
print('invoked') | |
if self.car_number in self._registered_cars: | |
del self._registered_cars[self.car_number] | |
if __name__ == '__main__': | |
a = Car('AAA-001') | |
assert a.car_number == 'AAA-001' | |
assert a.registered_cars == 'Registered cars: AAA-001' | |
assert a.car_count == 1 | |
assert a.status == 'Successfully registered' | |
b = Car() | |
b.car_number = "AAA-002" | |
assert b.car_number == 'AAA-002' | |
assert b.registered_cars == 'Registered cars: AAA-001, AAA-002' | |
assert b.car_count == 2 | |
assert b.status == 'Successfully registered' | |
b.car_number = "AAA-003" | |
assert b.car_number == 'AAA-002' | |
assert b.registered_cars == 'Registered cars: AAA-001, AAA-002' | |
assert b.car_count == 2 | |
assert b.status == 'The car has already number assigned' | |
c = Car('AA1-000') | |
assert c.car_number == None | |
assert c.registered_cars == 'Registered cars: AAA-001, AAA-002' | |
assert c.car_count == 2 | |
assert c.status == 'Not valid number' | |
d = Car() | |
d.car_number = 'AAA-002' | |
assert d.car_number == None | |
assert d.registered_cars == 'Registered cars: AAA-001, AAA-002' | |
assert d.car_count == 2 | |
assert d.status == 'Already registered number' | |
del d | |
assert c.registered_cars == 'Registered cars: AAA-001, AAA-002' | |
assert c.car_count == 2 | |
del b | |
assert len(c._registered_cars) == 1 | |
assert c.registered_cars == 'Registered cars: AAA-001' | |
assert c.car_count == 1 | |
del a | |
assert c.registered_cars == 'There are no registered cars at this moment' | |
assert c.car_count == 0 | |
print('success') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment