mirror of
https://github.com/python/cpython.git
synced 2025-11-03 19:34:08 +00:00
gh-113317: Move FormatCounterFormatter into libclinic (#114066)
This commit is contained in:
parent
4de4e654e5
commit
1709020e8e
3 changed files with 31 additions and 25 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue