Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
# Change Log

## [v2.5.1](https://github.com/simvue-io/python-api/releases/tag/v2.5.1) - 2026-05-06
## [v2.5.2](https://github.com/simvue-io/python-api/releases/tag/v2.5.2) - 2026-05-15

- Fixed issue whereby providing alternative server URL or token arguments was ignored.
- Fixed legacy event logging support.

## ~~[v2.5.1](https://github.com/simvue-io/python-api/releases/tag/v2.5.1) - 2026-05-06~~

**Yanked from PyPi as issue not fixed.**

- ~~Fixed legacy event logging support.~~

## [v2.5.0](https://github.com/simvue-io/python-api/releases/tag/v2.5.0) - 2026-05-05

- Added support for log level in events creation.
Expand Down
166 changes: 83 additions & 83 deletions poetry.lock

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "simvue"
version = "2.5.1"
version = "2.5.2"
description = "Simulation tracking and monitoring"
authors = [{ name = "Simvue Development Team", email = "info@simvue.io" }]
license = "Apache v2"
Expand Down Expand Up @@ -85,6 +85,9 @@ pytest-timeout = "^2.3.1"
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

[dependency-groups]
dev = []

[tool.ruff]
lint.extend-select = ["C901", "T201"]
lint.mccabe.max-complexity = 11
Expand Down
4 changes: 1 addition & 3 deletions simvue/api/objects/administrator/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
"""
Simvue Admin Objects
====================
"""Simvue Admin Objects.

These are Simvue objects only accessible to an administrator of
the server.
Expand Down
81 changes: 70 additions & 11 deletions simvue/api/objects/administrator/tenant.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
"""
Simvue Tenants
==============
"""Simvue Tenants.

Contains a class for remotely connecting to Simvue tenants, or defining
a new tenant given relevant arguments.

"""

try:
from typing import Self
from typing import Self, override
except ImportError:
from typing_extensions import Self
from typing_extensions import Self, override
from collections.abc import Generator
import pydantic
import datetime

Expand All @@ -19,16 +18,21 @@


class Tenant(SimvueObject):
"""
Simvue Tenant
=============
"""Simvue Tenant.

This class is used to connect to/create tenant objects on the Simvue server,
any modification of instance attributes is mirrored on the remote object.

"""

def __init__(self, identifier: str | None = None, **kwargs) -> None:
@override
def __init__(
self,
identifier: str | None = None,
server_url: str | None = None,
server_token: pydantic.SecretStr | None = None,
**kwargs,
) -> None:
"""Initialise a Tenant

If an identifier is provided a connection will be made to the
Expand All @@ -41,11 +45,18 @@ def __init__(self, identifier: str | None = None, **kwargs) -> None:
----------
identifier : str, optional
the remote server unique id for the target folder
server_url: str | None, optional
alternative server URL, default None
server_token : str | None, optional
token for alternative server, default None
**kwargs : dict
any additional arguments to be passed to the object initialiser
"""
super().__init__(identifier, **kwargs)
super().__init__(
identifier, server_url=server_url, server_token=server_token, **kwargs
)

