ocx-model-validator 0.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ocx_model_validator/__init__.py +38 -0
- ocx_model_validator/builders/__init__.py +12 -0
- ocx_model_validator/builders/base.py +27 -0
- ocx_model_validator/builders/factory.py +54 -0
- ocx_model_validator/builders/v3_builder.py +1373 -0
- ocx_model_validator/cli.py +224 -0
- ocx_model_validator/exeptions.py +25 -0
- ocx_model_validator/frame_table.py +180 -0
- ocx_model_validator/generate_stubs.py +624 -0
- ocx_model_validator/mcp/__init__.py +1 -0
- ocx_model_validator/mcp/server.py +123 -0
- ocx_model_validator/mcp/state.py +17 -0
- ocx_model_validator/model/__init__.py +83 -0
- ocx_model_validator/model/ir/__init__.py +145 -0
- ocx_model_validator/model/ir/arrangement.py +117 -0
- ocx_model_validator/model/ir/base.py +88 -0
- ocx_model_validator/model/ir/catalogues.py +46 -0
- ocx_model_validator/model/ir/connections.py +22 -0
- ocx_model_validator/model/ir/geometry.py +192 -0
- ocx_model_validator/model/ir/metadata.py +63 -0
- ocx_model_validator/model/ir/sections.py +152 -0
- ocx_model_validator/model/ir/structural.py +457 -0
- ocx_model_validator/model/units.py +438 -0
- ocx_model_validator/parsers/__init__.py +6 -0
- ocx_model_validator/parsers/base_parser.py +51 -0
- ocx_model_validator/parsers/dynamic_loader.py +152 -0
- ocx_model_validator/parsers/load_tools.py +24 -0
- ocx_model_validator/parsers/parser.py +145 -0
- ocx_model_validator/parsers/serializer.py +70 -0
- ocx_model_validator/reporting/__init__.py +1 -0
- ocx_model_validator/reporting/generators/__init__.py +1 -0
- ocx_model_validator/reporting/generators/_common.py +68 -0
- ocx_model_validator/reporting/generators/_compartment_data.py +242 -0
- ocx_model_validator/reporting/generators/bom.py +153 -0
- ocx_model_validator/reporting/generators/catalogues.py +132 -0
- ocx_model_validator/reporting/generators/compartments.py +59 -0
- ocx_model_validator/reporting/generators/frame_table.py +63 -0
- ocx_model_validator/reporting/generators/model_extent.py +86 -0
- ocx_model_validator/reporting/model.py +36 -0
- ocx_model_validator/reporting/renderers/__init__.py +24 -0
- ocx_model_validator/reporting/renderers/base.py +12 -0
- ocx_model_validator/reporting/renderers/markdown.py +61 -0
- ocx_model_validator/reporting/renderers/rich.py +48 -0
- ocx_model_validator/utils.py +31 -0
- ocx_model_validator/writeback.py +176 -0
- ocx_model_validator-0.4.0.dist-info/METADATA +222 -0
- ocx_model_validator-0.4.0.dist-info/RECORD +50 -0
- ocx_model_validator-0.4.0.dist-info/WHEEL +4 -0
- ocx_model_validator-0.4.0.dist-info/entry_points.txt +4 -0
- ocx_model_validator-0.4.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""ocx_model_validator — parse and validate OCX .3docx ship model files.
|
|
2
|
+
|
|
3
|
+
Public API
|
|
4
|
+
----------
|
|
5
|
+
OcxParser — parse a .3docx file into an OCX root dataclass
|
|
6
|
+
get_builder — return the correct IR builder for a schema version
|
|
7
|
+
IrVessel — root IR dataclass (schema-neutral)
|
|
8
|
+
|
|
9
|
+
Exceptions
|
|
10
|
+
----------
|
|
11
|
+
XmlParserError, SourceError, DynamicLoaderError, ConverterError
|
|
12
|
+
"""
|
|
13
|
+
from ocx_model_validator.builders.factory import get_builder
|
|
14
|
+
from ocx_model_validator.exeptions import (
|
|
15
|
+
ConverterError,
|
|
16
|
+
ConverterWarning,
|
|
17
|
+
DynamicLoaderError,
|
|
18
|
+
SourceError,
|
|
19
|
+
XmlParserError,
|
|
20
|
+
)
|
|
21
|
+
from ocx_model_validator.model.ir import IrVessel
|
|
22
|
+
from ocx_model_validator.parsers.dynamic_loader import DeclarationOfOcxImport, DynamicLoader
|
|
23
|
+
from ocx_model_validator.parsers.parser import OcxParser
|
|
24
|
+
|
|
25
|
+
__version__ = "0.1.0"
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
"OcxParser",
|
|
29
|
+
"get_builder",
|
|
30
|
+
"IrVessel",
|
|
31
|
+
"DeclarationOfOcxImport",
|
|
32
|
+
"DynamicLoader",
|
|
33
|
+
"XmlParserError",
|
|
34
|
+
"SourceError",
|
|
35
|
+
"DynamicLoaderError",
|
|
36
|
+
"ConverterError",
|
|
37
|
+
"ConverterWarning",
|
|
38
|
+
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Builder package — translates versioned OCX dataclasses into IR types."""
|
|
2
|
+
from .base import IOcxBuilder, UnsupportedSchemaVersionError
|
|
3
|
+
from .factory import get_builder
|
|
4
|
+
from .v3_builder import OcxV3Builder
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"IOcxBuilder",
|
|
8
|
+
"UnsupportedSchemaVersionError",
|
|
9
|
+
"get_builder",
|
|
10
|
+
"OcxV3Builder",
|
|
11
|
+
]
|
|
12
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Abstract base for OCX IR builders."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
|
|
6
|
+
from ocx_model_validator.model.ir import IrVessel
|
|
7
|
+
from ocx_model_validator.utils import MetaData # noqa: F401 – re-exported for back-compat
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class UnsupportedSchemaVersionError(Exception):
|
|
11
|
+
"""Raised when no builder is registered for the given schema version."""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class IOcxBuilder(ABC):
|
|
15
|
+
"""Translate a parsed OCX root dataclass into a schema-neutral ``IrVessel``.
|
|
16
|
+
|
|
17
|
+
Implement one concrete subclass per OCX schema version family (e.g. v3.x).
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def build(self, root) -> IrVessel:
|
|
22
|
+
"""Build and return a fully-populated ``IrVessel`` from the raw root."""
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def supported_versions(self) -> list[tuple[int, int]]:
|
|
26
|
+
"""Return the (major, minor) version tuples this builder handles."""
|
|
27
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Builder factory — maps a schema version string to the correct IOcxBuilder."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from loguru import logger
|
|
5
|
+
|
|
6
|
+
from .base import IOcxBuilder, UnsupportedSchemaVersionError
|
|
7
|
+
from .v3_builder import OcxV3Builder
|
|
8
|
+
|
|
9
|
+
# Registry: (major, minor) → builder class.
|
|
10
|
+
# Add entries here as new schema families are supported.
|
|
11
|
+
_BUILDER_REGISTRY: dict[tuple[int, int], type[IOcxBuilder]] = {
|
|
12
|
+
(3, 0): OcxV3Builder,
|
|
13
|
+
(3, 1): OcxV3Builder,
|
|
14
|
+
(3, 2): OcxV3Builder,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
# Fallback: major-only registry for unknown minor versions within a known family.
|
|
18
|
+
_MAJOR_FALLBACK: dict[int, type[IOcxBuilder]] = {
|
|
19
|
+
3: OcxV3Builder,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def get_builder(schema_version: str) -> IOcxBuilder:
|
|
24
|
+
"""Return an ``IOcxBuilder`` instance for the given schema version string.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
schema_version: Version string such as ``"3.0.0"`` or ``"3.1.0"``.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
A ready-to-use builder instance.
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
UnsupportedSchemaVersionError: If no builder exists for the version.
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
parts = [int(p) for p in schema_version.split(".") if p.isdigit()]
|
|
37
|
+
major = parts[0] if parts else -1
|
|
38
|
+
minor = parts[1] if len(parts) > 1 else 0
|
|
39
|
+
except (ValueError, IndexError):
|
|
40
|
+
major, minor = -1, 0
|
|
41
|
+
|
|
42
|
+
cls = _BUILDER_REGISTRY.get((major, minor)) or _MAJOR_FALLBACK.get(major)
|
|
43
|
+
|
|
44
|
+
if cls is None:
|
|
45
|
+
raise UnsupportedSchemaVersionError(
|
|
46
|
+
f"No builder registered for OCX schema version {schema_version!r}. "
|
|
47
|
+
f"Registered versions: {sorted(_BUILDER_REGISTRY.keys())}"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
logger.debug(
|
|
51
|
+
f"Schema version {schema_version!r} → {cls.__name__}"
|
|
52
|
+
)
|
|
53
|
+
return cls()
|
|
54
|
+
|