]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-113317: Move FormatCounterFormatter into libclinic (#114066)
authorErlend E. Aasland <erlend@python.org>
Sun, 14 Jan 2024 23:09:26 +0000 (00:09 +0100)
committerGitHub <noreply@github.com>
Sun, 14 Jan 2024 23:09:26 +0000 (00:09 +0100)
Tools/clinic/clinic.py
Tools/clinic/libclinic/__init__.py
Tools/clinic/libclinic/utils.py

index d45159f47a09893979806035d4ce161682b55da3..c247bd075321cd4dd37b08415dd48293a3e8adb1 100755 (executable)
@@ -23,7 +23,6 @@ import os
 import pprint
 import re
 import shlex
-import string
 import sys
 import textwrap
 
@@ -270,24 +269,6 @@ class CRenderData:
         self.unlock: list[str] = []
 
 
-class FormatCounterFormatter(string.Formatter):
-    """
-    This counts how many instances of each formatter
-    "replacement string" appear in the format string.
-
-    e.g. after evaluating "string {a}, {b}, {c}, {a}"
-         the counts dict would now look like
-         {'a': 2, 'b': 1, 'c': 1}
-    """
-    def __init__(self) -> None:
-        self.counts = collections.Counter[str]()
-
-    def get_value(
-        self, key: str, args: object, kwargs: object  # type: ignore[override]
-    ) -> Literal['']:
-        self.counts[key] += 1
-        return ''
-
 class Language(metaclass=abc.ABCMeta):
 
     start_line = ""
@@ -341,7 +322,7 @@ class Language(metaclass=abc.ABCMeta):
             fields = ['dsl_name']
             fields.extend(additional_fields)
             line: str = getattr(self, attr)
-            fcf = FormatCounterFormatter()
+            fcf = libclinic.FormatCounterFormatter()
             fcf.format(line)
             def local_fail(should_be_there_but_isnt: bool) -> None:
                 if should_be_there_but_isnt:
index f26bf3ef6d55fe663737e4fe8613ba9088218074..1b300b55acc21e6a98965b356d2a9bac7d99aa6b 100644 (file)
@@ -16,8 +16,9 @@ from .formatting import (
     wrapped_c_string_literal,
 )
 from .utils import (
-    create_regex,
+    FormatCounterFormatter,
     compute_checksum,
+    create_regex,
     write_file,
 )
 
@@ -39,8 +40,9 @@ __all__ = [
     "wrapped_c_string_literal",
 
     # Utility functions
-    "create_regex",
+    "FormatCounterFormatter",
     "compute_checksum",
+    "create_regex",
     "write_file",
 ]
 
index 1514558cb5665c75c506f879b73f8192d8f66409..d2d09387a73d1ea1069f1d645a6a23127c3d69ef 100644 (file)
@@ -1,6 +1,9 @@
+import collections
 import hashlib
-import re
 import os
+import re
+import string
+from typing import Literal
 
 
 def write_file(filename: str, new_contents: str) -> None:
@@ -39,7 +42,27 @@ def create_regex(
     group_re = r"\w+" if word else ".+"
     before = re.escape(before)
     after = re.escape(after)
-    pattern = fr"{before}({group_re}){after}"
+    pattern = rf"{before}({group_re}){after}"
     if whole_line:
-        pattern = fr"^{pattern}$"
+        pattern = rf"^{pattern}$"
     return re.compile(pattern)
+
+
+class FormatCounterFormatter(string.Formatter):
+    """
+    This counts how many instances of each formatter
+    "replacement string" appear in the format string.
+
+    e.g. after evaluating "string {a}, {b}, {c}, {a}"
+         the counts dict would now look like
+         {'a': 2, 'b': 1, 'c': 1}
+    """
+
+    def __init__(self) -> None:
+        self.counts = collections.Counter[str]()
+
+    def get_value(
+        self, key: str, args: object, kwargs: object  # type: ignore[override]
+    ) -> Literal[""]:
+        self.counts[key] += 1
+        return ""