From 4b53705a15d07caa12c2ca43b00ad03a81e600bd Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Thu, 6 Sep 2018 17:10:54 +0200 Subject: groupes: ajout du support d’une nouvelle syntaxe Certains groupes ont la syntaxe suivante : L1 4L s1 CM4L L1 4L s1 TD4L1 L1 4L s1 TP4L12 etc. Le « 4 » entre le CM/TD/TP et le « numéro » fait échouer la regex. Ce commit rajoute le support de cette syntaxe, et ajoute les cas de test adéquats. Signed-off-by: Alban Gruin --- tests.py | 33 +++++++++++++++++++++++++++++++++ utils.py | 25 +++++++++++++------------ 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/tests.py b/tests.py index c3d34fd..2568688 100644 --- a/tests.py +++ b/tests.py @@ -113,6 +113,11 @@ class GroupTestCase(TestCase): Group.objects.create(celcat_name="M1 CHI-TCCM (EM) s2 TPA12", source=self.source) + # Cas spécial avec un nombre supplémentaire dans le nom de groupe + Group.objects.create(celcat_name="L1 4L s1 CM4L", source=self.source) + Group.objects.create(celcat_name="L1 4L s1 TD4L1", source=self.source) + Group.objects.create(celcat_name="L1 4L s1 TP4L12", source=self.source) + def test_corresponds(self): cma = Group.objects.get(celcat_name="L1 info s2 CMA", source=self.source) @@ -178,6 +183,22 @@ class GroupTestCase(TestCase): self.assertTrue(ga111.corresponds_to(*general.group_info)) self.assertFalse(general.corresponds_to(*ga111.group_info)) + def test_corresponds_number(self): + cm4l = Group.objects.get(celcat_name="L1 4L s1 CM4L", + source=self.source) + td4l1 = Group.objects.get(celcat_name="L1 4L s1 TD4L1", + source=self.source) + tp4l12 = Group.objects.get(celcat_name="L1 4L s1 TP4L12", + source=self.source) + + self.assertFalse(cm4l.corresponds_to(*td4l1.group_info)) + self.assertFalse(cm4l.corresponds_to(*tp4l12.group_info)) + self.assertFalse(td4l1.corresponds_to(*tp4l12.group_info)) + + self.assertTrue(td4l1.corresponds_to(*cm4l.group_info)) + self.assertTrue(tp4l12.corresponds_to(*cm4l.group_info)) + self.assertTrue(tp4l12.corresponds_to(*td4l1.group_info)) + def test_correspond_parenthesis(self): general = Group.objects.get(celcat_name="M1 CHI-TCCM (EM) (toutes" " sections et semestres confondus)") @@ -246,6 +267,18 @@ class GroupTestCase(TestCase): self.assertEqual(general.group_info, ("M1 GC", None, "")) self.assertEqual(ga111.group_info, ("M1 GC", 2, "A111")) + def test_parse_number(self): + cm4l = Group.objects.get(celcat_name="L1 4L s1 CM4L", + source=self.source) + td4l1 = Group.objects.get(celcat_name="L1 4L s1 TD4L1", + source=self.source) + tp4l12 = Group.objects.get(celcat_name="L1 4L s1 TP4L12", + source=self.source) + + self.assertEqual(cm4l.group_info, ("L1 4L", 1, "4L")) + self.assertEqual(td4l1.group_info, ("L1 4L", 1, "4L1")) + self.assertEqual(tp4l12.group_info, ("L1 4L", 1, "4L12")) + def test_parse_parenthesis(self): general = Group.objects.get(celcat_name="M1 CHI-TCCM (EM) (toutes" " sections et semestres confondus)") diff --git a/utils.py b/utils.py index 55fce0b..26de36e 100644 --- a/utils.py +++ b/utils.py @@ -55,19 +55,20 @@ def group_courses(courses): def parse_group(name): # Explication de la regex # - # ^(.+?)\s*(s(\d)\s+(CM|TD|TP|G)(\w\d{0,3}))?(\s+\([^\(\)]+\))?$ - # ^ début de la ligne - # (.+?) correspond à au moins un caractère - # \s* éventuellement un ou plusieurs espaces - # (s(\d)\s+ un s suivi d’un nombre et d’un ou plusieurs espaces - # (CM|TD|TP|G) « CM » ou « TD » ou « TP » ou « G » - # (\w\d{0,3}) suivi d’un caractère puis entre 0 et 3 chiffres - # )? groupe optionnel - # (\s+ un ou plusieurs espaces - # \([^\(\)]+\))? un ou plusieurs caractères (exceptés des espaces) entre parenthèses - # $ fin de la ligne + # ^(.+?)\s*(s(\d)\s+(CM|TD|TP|G)(\d?\w\d{0,3}))?(\s+\([^\(\)]+\))?$ + # + # ^ début de la ligne + # (.+?) correspond à au moins un caractère + # \s* éventuellement un ou plusieurs espaces + # (s(\d)\s+ un s suivi d’un nombre et d’un ou plusieurs espaces + # (CM|TD|TP|G) « CM » ou « TD » ou « TP » ou « G » + # (\d?\w\d{0,3}) un chiffre optionnel, un caractère, entre 0 et 3 chiffres + # )? groupe optionnel + # (\s+ un ou plusieurs espaces + # \([^\(\)]+\))? un ou plusieurs caractères entre parenthèses + # $ fin de la ligne group_regex = re.compile( - r"^(.+?)\s*(s(\d)\s+(CM|TD|TP|G)(\w\d{0,3}))?(\s+\([^\(\)]+\))?$") + r"^(.+?)\s*(s(\d)\s+(CM|TD|TP|G)(\d?\w\d{0,3}))?(\s+\([^\(\)]+\))?$") search = group_regex.search(name) if search is None: -- cgit v1.2.1