From c730d5bb7f001ec629c5ebd845f78721f31fc573 Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Wed, 9 Apr 2025 03:07:12 +0300 Subject: [PATCH] Refactor title generation to remove punctuation --- post_parser.py | 6 ++- tests/test_post_parser.py | 78 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/post_parser.py b/post_parser.py index e4e2dee..c23f2b8 100644 --- a/post_parser.py +++ b/post_parser.py @@ -163,7 +163,7 @@ class PostParser: # Process line breaks - take only the first line first_line = clean_text.split('\n', 1)[0] - first_line = re.sub(r'\.$', '', first_line) #Remove dot + first_line = re.sub(r'[.,;:]+$', '', first_line) #Remove dot first_line = first_line.strip() # Handle uppercase text - convert to title case if the text is all uppercase @@ -180,7 +180,9 @@ class PostParser: extended_cut = i if first_line[i] == ' ': break - return f"{first_line[:extended_cut]}..." + title = f"{first_line[:extended_cut]}" + title = re.sub(r'[.,;:]+$', '', title) + return f"{title}..." return first_line diff --git a/tests/test_post_parser.py b/tests/test_post_parser.py index b9f3df5..93ff9cf 100644 --- a/tests/test_post_parser.py +++ b/tests/test_post_parser.py @@ -91,7 +91,7 @@ class TestPostParserGenerateTitle(unittest.TestCase): def test_generate_title_text_with_url_and_text(self): message = self._create_mock_message(text="Check out this link: https://example.com") - self.assertEqual(self.parser._generate_title(message), "Check out this link:") # URL is stripped + self.assertEqual(self.parser._generate_title(message), "Check out this link") # URL is stripped def test_generate_title_text_only_url(self): message = self._create_mock_message(text="https://example.com") @@ -191,5 +191,81 @@ class TestPostParserGenerateTitle(unittest.TestCase): message = self._create_mock_message(web_page=web_page_mock) # Text is whitespace only self.assertEqual(self.parser._generate_title(message), "πŸ”— Web page title") + def test_generate_title_punctuation_removal(self): + """Test removing punctuation marks from the end of titles.""" + test_cases = { + # ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ символы + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚,": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚;": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚:": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚!": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚!", + + # ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ символов + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚...": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.,;:": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.!": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.!", + "Π‘Ρ‚Ρ€ΠΎΠΊΠ°.....": "Π‘Ρ‚Ρ€ΠΎΠΊΠ°", + + # Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π½Π΅ Π² ΠΊΠΎΠ½Ρ†Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ + "ΠŸΡ€ΠΈ.Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ.Π²Π΅Ρ‚", + "ΠŸΡ€ΠΈ,Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ,Π²Π΅Ρ‚", + "ΠŸΡ€ΠΈ;Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ;Π²Π΅Ρ‚", + "ΠŸΡ€ΠΈ:Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ:Π²Π΅Ρ‚", + "ΠŸΡ€ΠΈ!Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ!Π²Π΅Ρ‚", + "ΠŸΡ€ΠΈ\"Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ\"Π²Π΅Ρ‚", + "ΠŸΡ€ΠΈ'Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ'Π²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + + # Π‘Ρ‚Ρ€ΠΎΠΊΠΈ с ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ послС ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΠΈ + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚. ": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + + # Π―Π·Ρ‹ΠΊΠΈ + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π½Π° русском.": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π½Π° русском", + "Hello.": "Hello", + "Hello,": "Hello", + "ΠŸΡ€ΠΈΠ²Ρ–Ρ‚ ΡƒΠΊΡ€Π°Ρ—Π½ΡΡŒΠΊΠΎΡŽ.": "ΠŸΡ€ΠΈΠ²Ρ–Ρ‚ ΡƒΠΊΡ€Π°Ρ—Π½ΡΡŒΠΊΠΎΡŽ", + "Hola en espaΓ±ol.": "Hola en espaΓ±ol", + + # Π¦ΠΈΡ„Ρ€Ρ‹ + "Число 123.": "Число 123", + + # ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ тСкст + "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.\nКак Π΄Π΅Π»Π°?": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", + + # Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ случаи с ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ + "ВСкст с \"ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ\".": "ВСкст с \"ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ\"", + "ВСкст с 'ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ' ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ.": "ВСкст с 'ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ' ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ", + "ВСкст с \"Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ 'ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ'\".": "ВСкст с \"Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ 'ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ'\"", + "Π¦ΠΈΡ‚Π°Ρ‚Π°: \"Π­Ρ‚ΠΎ Ρ†ΠΈΡ‚Π°Ρ‚Π°.\".": "Π¦ΠΈΡ‚Π°Ρ‚Π°: \"Π­Ρ‚ΠΎ Ρ†ΠΈΡ‚Π°Ρ‚Π°.\"", + + # Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ случаи + "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с восклицаниСм!": "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с восклицаниСм!", + "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с вопросом?": "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с вопросом?", + "Эллипсис...": "Эллипсис", + + "ΠšΠΎΠ½Π΅Ρ† тСкста.,;:": "ΠšΠΎΠ½Π΅Ρ† тСкста", + "Много Ρ‚ΠΎΡ‡Π΅ΠΊ....": "Много Ρ‚ΠΎΡ‡Π΅ΠΊ", + "Π Π°Π·Π½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ.,;": "Π Π°Π·Π½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ", + + # Π Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ + "Анонс ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ:": "Анонс ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ", + "Новый Ρ€Π΅Π»ΠΈΠ· v1.0!": "Новый Ρ€Π΅Π»ΠΈΠ· v1.0!", + "ВаТная информация!!!": "ВаТная информация!!!", + "Автор сказал: \"Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ\".": "Автор сказал: \"Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ\"", + "Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: function() { return true; }": "Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: function() { return true...", + + # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΊΡ€Π°Π΅Π²Ρ‹Π΅ случаи + "Π‘Ρ‚Π°Ρ‚ΡŒΡ...": "Π‘Ρ‚Π°Ρ‚ΡŒΡ", + "Вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹.": "Вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹", + "ΠšΠΎΠ½Π΅Ρ†,": "ΠšΠΎΠ½Π΅Ρ†", + } + + for input_text, expected_output in test_cases.items(): + message = self._create_mock_message(text=input_text) + title = self.parser._generate_title(message) + self.assertEqual(title, expected_output, f"Ошибка ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ '{input_text}': ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ '{title}', оТидалось '{expected_output}'") + if __name__ == '__main__': unittest.main() \ No newline at end of file