@override
@classmethod
@pydantic.validate_call
def new(
Expand All @@ -57,6 +68,8 @@ def new(
max_runs: int = 0,
max_data_volume: int = 0,
offline: bool = False,
server_url: str | None = None,
server_token: pydantic.SecretStr | None = None,
**_,
) -> Self:
"""Create a new tenant on the Simvue server.
Expand All @@ -77,23 +90,69 @@ def new(
the maximum volume of data allowed within this tenant, default is no limit.
offline: bool, optional
create in offline mode, default is False.
server_url: str | None, optional
alternative server URL, default None
server_token : str | None, optional
token for alternative server, default None

Returns
-------
Tenant
a tenant instance with staged changes

"""
return Tenant(
return cls(
name=name,
is_enabled=is_enabled,
max_request_rate=max_request_rate,
max_runs=max_runs,
max_data_volume=max_data_volume,
server_url=server_url,
server_token=server_token,
_read_only=False,
_offline=offline,
)

@override
@classmethod
@pydantic.validate_call
def get(
cls,
*,
count: pydantic.PositiveInt | None = None,
offset: pydantic.NonNegativeInt | None = None,
server_url: str | None = None,
server_token: pydantic.SecretStr | None = None,
**kwargs,
) -> Generator[tuple[str, Self | None]]:
"""Retrieve tenants from the server.

Parameters
----------
count: int | None, optional
limit number of objects
offset : int | None, optional
set start index for objects list
server_url: str | None, optional
alternative server URL, default None
server_token : str | None, optional
token for alternative server, default None

Yields
------
tuple[str, Tenant | None]
object corresponding to an entry on the server.

Returns
-------
Generator[tuple[str, Tenant | None]]
"""
# Currently no tenant filters
_ = kwargs.pop("filters", None)
return super().get(
count=count, offset=offset, server_url=server_url, server_token=server_token
)

@property
def name(self) -> str:
"""Retrieve the name of the tenant"""
Expand Down
64 changes: 50 additions & 14 deletions simvue/api/objects/administrator/user.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
"""
Simvue Users
============
"""Simvue Users.

Contains a class for remotely connecting to Simvue users, or defining
a new user given relevant arguments.
Expand All @@ -13,23 +11,29 @@
from simvue.models import DATETIME_FORMAT

try:
from typing import Self
from typing import Self, override
except ImportError:
from typing_extensions import Self
from typing_extensions import Self, override
from simvue.api.objects.base import SimvueObject, staging_check, write_only


class User(SimvueObject):
"""
Simvue User
===========
"""Simvue User.

This class is used to connect to/create user objects on the Simvue server,
any modification of instance attributes is mirrored on the remote object.

"""

def __init__(self, identifier: str | None = None, **kwargs) -> None:
@override
def __init__(
self,
identifier: str | None = None,
*,
server_url: str | None = None,
server_token: pydantic.SecretStr | None = None,
**kwargs,
) -> None:
"""Initialise a User

If an identifier is provided a connection will be made to the
Expand All @@ -42,11 +46,18 @@ def __init__(self, identifier: str | None = None, **kwargs) -> None:
----------
identifier : str, optional
the remote server unique id for the target folder
server_url: str | None, optional
alternative server URL, default None
server_token : str | None, optional
token for alternative server, default None
**kwargs : dict
any additional arguments to be passed to the object initialiser
"""
super().__init__(identifier, **kwargs)
super().__init__(
identifier, server_url=server_url, server_token=server_token, **kwargs
)

@override
@classmethod
@pydantic.validate_call
def new(
Expand All @@ -62,6 +73,8 @@ def new(
tenant: str,
enabled: bool = True,
offline: bool = False,
server_url: str | None = None,
server_token: pydantic.SecretStr | None = None,
**_,
) -> Self:
"""Create a new user on the Simvue server.
Expand Down Expand Up @@ -90,6 +103,10 @@ def new(
whether to enable the user on creation, default is True
offline: bool, optional
create in offline mode, default is False.
server_url: str | None, optional
alternative server URL, default None
server_token : str | None, optional
token for alternative server, default None

Returns
-------
Expand All @@ -107,19 +124,28 @@ def new(
"is_admin": is_admin,
"is_enabled": enabled,
}
_user = User(
_user = cls(
user=_user_info,
tenant=tenant,
offline=offline,
_read_only=False,
_offline=offline,
server_url=server_url,
server_token=server_token,
)
_user._staging |= _user_info
return _user

@override
@classmethod
def get(
cls, *, count: int | None = None, offset: int | None = None, **kwargs
cls,
*,
count: int | None = None,
offset: int | None = None,
server_url: str | None = None,
server_token: pydantic.SecretStr | None = None,
**kwargs,
) -> dict[str, "User"]:
"""Retrieve users from the Simvue server.

Expand All @@ -129,15 +155,25 @@ def get(
limit the number of results, default is no limit.
offset : int, optional
start index for results, default is 0.
server_url: str | None, optional
alternative server URL, default None
server_token : str | None, optional
token for alternative server, default None

Yields
------
User
user instance representing user on server
"""
# Currently no user filters
kwargs.pop("filters", None)
return super().get(count=count, offset=offset, **kwargs)
_ = kwargs.pop("filters", None)
return super().get(
count=count,
offset=offset,
server_url=server_url,
server_token=server_token,
**kwargs,
)

@property
@staging_check
Expand Down
4 changes: 1 addition & 3 deletions simvue/api/objects/alert/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
"""
Simvue Alerts
=============
"""Simvue Alert Retrieval.

Creation and management of Alerts on the Simvue server, the
alerts are split into sub-categories to ensure correct arguments
Expand Down
34 changes: 23 additions & 11 deletions simvue/api/objects/alert/base.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
"""
Alert Object Base
=================
"""Alert Object Base.

Contains general definitions for Simvue Alert objects.

Expand All @@ -16,9 +14,9 @@
from simvue.models import NAME_REGEX, DATETIME_FORMAT

try:
from typing import override
from typing import Self, override
except ImportError:
from typing_extensions import override # noqa: UP035
from typing_extensions import Self, override # noqa: UP035


class AlertBase(SimvueObject):
Expand All @@ -27,15 +25,29 @@ class AlertBase(SimvueObject):
Contains properties common to all alert types.
"""

_label: str = "alert"

@override
@classmethod
def new(cls, read_only: bool = False, **kwargs):
"""Create a new alert"""
pass
def new(cls, *_, **__) -> Self:
raise NotImplementedError

def __init__(self, identifier: str | None = None, **kwargs) -> None:
@override
def __init__(
self,
identifier: str | None = None,
*,
server_url: str | None = None,
server_token: pydantic.SecretStr | None = None,
**kwargs,
) -> None:
"""Retrieve an alert from the Simvue server by identifier"""
self._label = "alert"
super().__init__(identifier=identifier, **kwargs)
super().__init__(
identifier=identifier,
server_url=server_url,
server_token=server_token,
**kwargs,
)
self._local_only_args += [
"frequency",
"pattern",
Expand Down
Loading
Loading