Coverage for src/jsoncrack_for_sphinx/patterns/pattern_utils.py: 89%
37 statements
« prev ^ index » next coverage.py v7.10.0, created at 2025-07-24 22:26 +0000
« prev ^ index » next coverage.py v7.10.0, created at 2025-07-24 22:26 +0000
1"""
2Utility functions for pattern generation.
3"""
5from typing import TYPE_CHECKING, List, Tuple
7from ..utils.types import PathSeparator
9if TYPE_CHECKING:
10 from ..search.search_policy import SearchPolicy
13def join_with_separator(parts_list: List[str], separator: PathSeparator) -> str:
14 """Join parts with the specified separator."""
15 if separator == PathSeparator.DOT:
16 return ".".join(parts_list)
17 elif separator == PathSeparator.SLASH:
18 return "/".join(parts_list)
19 elif separator == PathSeparator.NONE:
20 return "".join(parts_list)
21 else:
22 return ".".join(parts_list) # fallback
25def remove_duplicates(patterns: List[Tuple[str, str]]) -> List[Tuple[str, str]]:
26 """Remove duplicate patterns while preserving order."""
27 seen = set()
28 unique_patterns = []
29 for pattern, file_type in patterns:
30 key = (pattern, file_type)
31 if key not in seen:
32 seen.add(key)
33 unique_patterns.append((pattern, file_type))
34 return unique_patterns
37def process_custom_patterns(
38 parts: List[str], obj_name: str, search_policy: "SearchPolicy"
39) -> List[Tuple[str, str]]:
40 """Process custom patterns with placeholder substitution."""
41 patterns = []
43 for custom_pattern in search_policy.custom_patterns:
44 # Substitute placeholders in custom patterns
45 expanded_pattern = custom_pattern
46 if len(parts) >= 2:
47 class_name = parts[-2] # Second to last part
48 method_name = parts[-1] # Last part
49 expanded_pattern = expanded_pattern.replace("{class_name}", class_name)
50 expanded_pattern = expanded_pattern.replace("{method_name}", method_name)
51 expanded_pattern = expanded_pattern.replace("{object_name}", obj_name)
53 # Check if pattern already has file extension
54 if expanded_pattern.endswith((".json", ".schema.json")):
55 # Pattern already includes extension, add as-is
56 if expanded_pattern.endswith(".schema.json"):
57 patterns.append((expanded_pattern, "schema"))
58 else:
59 patterns.append((expanded_pattern, "json"))
60 else:
61 # Pattern doesn't have extension, add both variants
62 patterns.extend(
63 [
64 (f"{expanded_pattern}.schema.json", "schema"),
65 (f"{expanded_pattern}.json", "json"),
66 ]
67 )
69 return patterns