Skip to content

Commit b4528d5

Browse files
committed
Fix use of alternative server
1 parent 6cddfc5 commit b4528d5

33 files changed

Lines changed: 1444 additions & 515 deletions

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
# Change Log
22

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

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

8+
## ~~[v2.5.1](https://github.com/simvue-io/python-api/releases/tag/v2.5.1) - 2026-05-06~~
9+
10+
**Yanked from PyPi as issue not fixed.**
11+
12+
- ~~Fixed legacy event logging support.~~
13+
714
## [v2.5.0](https://github.com/simvue-io/python-api/releases/tag/v2.5.0) - 2026-05-05
815

916
- Added support for log level in events creation.

poetry.lock

Lines changed: 83 additions & 83 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "simvue"
3-
version = "2.5.1"
3+
version = "2.5.2"
44
description = "Simulation tracking and monitoring"
55
authors = [{ name = "Simvue Development Team", email = "info@simvue.io" }]
66
license = "Apache v2"
@@ -85,6 +85,9 @@ pytest-timeout = "^2.3.1"
8585
requires = ["poetry-core"]
8686
build-backend = "poetry.core.masonry.api"
8787

88+
[dependency-groups]
89+
dev = []
90+
8891
[tool.ruff]
8992
lint.extend-select = ["C901", "T201"]
9093
lint.mccabe.max-complexity = 11

simvue/api/objects/administrator/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
"""
2-
Simvue Admin Objects
3-
====================
1+
"""Simvue Admin Objects.
42
53
These are Simvue objects only accessible to an administrator of
64
the server.

simvue/api/objects/administrator/tenant.py

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
"""
2-
Simvue Tenants
3-
==============
1+
"""Simvue Tenants.
42
53
Contains a class for remotely connecting to Simvue tenants, or defining
64
a new tenant given relevant arguments.
75
86
"""
97

108
try:
11-
from typing import Self
9+
from typing import Self, override
1210
except ImportError:
13-
from typing_extensions import Self
11+
from typing_extensions import Self, override
12+
from collections.abc import Generator
1413
import pydantic
1514
import datetime
1615

@@ -19,16 +18,21 @@
1918

2019

2120
class Tenant(SimvueObject):
22-
"""
23-
Simvue Tenant
24-
=============
21+
"""Simvue Tenant.
2522
2623
This class is used to connect to/create tenant objects on the Simvue server,
2724
any modification of instance attributes is mirrored on the remote object.
2825
2926
"""
3027

31-
def __init__(self, identifier: str | None = None, **kwargs) -> None:
28+
@override
29+
def __init__(
30+
self,
31+
identifier: str | None = None,
32+
server_url: str | None = None,
33+
server_token: pydantic.SecretStr | None = None,
34+
**kwargs,
35+
) -> None:
3236
"""Initialise a Tenant
3337
3438
If an identifier is provided a connection will be made to the
@@ -41,11 +45,18 @@ def __init__(self, identifier: str | None = None, **kwargs) -> None:
4145
----------
4246
identifier : str, optional
4347
the remote server unique id for the target folder
48+
server_url: str | None, optional
49+
alternative server URL, default None
50+
server_token : str | None, optional
51+
token for alternative server, default None
4452
**kwargs : dict
4553
any additional arguments to be passed to the object initialiser
4654
"""
47-
super().__init__(identifier, **kwargs)
55+
super().__init__(
56+
identifier, server_url=server_url, server_token=server_token, **kwargs
57+
)
4858

