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%)
- "7.1. Link requirements with source files" (REQUIREMENT)
- "7.2.1. Language-aware parsing of source code" (REQUIREMENT)
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
@staticmethod34
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 should64
# already be filtered out at the FileFinder search step.65
raise error_
66
67
return traceability_info
68
69
@staticmethod70
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
)