Source code for petab.versions

"""Handling of PEtab version numbers."""

from __future__ import annotations

import re
from pathlib import Path

import petab

__all__ = [
    "get_major_version",
    "parse_version",
]
from . import v1

# version regex pattern
_version_pattern = (
    r"(?P<major>\d+)(?:\.(?P<minor>\d+))?"
    r"(?:\.(?P<patch>\d+))?(?P<suffix>[\w.]+)?"
)
_version_re = re.compile(_version_pattern)


[docs] def parse_version(version: str | int) -> tuple[int, int, int, str]: """Parse a version string into a tuple of integers and suffix.""" if isinstance(version, int): return version, 0, 0, "" version = str(version) match = _version_re.match(version) if match is None: raise ValueError(f"Invalid version string: {version}") major = int(match.group("major")) minor = int(match.group("minor") or 0) patch = int(match.group("patch") or 0) suffix = match.group("suffix") or "" return major, minor, patch, suffix
[docs] def get_major_version( problem: str | dict | Path | petab.v1.Problem | petab.v2.Problem, ) -> int: """Get the major version number of the given problem.""" version = None if isinstance(problem, str | Path): from petab.v1.yaml import load_yaml yaml_config = load_yaml(problem) version = yaml_config.get(v1.C.FORMAT_VERSION) elif isinstance(problem, dict): version = problem.get(v1.C.FORMAT_VERSION) if version is not None: version = str(version) return int(version.split(".")[0]) if isinstance(problem, petab.v1.Problem): return 1 from . import v2 if isinstance(problem, v2.Problem): return 2 raise ValueError(f"Unsupported argument type: {type(problem)}")