StrictDoc Documentation
strictdoc/backend/sdoc_source_code/caching_reader.py
Source file coverage
Path:
strictdoc/backend/sdoc_source_code/caching_reader.py
Lines:
83
Non-empty lines:
76
Non-empty lines covered with requirements:
76 / 76 (100.0%)
Functions:
3
Functions covered by requirements:
3 / 3 (100.0%)
1
"""
2
@relation(SDOC-SRS-33, SDOC-SRS-142, scope=file)
3
"""
4
 
5
from typing import Optional, Union
6
 
7
from strictdoc.backend.sdoc.pickle_cache import PickleCache
8
from strictdoc.backend.sdoc_source_code.models.source_file_info import (
9
    SourceFileTraceabilityInfo,
10
)
11
from strictdoc.backend.sdoc_source_code.reader import (
12
    SourceFileTraceabilityReader,
13
)
14
from strictdoc.backend.sdoc_source_code.reader_c import (
15
    SourceFileTraceabilityReader_C,
16
)
17
from strictdoc.backend.sdoc_source_code.reader_python import (
18
    SourceFileTraceabilityReader_Python,
19
)
20
from strictdoc.backend.sdoc_source_code.reader_registry import (
21
    SourceCodeReaderRegistry,
22
)
23
from strictdoc.backend.sdoc_source_code.reader_robot import (
24
    SourceFileTraceabilityReader_Robot,
25
)
26
from strictdoc.backend.sdoc_source_code.reader_rust import (
27
    SourceFileTraceabilityReader_Rust,
28
)
29
from strictdoc.core.project_config import ProjectConfig
30
 
31
 
32
class SourceFileTraceabilityCachingReader:
33
    @staticmethod
34
    def read_from_file(
35
        path_to_file: str,
36
        project_config: ProjectConfig,
37
        source_node_tags: Optional[set[str]] = None,
38
    ) -> Optional[SourceFileTraceabilityInfo]:
39
        unpickled_content = PickleCache.read_from_cache(
40
            path_to_file, project_config, "source_file"
41
        )
42
        if unpickled_content is not None:
43
            assert isinstance(unpickled_content, SourceFileTraceabilityInfo), (
44
                path_to_file,
45
                unpickled_content,
46
            )
47
            return unpickled_content
48
 
49
        reader = SourceFileTraceabilityCachingReader._get_reader(
50
            path_to_file,
51
            project_config,
52
            source_node_tags,
53
        )
54
        try:
55
            traceability_info = reader.read_from_file(path_to_file)
56
            PickleCache.save_to_cache(
57
                traceability_info,
58
                path_to_file,
59
                project_config,
60
                "source_file",
61
            )
62
        except UnicodeDecodeError as error_:
63
            # Should never reach this point because the binary files should
64
            # already be filtered out at the FileFinder search step.
65
            raise error_
66
 
67
        return traceability_info
68
 
69
    @staticmethod
70
    def _get_reader(
71
        path_to_file: str,
72
        project_config: ProjectConfig,  # noqa: ARG004
73
        source_node_tags: Optional[set[str]] = None,
74
    ) -> Union[
75
        SourceFileTraceabilityReader,
76
        SourceFileTraceabilityReader_Python,
77
        SourceFileTraceabilityReader_C,
78
        SourceFileTraceabilityReader_Robot,
79
        SourceFileTraceabilityReader_Rust,
80
    ]:
81
        return SourceCodeReaderRegistry.get_reader(
82
            path_to_file, project_config, source_node_tags
83
        )