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

1""" 

2Utility functions for pattern generation. 

3""" 

4 

5from typing import TYPE_CHECKING, List, Tuple 

6 

7from ..utils.types import PathSeparator 

8 

9if TYPE_CHECKING: 

10 from ..search.search_policy import SearchPolicy 

11 

12 

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 

23 

24 

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 

35 

36 

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 = [] 

42 

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) 

52 

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 ) 

68 

69 return patterns