StrictDoc Documentation
strictdoc/backend/reqif/reqif_import.py
Source file coverage
Path:
strictdoc/backend/reqif/reqif_import.py
Lines:
78
Non-empty lines:
68
Non-empty lines covered with requirements:
68 / 68 (100.0%)
Functions:
4
Functions covered by requirements:
4 / 4 (100.0%)
1
"""
2
@relation(SDOC-SRS-72, scope=file)
3
"""
4
 
5
import os.path
6
from dataclasses import dataclass
7
from typing import List, Optional
8
 
9
from reqif.parser import ReqIFParser, ReqIFZParser
10
from reqif.reqif_bundle import ReqIFBundle, ReqIFZBundle
11
 
12
from strictdoc.backend.reqif.p01_sdoc.reqif_to_sdoc_converter import (
13
    P01_ReqIFToSDocConverter,
14
)
15
from strictdoc.backend.reqif.sdoc_reqif_fields import ReqIFProfile
16
from strictdoc.backend.sdoc.models.document import SDocDocument
17
from strictdoc.core.project_config import ProjectConfig
18
 
19
 
20
@dataclass
21
class ReqIFImportOptions:
22
    input_path: str
23
    reqif_profile: str
24
    reqif_enable_mid: bool
25
    reqif_import_markup: Optional[str]
26
 
27
 
28
class ReqIFImport:
29
    @staticmethod
30
    def import_from_file(
31
        import_config: ReqIFImportOptions, project_config: ProjectConfig
32
    ) -> List[SDocDocument]:
33
        converter = ReqIFImport.select_reqif_profile(import_config)
34
 
35
        assert os.path.isfile(import_config.input_path), (
36
            import_config.input_path
37
        )
38
 
39
        documents: List[SDocDocument]
40
        if import_config.input_path.endswith(".reqifz"):
41
            reqifz_bundle: ReqIFZBundle = ReqIFZParser.parse(
42
                import_config.input_path
43
            )
44
            assert len(reqifz_bundle.reqif_bundles) > 0
45
            documents = converter.convert_reqif_bundle(
46
                next(iter(reqifz_bundle.reqif_bundles.values())),
47
                enable_mid=import_config.reqif_enable_mid
48
                or project_config.reqif_enable_mid,
49
                import_markup=import_config.reqif_import_markup
50
                if import_config.reqif_import_markup is not None
51
                else project_config.reqif_import_markup,
52
            )
53
        else:
54
            reqif_bundle: ReqIFBundle = ReqIFParser.parse(
55
                import_config.input_path
56
            )
57
            documents = converter.convert_reqif_bundle(
58
                reqif_bundle,
59
                enable_mid=import_config.reqif_enable_mid
60
                or project_config.reqif_enable_mid,
61
                import_markup=import_config.reqif_import_markup
62
                if import_config.reqif_import_markup is not None
63
                else project_config.reqif_import_markup,
64
            )
65
        return documents
66
 
67
    @staticmethod
68
    def select_reqif_profile(
69
        import_config: ReqIFImportOptions,
70
    ) -> P01_ReqIFToSDocConverter:
71
        if (
72
            import_config.reqif_profile is None
73
            or import_config.reqif_profile == ReqIFProfile.P01_SDOC
74
        ):
75
            return P01_ReqIFToSDocConverter()
76
        raise NotImplementedError(
77
            f"Unsupported profile: {import_config.reqif_profile}"
78
        )