From d6088bf186358634dda923550d45597f50d8954e Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 13:57:30 +0100 Subject: [PATCH 01/15] feat: generate an eid --- exercise/python/day05/eid.py | 25 +++++++++++++++++++++++++ exercise/python/day05/tests/test_eid.py | 5 ++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 exercise/python/day05/eid.py diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py new file mode 100644 index 000000000..6021b2edf --- /dev/null +++ b/exercise/python/day05/eid.py @@ -0,0 +1,25 @@ +from enum import Enum + + +class Eid: + @staticmethod + def generate(sex: str, sn: int, birth_year: int) -> str: + prefix = Eid.format_sex(sex) + Eid.format_birth_year(birth_year) + Eid.format_sn(sn) + control_key = Eid.format_control_key(prefix) + return prefix + control_key + + @staticmethod + def format_sex(sex: str) -> str: + return "1" + + @staticmethod + def format_birth_year(birth_year: int): + return "00" + + @staticmethod + def format_sn(sn: int) -> str: + return "001" + + @staticmethod + def format_control_key(prefix: str) -> str: + return "95" diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index f63a47929..7e3fbf45f 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -2,10 +2,13 @@ from assertpy import assert_that +from eid import Eid + class EIDTest(unittest.TestCase): def test_eid(self): - assert_that(42).is_equal_to("Universe") + eid = Eid.generate(sex="Sloubi", birth_year=0, sn=1) + assert_that(eid).is_equal_to("10000195") if __name__ == "__main__": From e152c5e337a3fb766de801a2fec8d6df3be29a85 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 13:59:46 +0100 Subject: [PATCH 02/15] refactor: add ElvenSex Enum --- exercise/python/day05/eid.py | 10 ++++++++-- exercise/python/day05/tests/test_eid.py | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 6021b2edf..91c553c36 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -1,15 +1,21 @@ from enum import Enum +class ElvenSex: + SLOUBI = 0 + GAGNA = 2 + CATACT = 3 + + class Eid: @staticmethod - def generate(sex: str, sn: int, birth_year: int) -> str: + def generate(sex: ElvenSex, sn: int, birth_year: int) -> str: prefix = Eid.format_sex(sex) + Eid.format_birth_year(birth_year) + Eid.format_sn(sn) control_key = Eid.format_control_key(prefix) return prefix + control_key @staticmethod - def format_sex(sex: str) -> str: + def format_sex(sex: ElvenSex) -> str: return "1" @staticmethod diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index 7e3fbf45f..4f10bb274 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -2,12 +2,12 @@ from assertpy import assert_that -from eid import Eid +from eid import Eid, ElvenSex class EIDTest(unittest.TestCase): def test_eid(self): - eid = Eid.generate(sex="Sloubi", birth_year=0, sn=1) + eid = Eid.generate(sex=ElvenSex.SLOUBI, birth_year=0, sn=1) assert_that(eid).is_equal_to("10000195") From 14f959faeb90ddc700a9093d640150c0a13b3c96 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:07:54 +0100 Subject: [PATCH 03/15] feat: eid now use sex --- exercise/python/day05/eid.py | 2 +- exercise/python/day05/tests/test_eid.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 91c553c36..7d8a8a986 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -16,7 +16,7 @@ def generate(sex: ElvenSex, sn: int, birth_year: int) -> str: @staticmethod def format_sex(sex: ElvenSex) -> str: - return "1" + return {ElvenSex.SLOUBI: "1", ElvenSex.GAGNA: "2", ElvenSex.CATACT: "3"}[sex] @staticmethod def format_birth_year(birth_year: int): diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index 4f10bb274..0a602d08b 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -10,6 +10,18 @@ def test_eid(self): eid = Eid.generate(sex=ElvenSex.SLOUBI, birth_year=0, sn=1) assert_that(eid).is_equal_to("10000195") + def test_eid_sloubi(self): + eid = Eid.generate(ElvenSex.SLOUBI, birth_year=0, sn=1) + assert_that(eid).starts_with("1") + + def test_eid_gagna(self): + eid = Eid.generate(ElvenSex.GAGNA, birth_year=0, sn=1) + assert_that(eid).starts_with("2") + + def test_eid_catact(self): + eid = Eid.generate(ElvenSex.CATACT, birth_year=0, sn=1) + assert_that(eid).starts_with("3") + if __name__ == "__main__": unittest.main() From 2ff9359d5d3b0d0fc329b56536938530d0550cee Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:15:27 +0100 Subject: [PATCH 04/15] feat: eid now use birth_year --- exercise/python/day00/main.py | 8 ++++++++ exercise/python/day05/eid.py | 2 +- exercise/python/day05/tests/test_eid.py | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 exercise/python/day00/main.py diff --git a/exercise/python/day00/main.py b/exercise/python/day00/main.py new file mode 100644 index 000000000..0d1167f5d --- /dev/null +++ b/exercise/python/day00/main.py @@ -0,0 +1,8 @@ +from exercise.python.day00.encryption_email.encryption import Encryption +from exercise.python.day00.tests.utils import load_file, convert_key, convert_iv + +if __name__ == '__main__': + contents = load_file("EncryptedEmail.txt") + key = convert_key('Advent Of Craft') + iv = convert_iv('2024') + print(Encryption(key, iv).decrypt(contents)) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 7d8a8a986..5b8fd9d58 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -20,7 +20,7 @@ def format_sex(sex: ElvenSex) -> str: @staticmethod def format_birth_year(birth_year: int): - return "00" + return "{:02d}".format(birth_year % 100) @staticmethod def format_sn(sn: int) -> str: diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index 0a602d08b..52a27b42e 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -22,6 +22,14 @@ def test_eid_catact(self): eid = Eid.generate(ElvenSex.CATACT, birth_year=0, sn=1) assert_that(eid).starts_with("3") + def test_eid_birthyear(self): + eid = Eid.generate(ElvenSex.SLOUBI, birth_year=1950, sn=1) + assert_that(eid[1:3]).is_equal_to("50") + + def test_eid_birthyear_has_leading_zero(self): + eid = Eid.generate(ElvenSex.SLOUBI, birth_year=1, sn=1) + assert_that(eid[1:3]).is_equal_to("01") + if __name__ == "__main__": unittest.main() From c1d5e8e0aabc8de036f23cd46be312fbc29f2e33 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:18:54 +0100 Subject: [PATCH 05/15] test: add stricter check on eid generate format --- exercise/python/day05/tests/test_eid.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index 52a27b42e..fa39acee2 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -6,28 +6,34 @@ class EIDTest(unittest.TestCase): + + def generate_and_check_eid(self, *args, **kwargs): + eid = Eid.generate(*args, **kwargs) + assert_that(eid).is_length(8) + return eid + def test_eid(self): - eid = Eid.generate(sex=ElvenSex.SLOUBI, birth_year=0, sn=1) + eid = self.generate_and_check_eid(sex=ElvenSex.SLOUBI, birth_year=0, sn=1) assert_that(eid).is_equal_to("10000195") def test_eid_sloubi(self): - eid = Eid.generate(ElvenSex.SLOUBI, birth_year=0, sn=1) + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=0, sn=1) assert_that(eid).starts_with("1") def test_eid_gagna(self): - eid = Eid.generate(ElvenSex.GAGNA, birth_year=0, sn=1) + eid = self.generate_and_check_eid(ElvenSex.GAGNA, birth_year=0, sn=1) assert_that(eid).starts_with("2") def test_eid_catact(self): - eid = Eid.generate(ElvenSex.CATACT, birth_year=0, sn=1) + eid = self.generate_and_check_eid(ElvenSex.CATACT, birth_year=0, sn=1) assert_that(eid).starts_with("3") def test_eid_birthyear(self): - eid = Eid.generate(ElvenSex.SLOUBI, birth_year=1950, sn=1) + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1950, sn=1) assert_that(eid[1:3]).is_equal_to("50") def test_eid_birthyear_has_leading_zero(self): - eid = Eid.generate(ElvenSex.SLOUBI, birth_year=1, sn=1) + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=1) assert_that(eid[1:3]).is_equal_to("01") From 6ac51e15dd71622911d7cf5e6864259064823d31 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:21:08 +0100 Subject: [PATCH 06/15] feat: eid now use sn --- exercise/python/day05/eid.py | 2 +- exercise/python/day05/tests/test_eid.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 5b8fd9d58..a4659bd0c 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -24,7 +24,7 @@ def format_birth_year(birth_year: int): @staticmethod def format_sn(sn: int) -> str: - return "001" + return "{:03d}".format(sn) @staticmethod def format_control_key(prefix: str) -> str: diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index fa39acee2..6b590af90 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -36,6 +36,10 @@ def test_eid_birthyear_has_leading_zero(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=1) assert_that(eid[1:3]).is_equal_to("01") + def test_sn(self): + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=123) + assert_that(eid[3:6]).is_equal_to("123") + if __name__ == "__main__": unittest.main() From 276249a8a7bc7923daf6ee7f9873c153dcf10900 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:23:09 +0100 Subject: [PATCH 07/15] test: add leading zero test on sn --- exercise/python/day05/tests/test_eid.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index 6b590af90..ff142e705 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -40,6 +40,10 @@ def test_sn(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=123) assert_that(eid[3:6]).is_equal_to("123") + def test_sn_has_leading_zero(self): + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=5) + assert_that(eid[3:6]).is_equal_to("005") + if __name__ == "__main__": unittest.main() From 6b4dda0d0bfb7e854d84966b145c8171544cdc08 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:23:47 +0100 Subject: [PATCH 08/15] chore: rename tests --- exercise/python/day05/tests/test_eid.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index ff142e705..a70617c88 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -36,11 +36,11 @@ def test_eid_birthyear_has_leading_zero(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=1) assert_that(eid[1:3]).is_equal_to("01") - def test_sn(self): + def test_eid_sn(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=123) assert_that(eid[3:6]).is_equal_to("123") - def test_sn_has_leading_zero(self): + def test_eid_sn_has_leading_zero(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=5) assert_that(eid[3:6]).is_equal_to("005") From 252da58466e75a4fca0d6c2a9294b615ff20fc36 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:26:02 +0100 Subject: [PATCH 09/15] fix: add missing Enum inheritance --- exercise/python/day05/eid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index a4659bd0c..0fe689a0c 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -1,7 +1,7 @@ from enum import Enum -class ElvenSex: +class ElvenSex(Enum): SLOUBI = 0 GAGNA = 2 CATACT = 3 From 5b91aba5e8aa5ab3b5f11e884ee7cc39d68593bf Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:28:18 +0100 Subject: [PATCH 10/15] feat: sn can no longer be out of bound --- exercise/python/day05/eid.py | 9 +++++++-- exercise/python/day05/tests/test_eid.py | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 0fe689a0c..61264d6dd 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -1,5 +1,8 @@ from enum import Enum +MIN_SN = 1 +MAX_SN = 999 + class ElvenSex(Enum): SLOUBI = 0 @@ -10,7 +13,7 @@ class ElvenSex(Enum): class Eid: @staticmethod def generate(sex: ElvenSex, sn: int, birth_year: int) -> str: - prefix = Eid.format_sex(sex) + Eid.format_birth_year(birth_year) + Eid.format_sn(sn) + prefix = Eid.format_sex(sex) + Eid.format_birth_year(birth_year) + Eid.validate_and_format(sn) control_key = Eid.format_control_key(prefix) return prefix + control_key @@ -23,7 +26,9 @@ def format_birth_year(birth_year: int): return "{:02d}".format(birth_year % 100) @staticmethod - def format_sn(sn: int) -> str: + def validate_and_format(sn: int) -> str: + if sn < MIN_SN or sn > MAX_SN: + raise ValueError(f"sn {sn} is out of range [{MIN_SN}, {MAX_SN}]") return "{:03d}".format(sn) @staticmethod diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index a70617c88..c16627afb 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -44,6 +44,11 @@ def test_eid_sn_has_leading_zero(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=5) assert_that(eid[3:6]).is_equal_to("005") + def test_eid_cannot_be_out_of_bound(self): + with self.assertRaises(ValueError): + self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=1000) + with self.assertRaises(ValueError): + self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=0) if __name__ == "__main__": unittest.main() From 816def0be4399f853997897aab769b747703b518 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:45:03 +0100 Subject: [PATCH 11/15] feat: eid now has correct format key --- exercise/python/day05/eid.py | 2 +- exercise/python/day05/tests/test_eid.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 61264d6dd..064bf2dbd 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -33,4 +33,4 @@ def validate_and_format(sn: int) -> str: @staticmethod def format_control_key(prefix: str) -> str: - return "95" + return "{:02d}".format(97 - (int(prefix) % 97)) diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index c16627afb..8a4edd8cb 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -50,5 +50,23 @@ def test_eid_cannot_be_out_of_bound(self): with self.assertRaises(ValueError): self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=0) + @staticmethod + def check_eid_control_key_match_first_6_digits(eid): + prefix = eid[:6] + control_key = eid[6:] + assert_that((int(prefix) + int(control_key)) % 97).is_equal_to(0) + + def test_eid_control_key(self): + for birth_year in range(100): + eid = self.generate_and_check_eid(sex=ElvenSex.SLOUBI, birth_year=birth_year, sn=1) + self.check_eid_control_key_match_first_6_digits(eid) + for sn in range(1, 999): + eid = self.generate_and_check_eid(sex=ElvenSex.SLOUBI, birth_year=1, sn=sn) + self.check_eid_control_key_match_first_6_digits(eid) + for sex in ElvenSex: + eid = self.generate_and_check_eid(sex=sex, birth_year=1, sn=1) + self.check_eid_control_key_match_first_6_digits(eid) + + if __name__ == "__main__": unittest.main() From 079be1e05ecca0e43043fcdde23fc42c60b66c10 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:45:17 +0100 Subject: [PATCH 12/15] refactor: remove deprecated test --- exercise/python/day05/tests/test_eid.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index 8a4edd8cb..c688e65e1 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -12,10 +12,6 @@ def generate_and_check_eid(self, *args, **kwargs): assert_that(eid).is_length(8) return eid - def test_eid(self): - eid = self.generate_and_check_eid(sex=ElvenSex.SLOUBI, birth_year=0, sn=1) - assert_that(eid).is_equal_to("10000195") - def test_eid_sloubi(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=0, sn=1) assert_that(eid).starts_with("1") From a83799990e35c6567c32cc9c810c59048837d71d Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:47:06 +0100 Subject: [PATCH 13/15] test: add stricter generate check --- exercise/python/day05/tests/test_eid.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index c688e65e1..299add54a 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -10,6 +10,10 @@ class EIDTest(unittest.TestCase): def generate_and_check_eid(self, *args, **kwargs): eid = Eid.generate(*args, **kwargs) assert_that(eid).is_length(8) + try: + int(eid) + except ValueError: + raise AssertionError(f"eid {eid} is not an number") return eid def test_eid_sloubi(self): From 85a1ab0ba4c9ddfd4f7fb92714b2c06ad13949f0 Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 14:53:08 +0100 Subject: [PATCH 14/15] feat: add eid sex validation --- exercise/python/day05/eid.py | 2 ++ exercise/python/day05/tests/test_eid.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 064bf2dbd..4116287e8 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -19,6 +19,8 @@ def generate(sex: ElvenSex, sn: int, birth_year: int) -> str: @staticmethod def format_sex(sex: ElvenSex) -> str: + if type(sex) != ElvenSex: + raise ValueError(f"sex {sex} is not an ElvenSex") return {ElvenSex.SLOUBI: "1", ElvenSex.GAGNA: "2", ElvenSex.CATACT: "3"}[sex] @staticmethod diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index 299add54a..4e7f7f2d4 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -28,6 +28,10 @@ def test_eid_catact(self): eid = self.generate_and_check_eid(ElvenSex.CATACT, birth_year=0, sn=1) assert_that(eid).starts_with("3") + def test_eid_sex_must_be_elven_sex(self): + with self.assertRaises(ValueError): + self.generate_and_check_eid(sex="MALE", birth_year=0, sn=1) + def test_eid_birthyear(self): eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1950, sn=1) assert_that(eid[1:3]).is_equal_to("50") From ab501eed8b44ea7f1351c5e05c287571be7f2aba Mon Sep 17 00:00:00 2001 From: Jean Date: Thu, 5 Dec 2024 15:15:44 +0100 Subject: [PATCH 15/15] refactor: more verbose ElvenSex enum --- exercise/python/day05/eid.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py index 4116287e8..c2836ef30 100644 --- a/exercise/python/day05/eid.py +++ b/exercise/python/day05/eid.py @@ -5,9 +5,9 @@ class ElvenSex(Enum): - SLOUBI = 0 - GAGNA = 2 - CATACT = 3 + SLOUBI = "SLOUBI" + GAGNA = "GAGNA" + CATACT = "CATACT" class Eid: