Path:
strictdoc/backend/sdoc_source_code/models/source_node.py
Lines:
67
Non-empty lines:
58
Non-empty lines covered with requirements:
58 / 58 (100.0%)
Functions:
3
Functions covered by requirements:
3 / 3 (100.0%)
1
"""2
@relation(SDOC-SRS-141, scope=file)3
"""4
5
from dataclasses import dataclass, field
6
from typing import Any, List, Optional, Union
7
8
from strictdoc.backend.sdoc_source_code.models.language import LanguageItem
9
from strictdoc.backend.sdoc_source_code.models.language_item_marker import (
10
LanguageItemMarker,
11
)12
from strictdoc.backend.sdoc_source_code.models.line_marker import LineMarker
13
from strictdoc.backend.sdoc_source_code.models.range_marker import (
14
RangeMarker,
15
)16
from strictdoc.backend.sdoc_source_code.models.source_location import ByteRange
17
from strictdoc.core.project_config import SourceNodesEntry
18
19
20
@dataclass(eq=False)
21
class SourceNode:
22
"""
23
NOTE: eq=False is needed to make this dataclass support being a dictionary key.24
25
eq=False means that dictionaries will index by object identity. Copied26
SourceNode objects will appear as two different SourceNodes. An alternative27
could be to implement __eq__ and __hash__ so that they target byte_range.28
"""29
30
entity_name: Optional[str]
31
comment_byte_range: Optional[ByteRange]
32
markers: List[Union[LanguageItemMarker, RangeMarker, LineMarker]] = field(
33
default_factory=list
34
)35
fields: dict[str, str] = field(default_factory=dict)
36
fields_locations: dict[str, tuple[int, int]] = field(default_factory=dict)
37
function: Optional[LanguageItem] = None
38
# FIXME: Adding SDocNode here causes circular import problem.39
sdoc_node: Optional[Any] = None
40
41
def get_sdoc_field(
42
self,
43
field_name: str,
44
cfg_entry: SourceNodesEntry,
45
) -> Optional[str]:
46
if field_name in cfg_entry.sdoc_to_source_map:
47
field_name = cfg_entry.sdoc_to_source_map[field_name]
48
return self.fields.get(field_name)
49
50
def get_sdoc_fields(self, cfg_entry: SourceNodesEntry) -> dict[str, str]:
51
"""
52
Get SDoc representation of all available fields.53
54
Returns a dict equivalent to self.fields unless config option 'sdoc_to_source_map' is set.55
"""56
fields = {
57
field_name: self.fields[field_name]
58
for field_name in self.fields
59
if field_name not in cfg_entry.sdoc_to_source_map.values()
60
}61
for (
62
field_name,
63
mapped_field_name,
64
) in cfg_entry.sdoc_to_source_map.items():
65
if mapped_field_name in self.fields:
66
fields[field_name] = self.fields[mapped_field_name]
67
return fields