Skip to content

version

ReleaseVersionResource

Bases: ConfigurableResource

A resource for setting up the version release.

Source code in packages/common/src/bag3d/common/resources/version.py
16
17
18
19
class ReleaseVersionResource(ConfigurableResource):
    """A resource for setting up the version release."""

    version: Annotated[str, BeforeValidator(_make_release_version)] = None  # type: ignore[assignment]

ToolVersionsResource

Bases: ConfigurableResource

Extracts and caches tool versions for use in asset code_version.

This resource is instantiated at module import time (not configure_at_launch) to make versions available for code_version decorator parameters.

Source code in packages/common/src/bag3d/common/resources/version.py
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
class ToolVersionsResource(ConfigurableResource):
    """Extracts and caches tool versions for use in asset code_version.

    This resource is instantiated at module import time (not configure_at_launch)
    to make versions available for code_version decorator parameters.
    """

    # Tool executable paths (same env vars as other resources)
    exe_tyler: Optional[str] = None
    exe_tyler_db: Optional[str] = None
    exe_tyler_multiformat: Optional[str] = None
    exe_roofer: Optional[str] = None
    exe_ogr2ogr: Optional[str] = None
    exe_pdal: Optional[str] = None
    exe_lasindex: Optional[str] = None
    exe_geof: Optional[str] = None

    # Cached versions
    _version_cache: Dict[str, str] = {}

    def _extract_version(
        self, exe_path: Optional[str], version_flag: str = "--version"
    ) -> str:
        """Extract version by running tool with version flag."""
        if not exe_path:
            return "unknown"

        try:
            result = run(
                [exe_path, version_flag],
                capture_output=True,
                text=True,
                timeout=5,
            )
            # Return first line of output, sanitized
            return result.stdout.strip().split("\n")[0].replace(",", " ")
        except (TimeoutExpired, CalledProcessError, FileNotFoundError) as e:
            logger.warning(f"Failed to extract version for {exe_path}: {e}")
            return "unknown"

    def get_version(self, tool_name: str) -> str:
        """Get version for a tool, with caching."""
        if tool_name in self._version_cache:
            return self._version_cache[tool_name]

        # Extract version based on tool name
        version = "unknown"
        if tool_name == "tyler":
            version = self._extract_version(self.exe_tyler)
        elif tool_name == "tyler-db":
            version = self._extract_version(self.exe_tyler_db)
        elif tool_name == "tyler-multiformat":
            version = self._extract_version(self.exe_tyler_multiformat)
        elif tool_name == "roofer":
            version = self._extract_version(self.exe_roofer)
        elif tool_name == "ogr2ogr":
            version = self._extract_version(self.exe_ogr2ogr)
        elif tool_name == "pdal":
            version = self._extract_version(self.exe_pdal)
        elif tool_name == "lasindex":
            version = self._extract_version(self.exe_lasindex, "-version")
        elif tool_name == "geof":
            version = self._extract_version(self.exe_geof, "--list-plugins")

        self._version_cache[tool_name] = version
        return version

get_version(tool_name)

Get version for a tool, with caching.

Source code in packages/common/src/bag3d/common/resources/version.py
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
def get_version(self, tool_name: str) -> str:
    """Get version for a tool, with caching."""
    if tool_name in self._version_cache:
        return self._version_cache[tool_name]

    # Extract version based on tool name
    version = "unknown"
    if tool_name == "tyler":
        version = self._extract_version(self.exe_tyler)
    elif tool_name == "tyler-db":
        version = self._extract_version(self.exe_tyler_db)
    elif tool_name == "tyler-multiformat":
        version = self._extract_version(self.exe_tyler_multiformat)
    elif tool_name == "roofer":
        version = self._extract_version(self.exe_roofer)
    elif tool_name == "ogr2ogr":
        version = self._extract_version(self.exe_ogr2ogr)
    elif tool_name == "pdal":
        version = self._extract_version(self.exe_pdal)
    elif tool_name == "lasindex":
        version = self._extract_version(self.exe_lasindex, "-version")
    elif tool_name == "geof":
        version = self._extract_version(self.exe_geof, "--list-plugins")

    self._version_cache[tool_name] = version
    return version