commit c8f16d8f9c4b3d489d4c586b95f1ef16fb3fff12 Author: emile Date: Mon Nov 4 22:47:15 2019 +0100 ready diff --git a/main.py b/main.py new file mode 100644 index 0000000..f678b82 --- /dev/null +++ b/main.py @@ -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("$ ")]() \ No newline at end of file diff --git a/pesel.py b/pesel.py new file mode 100644 index 0000000..dfbe7ce --- /dev/null +++ b/pesel.py @@ -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) + + + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..3aa703f --- /dev/null +++ b/readme.md @@ -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. \ No newline at end of file diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..c5aa511 --- /dev/null +++ b/tests.py @@ -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() \ No newline at end of file