Source code for conntextual.ui.channel.pattern

"""
A module implementing an include/exclude pattern matching interface.
"""

# built-in
import re
from typing import List, NamedTuple, Optional, Union

PatternList = List[re.Pattern[str]]
StringOrList = Union[str, List[str]]


[docs] class PatternPair(NamedTuple): """A container for managing pattern data.""" includes: PatternList excludes: PatternList
[docs] def matches(self, data: str) -> bool: """Determine whether or not a string matches this pattern pair.""" include_result = True if self.includes: include_result = any( include.search(data) is not None for include in self.includes ) exclude_result = False if include_result: exclude_result = any( exclude.search(data) is not None for exclude in self.excludes ) return include_result and not exclude_result
[docs] @staticmethod def from_dict(data: dict[str, StringOrList]) -> "PatternPair": """Create a pattern pair from dictionary data.""" includes: PatternList = [] excludes: PatternList = [] for patterns, keys in zip( [includes, excludes], [ ["include", "includes", "included"], ["exclude", "excludes", "excluded"], ], ): for key in keys: pattern: Optional[StringOrList] = data.get(key) if pattern: if isinstance(pattern, str): patterns.append(re.compile(pattern)) else: patterns += [re.compile(x) for x in pattern] return PatternPair(includes, excludes)