jenkins-bot has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1343146?usp=email )

Change subject: pagegenerators: Cache compiled ignore patterns
......................................................................

pagegenerators: Cache compiled ignore patterns

Compile page-title ignore patterns lazily once per site name.
Reuse the compiled patterns for every later page from the same site.

Change-Id: If9cf34f29a6ed5becb02fbbe5b8cef3d90a609f2
---
M pywikibot/pagegenerators/_filters.py
M tests/pagegenerators_tests.py
2 files changed, 35 insertions(+), 6 deletions(-)

Approvals:
  Xqt: Looks good to me, approved
  jenkins-bot: Verified




diff --git a/pywikibot/pagegenerators/_filters.py 
b/pywikibot/pagegenerators/_filters.py
index 7163d94..87aa4b6 100644
--- a/pywikibot/pagegenerators/_filters.py
+++ b/pywikibot/pagegenerators/_filters.py
@@ -87,23 +87,32 @@

 def PageTitleFilterPageGenerator(
     generator: Iterable[pywikibot.page.BasePage],
-    ignore_list: dict[str, dict[str, str]],
+    ignore_list: dict[str, dict[str, Sequence[str]]],
 ) -> Generator[pywikibot.page.BasePage]:
     """Yield only those pages are not listed in the ignore list.

     :param ignore_list: Family names are mapped to dictionaries in which
         language codes are mapped to lists of page titles. Each title must
-        be a valid regex as they are compared using :py:obj:`re.search`.
+        be a valid regex.
     """
+    compiled_ignores: dict[str, tuple[re.Pattern[str], ...]] = {}
     for page in generator:
+        site = page.site
+        sitename = site.sitename
         try:
-            site_ig_list = ignore_list[page.site.family.name][page.site.code]
+            compiled_site_ignores = compiled_ignores[sitename]
         except KeyError:
-            yield page
-            continue
+            try:
+                site_ignores = ignore_list[site.family.name][site.code]
+            except KeyError:
+                yield page
+                continue
+            compiled_site_ignores = tuple(map(re.compile, site_ignores))
+            compiled_ignores[sitename] = compiled_site_ignores

         page_title = page.title()
-        if not any(re.search(ig, page_title) for ig in site_ig_list):
+        if not any(pattern.search(page_title)
+                   for pattern in compiled_site_ignores):
             yield page
             continue

diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py
index 08ff461..f4b64be 100755
--- a/tests/pagegenerators_tests.py
+++ b/tests/pagegenerators_tests.py
@@ -8,6 +8,7 @@

 import calendar
 import datetime
+import re
 import sys
 import unittest
 from collections import Counter
@@ -159,6 +160,25 @@
             gen, ('Talk', 'Template'), site)
         self.assertLength(tuple(gen), 10)

+    def test_PageTitleFilterPageGenerator_compiles_once(self) -> None:
+        """Test ignore patterns are compiled once per site."""
+        patterns = ['^Talk:', '/Meta$']
+        ignore_list = {'wikipedia': {'en': patterns}}
+        pages = list(pagegenerators.PagesFromTitlesGenerator(
+            self.titles, self.site))
+        expected = [page for page in pages
+                    if not page.title().startswith('Talk:')
+                    and not page.title().endswith('/Meta')]
+
+        with mock.patch(
+            'pywikibot.pagegenerators._filters.re.compile', wraps=re.compile
+        ) as compile_pattern:
+            result = list(pagegenerators.PageTitleFilterPageGenerator(
+                pages, ignore_list))
+
+        self.assertEqual(result, expected)
+        self.assertEqual(compile_pattern.call_count, len(patterns))
+
     def test_category_filter_enumerates_once(self) -> None:
         """Test that categories are enumerated once for multiple filters."""
         categories = [

--
To view, visit 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1343146?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.wikimedia.org/r/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: If9cf34f29a6ed5becb02fbbe5b8cef3d90a609f2
Gerrit-Change-Number: 1343146
Gerrit-PatchSet: 5
Gerrit-Owner: Mahveotm <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to