Coverage for src/jsoncrack_for_sphinx/schema/schema_finder.py: 100%

31 statements  

« prev     ^ index     » next       coverage.py v7.10.0, created at 2025-07-24 22:26 +0000

1""" 

2Schema file search functionality. 

3""" 

4 

5from pathlib import Path 

6from typing import Optional, Tuple 

7 

8from sphinx.util import logging 

9 

10from ..patterns.pattern_generator import generate_search_patterns 

11from ..search.search_policy import SearchPolicy 

12 

13logger = logging.getLogger(__name__) 

14 

15 

16def find_schema_for_object( 

17 obj_name: str, schema_dir: str, search_policy: Optional[SearchPolicy] = None 

18) -> Optional[Tuple[Path, str]]: 

19 """ 

20 Find schema file for a given object (function/method). 

21 

22 Args: 

23 obj_name: Full name of the object (e.g., "example_module.User.create") 

24 schema_dir: Directory containing schema files 

25 search_policy: Search policy to use (optional, uses default if None) 

26 

27 Returns: 

28 Tuple of (Path to schema file, file type) if found, None otherwise 

29 File type is either 'schema' for .schema.json files or 'json' for .json files 

30 """ 

31 logger.debug(f"Looking for schema for object: {obj_name}") 

32 logger.debug(f"Schema directory: {schema_dir}") 

33 

34 if not schema_dir: 

35 logger.debug("No schema directory configured") 

36 return None 

37 

38 schema_dir_path = Path(schema_dir) 

39 if not schema_dir_path.exists(): 

40 logger.warning(f"Schema directory does not exist: {schema_dir}") 

41 return None 

42 

43 # Use default search policy if none provided 

44 if search_policy is None: 

45 search_policy = SearchPolicy() 

46 logger.debug("Using default search policy") 

47 else: 

48 logger.debug(f"Using custom search policy: {search_policy}") 

49 

50 # Generate search patterns using the policy 

51 patterns = generate_search_patterns(obj_name, search_policy) 

52 

53 logger.debug(f"Trying {len(patterns)} patterns:") 

54 for pattern, file_type in patterns: 

55 logger.debug(f" Checking pattern: {pattern}") 

56 schema_path = schema_dir_path / pattern 

57 if schema_path.exists(): 

58 logger.info( 

59 f"Found schema file: {schema_path} (type: {file_type}) " 

60 f"for object: {obj_name}" 

61 ) 

62 return schema_path, file_type 

63 else: 

64 logger.debug(f" File not found: {schema_path}") 

65 

66 logger.warning(f"No schema file found for object: {obj_name}") 

67 return None