Skip to content

Instantly share code, notes, and snippets.

@Elijas
Last active August 21, 2019 15:49
Show Gist options
  • Save Elijas/6c7fe14c2987567f754ab0a875a17996 to your computer and use it in GitHub Desktop.
Save Elijas/6c7fe14c2987567f754ab0a875a17996 to your computer and use it in GitHub Desktop.
Solution for Assignment "Car registration"
## 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