59+
@override
4960
@classmethod
5061
@pydantic.validate_call
5162
def new(
@@ -57,6 +68,8 @@ def new(
5768
max_runs: int = 0,
5869
max_data_volume: int = 0,
5970
offline: bool = False,
71+
server_url: str | None = None,
72+
server_token: pydantic.SecretStr | None = None,
6073
**_,
6174
) -> Self:
6275
"""Create a new tenant on the Simvue server.
@@ -77,23 +90,69 @@ def new(
7790
the maximum volume of data allowed within this tenant, default is no limit.
7891
offline: bool, optional
7992
create in offline mode, default is False.
93+
server_url: str | None, optional
94+
alternative server URL, default None
95+
server_token : str | None, optional
96+
token for alternative server, default None
8097
8198
Returns
8299
-------
83100
Tenant
84101
a tenant instance with staged changes
85102
86103
"""
87-
return Tenant(
104+
return cls(
88105
name=name,
89106
is_enabled=is_enabled,
90107
max_request_rate=max_request_rate,
91108
max_runs=max_runs,
92109
max_data_volume=max_data_volume,
110+
server_url=server_url,
111+
server_token=server_token,
93112
_read_only=False,
94113
_offline=offline,
95114
)
96115

116+
@override
117+
@classmethod
118+
@pydantic.validate_call
119+
def get(
120+
cls,
121+
*,
122+
count: pydantic.PositiveInt | None = None,
123+
offset: pydantic.NonNegativeInt | None = None,
124+
server_url: str | None = None,
125+
server_token: pydantic.SecretStr | None = None,
126+
**kwargs,
127+
) -> Generator[tuple[str, Self | None]]:
128+
"""Retrieve tenants from the server.
129+
130+
Parameters
131+
----------
132+
count: int | None, optional
133+
limit number of objects
134+
offset : int | None, optional
135+
set start index for objects list
136+
server_url: str | None, optional
137+
alternative server URL, default None
138+
server_token : str | None, optional
139+
token for alternative server, default None
140+
141+
Yields
142+
------
143+
tuple[str, Tenant | None]
144+
object corresponding to an entry on the server.
145+
146+
Returns
147+
-------
148+
Generator[tuple[str, Tenant | None]]
149+
"""
150+
# Currently no tenant filters
151+
_ = kwargs.pop("filters", None)
152+
return super().get(
153+
count=count, offset=offset, server_url=server_url, server_token=server_token
154+
)
155+
97156
@property
98157
def name(self) -> str:
99158
"""Retrieve the name of the tenant"""

simvue/api/objects/administrator/user.py

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
"""
2-
Simvue Users
3-
============
1+
"""Simvue Users.
42
53
Contains a class for remotely connecting to Simvue users, or defining
64
a new user given relevant arguments.
@@ -13,23 +11,29 @@
1311
from simvue.models import DATETIME_FORMAT
1412

1513
try:
16-
from typing import Self
14+
from typing import Self, override
1715
except ImportError:
18-
from typing_extensions import Self
16+
from typing_extensions import Self, override
1917
from simvue.api.objects.base import SimvueObject, staging_check, write_only
2018

2119

2220
class User(SimvueObject):
23-
"""
24-
Simvue User
25-
===========
21+
"""Simvue User.
2622
2723
This class is used to connect to/create user objects on the Simvue server,
2824
any modification of instance attributes is mirrored on the remote object.
2925
3026
"""
3127

32-
def __init__(self, identifier: str | None = None, **kwargs) -> None:
28+
@override
29+
def __init__(
30+
self,
31+
identifier: str | None = None,
32+
*,
33+
server_url: str | None = None,
34+
server_token: pydantic.SecretStr | None = None,
35+
**kwargs,
36+
) -> None:
3337
"""Initialise a User
3438
3539
If an identifier is provided a connection will be made to the
@@ -42,11 +46,18 @@ def __init__(self, identifier: str | None = None, **kwargs) -> None:
4246
----------
4347
identifier : str, optional
4448
the remote server unique id for the target folder
49+
server_url: str | None, optional
50+
alternative server URL, default None
51+
server_token : str | None, optional
52+
token for alternative server, default None
4553
**kwargs : dict
4654
any additional arguments to be passed to the object initialiser
4755
"""
48-
super().__init__(identifier, **kwargs)
56+
super().__init__(
57+
identifier, server_url=server_url, server_token=server_token, **kwargs
58+
)
4959

60+
@override
5061
@classmethod
5162
@pydantic.validate_call
5263
def new(
@@ -62,6 +73,8 @@ def new(
6273
tenant: str,
6374
enabled: bool = True,
6475
offline: bool = False,
76+
server_url: str | None = None,
77+
server_token: pydantic.SecretStr | None = None,
6578
**_,
6679
) -> Self:
6780
"""Create a new user on the Simvue server.
@@ -90,6 +103,10 @@ def new(
90103
whether to enable the user on creation, default is True
91104
offline: bool, optional
92105
create in offline mode, default is False.
106+
server_url: str | None, optional
107+
alternative server URL, default None
108+
server_token : str | None, optional
109+
token for alternative server, default None
93110
94111
Returns
95112
-------
@@ -107,19 +124,28 @@ def new(
107124
"is_admin": is_admin,
108125
"is_enabled": enabled,
109126
}
110-
_user = User(
127+
_user = cls(
111128
user=_user_info,
112129
tenant=tenant,
113130
offline=offline,
114131
_read_only=False,
115132
_offline=offline,
133+
server_url=server_url,
134+
server_token=server_token,
116135
)
117136
_user._staging |= _user_info
118137
return _user
119138

139+
@override
120140
@classmethod
121141
def get(
122-
cls, *, count: int | None = None, offset: int | None = None, **kwargs
142+
cls,
143+
*,
144+
count: int | None = None,
145+
offset: int | None = None,
146+
server_url: str | None = None,
147+
server_token: pydantic.SecretStr | None = None,
148+
**kwargs,
123149
) -> dict[str, "User"]:
124150
"""Retrieve users from the Simvue server.
125151
@@ -129,15 +155,25 @@ def get(
129155
limit the number of results, default is no limit.
130156
offset : int, optional
131157
start index for results, default is 0.
158+
server_url: str | None, optional
159+
alternative server URL, default None
160+
server_token : str | None, optional
161+
token for alternative server, default None
132162
133163
Yields
134164
------
135165
User
136166
user instance representing user on server
137167
"""
138168
# Currently no user filters
139-
kwargs.pop("filters", None)
140-
return super().get(count=count, offset=offset, **kwargs)
169+
_ = kwargs.pop("filters", None)
170+
return super().get(
171+
count=count,
172+
offset=offset,
173+
server_url=server_url,
174+
server_token=server_token,
175+
**kwargs,
176+
)
141177

142178
@property
143179
@staging_check

simvue/api/objects/alert/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
"""
2-
Simvue Alerts
3-
=============
1+
"""Simvue Alert Retrieval.
42
53
Creation and management of Alerts on the Simvue server, the
64
alerts are split into sub-categories to ensure correct arguments

simvue/api/objects/alert/base.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
"""
2-
Alert Object Base
3-
=================
1+
"""Alert Object Base.
42
53
Contains general definitions for Simvue Alert objects.
64
@@ -16,9 +14,9 @@
1614
from simvue.models import NAME_REGEX, DATETIME_FORMAT
1715

1816
try:
19-
from typing import override
17+
from typing import Self, override
2018
except ImportError:
21-
from typing_extensions import override # noqa: UP035
19+
from typing_extensions import Self, override # noqa: UP035
2220

2321

2422
class AlertBase(SimvueObject):
@@ -27,15 +25,29 @@ class AlertBase(SimvueObject):
2725
Contains properties common to all alert types.
2826
"""
2927

28+
_label: str = "alert"
29+
30+
@override
3031
@classmethod
31-
def new(cls, read_only: bool = False, **kwargs):
32-
"""Create a new alert"""
33-
pass
32+
def new(cls, *_, **__) -> Self:
33+
raise NotImplementedError
3434

35-
def __init__(self, identifier: str | None = None, **kwargs) -> None:
35+
@override
36+
def __init__(
37+
self,
38+
identifier: str | None = None,
39+
*,
40+
server_url: str | None = None,
41+
server_token: pydantic.SecretStr | None = None,
42+
**kwargs,
43+
) -> None:
3644
"""Retrieve an alert from the Simvue server by identifier"""
37-
self._label = "alert"
38-
super().__init__(identifier=identifier, **kwargs)
45+
super().__init__(
46+
identifier=identifier,
47+
server_url=server_url,
48+
server_token=server_token,
49+
**kwargs,
50+
)
3951
self._local_only_args += [
4052
"frequency",
4153
"pattern",

0 commit comments

Comments
 (0)