diff --git a/src/myxa/models.py b/src/myxa/models.py index 5e330cc..e3e0a42 100644 --- a/src/myxa/models.py +++ b/src/myxa/models.py @@ -1,9 +1,12 @@ import logging +import re from enum import StrEnum from typing import Literal, Optional, Self, Union from pydantic import BaseModel, Field +from myxa.errors import UserError + logger = logging.getLogger(__name__) @@ -58,6 +61,9 @@ def to_str(self) -> str: @classmethod def from_str(cls, s: str) -> Self: + if not re.match(r"\d+\.\d+", s): + msg = f"Invalid version string: {s}" + raise UserError(msg) parts = s.split(".") major = int(parts[0]) minor = int(parts[1]) diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 0000000..4b7ef25 --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,10 @@ +import pytest + +from myxa.errors import UserError +from myxa.models import Version + + +class TestModels: + def test_version_invalid_from_str_raises_user_error(self) -> None: + with pytest.raises(UserError, match="Invalid version string: 100"): + Version.from_str("100")