ready
This commit is contained in:
commit
c8f16d8f9c
33
main.py
Normal file
33
main.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
print("""
|
||||||
|
____ _____ ____ _____ _ ___ _____ _ _____ ___ ____
|
||||||
|
| _ \| ____/ ___|| ____| | |_ _|__ / / \|_ _/ _ \| _ \
|
||||||
|
| |_) | _| \___ \| _| | | | | / / / _ \ | || | | | |_) |
|
||||||
|
| __/| |___ ___) | |___| |___ | | / /_ / ___ \| || |_| | _ <
|
||||||
|
|_| |_____|____/|_____|_____|___/____/_/ \_|_| \___/|_| \_\ 2000!
|
||||||
|
dodaj - dodaj osobę
|
||||||
|
list - listuj osoby
|
||||||
|
list pesele
|
||||||
|
pesel - sprawdź pesel osoby
|
||||||
|
|
||||||
|
""")
|
||||||
|
from pesel import PeselStorage
|
||||||
|
storage = PeselStorage()
|
||||||
|
while True:
|
||||||
|
def enter():
|
||||||
|
name = input("$ Wpisz imię: ")
|
||||||
|
pesel = input("$ Wpisz pesel: ")
|
||||||
|
try:
|
||||||
|
storage.append(name,pesel)
|
||||||
|
except AttributeError:
|
||||||
|
print(" ----- Pesel niepoprawny! Spróbuj ponownie ;( ------")
|
||||||
|
def _list():
|
||||||
|
print("\n".join(storage.get_all_persons()))
|
||||||
|
def remove():
|
||||||
|
storage.remove_all_names()
|
||||||
|
_list()
|
||||||
|
def get_pesel():
|
||||||
|
print(storage.get_pesel_of(input("$ Kogo?: ")))
|
||||||
|
def list_pesele():
|
||||||
|
print("\n".join([": ".join([x.name, str(x.pesel)]) for x in storage.set]))
|
||||||
|
|
||||||
|
{"dodaj":enter, "list":_list, "pesel":get_pesel, "list pesele":list_pesele}[input("$ ")]()
|
58
pesel.py
Normal file
58
pesel.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
from typing import Union, List
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from functools import *
|
||||||
|
import json
|
||||||
|
|
||||||
|
class PeselToolkit:
|
||||||
|
@staticmethod
|
||||||
|
def check_pesel_validity(pesel:Union[int,str])->bool:
|
||||||
|
pesel =str(pesel)
|
||||||
|
if len(pesel)<11: return False
|
||||||
|
def get_checksum(pesel:str)->bool:
|
||||||
|
weights = [9,7,3,1,9,7,3,1,9,7,0]
|
||||||
|
checksum = sum([weights[i] * int(n) for i,n in enumerate(pesel)])%10
|
||||||
|
return checksum
|
||||||
|
if get_checksum(pesel) != int(pesel[-1]): return False
|
||||||
|
def check_dates(pesel:str)->bool:
|
||||||
|
year = int(pesel[:2])
|
||||||
|
month = int(pesel[2:4])
|
||||||
|
day = int(pesel[4:6])
|
||||||
|
if not (month>0 and (month<=12 or (month>20 and month<=32) or (month>40 and month<=52) or (month>60 and month<=72) or (month>80 and month<=92))):
|
||||||
|
return False
|
||||||
|
if day>31 or day<1: return False
|
||||||
|
return True
|
||||||
|
if not check_dates(pesel): return False
|
||||||
|
return True
|
||||||
|
@dataclass()
|
||||||
|
class Person:
|
||||||
|
name:str
|
||||||
|
pesel:str
|
||||||
|
def __hash__(self):
|
||||||
|
if (self.pesel[0]=='0'):return int("999999"+self.pesel)
|
||||||
|
return int(self.pesel)
|
||||||
|
|
||||||
|
class PeselStorage:
|
||||||
|
def __init__(self):
|
||||||
|
self.set = set()
|
||||||
|
|
||||||
|
def append(self,name:str, pesel:Union[int,str]):
|
||||||
|
if not PeselToolkit.check_pesel_validity(str(pesel)):
|
||||||
|
raise AttributeError("pesel is invalid")
|
||||||
|
self.set.add(Person(name,str(pesel)))
|
||||||
|
|
||||||
|
def get_pesel_of(self, name:str)->int:
|
||||||
|
#lepiej pytonicznie [x for x in self.set if x.name==name][0]
|
||||||
|
return list(filter(lambda d: d.name == name, self.set))[0].pesel
|
||||||
|
def get_all_persons(self):
|
||||||
|
return list(map(lambda d: d.name, self.set))
|
||||||
|
|
||||||
|
def remove_all_names(self):
|
||||||
|
#self.set = set([Person("", x.pesel) for x in self.set])
|
||||||
|
self.set = map(lambda d: Person("",d.pesel),self.set)
|
||||||
|
|
||||||
|
def dump(self, filename:str):
|
||||||
|
with open(filename, "w+") as f:
|
||||||
|
json.dump(list(self.set), f)
|
||||||
|
|
||||||
|
|
||||||
|
|
10
readme.md
Normal file
10
readme.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Włączanie testów:
|
||||||
|
|
||||||
|
`python3 tests.py`
|
||||||
|
|
||||||
|
# Włączanie programu
|
||||||
|
|
||||||
|
`python3 main.py`
|
||||||
|
|
||||||
|
|
||||||
|
Jest lista, jest set, są strumienie (filter, sum, map i pythonowe comprahensions). Jest zwracanie struktury. Są testy.
|
21
tests.py
Normal file
21
tests.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import unittest
|
||||||
|
from pesel import PeselStorage, PeselToolkit
|
||||||
|
class TestPeselToolkit(unittest.TestCase):
|
||||||
|
def test_toolkit(self):
|
||||||
|
pesele = ["81100216357","80072909146","02070803628","90060804786" ]
|
||||||
|
for x in pesele:
|
||||||
|
self.assertTrue(PeselToolkit.check_pesel_validity(x))
|
||||||
|
|
||||||
|
invalid = ["02070803627","81100216350","80072909143","02070803624","90060804781","81950216357","80075609146","0207080362444","90060804782"]
|
||||||
|
for x in invalid:
|
||||||
|
self.assertFalse(PeselToolkit.check_pesel_validity(x))
|
||||||
|
class TestPeselStorage(unittest.TestCase):
|
||||||
|
def test_storage(self):
|
||||||
|
s = PeselStorage()
|
||||||
|
s.append("janek", "80072909146")
|
||||||
|
s.append("janek2", "02070803628")
|
||||||
|
self.assertListEqual(s.get_all_persons(), ["janek", "janek2"])
|
||||||
|
self.assertRaises(AttributeError, s.append, "zly", "02070803627")
|
||||||
|
self.assertEqual(s.get_pesel_of("janek"),"80072909146" )
|
||||||
|
if __name__=="__main__":
|
||||||
|
unittest.main()
|
Loading…
Reference in New Issue
Block a user