60
60
logger = logging .getLogger (__name__ )
61
61
62
62
63
+ def check_run_initialised (
64
+ function : typing .Callable [..., typing .Any ],
65
+ ) -> typing .Callable [..., typing .Any ]:
66
+ def _wrapper (self : "Run" , * args : typing .Any , ** kwargs : typing .Any ) -> typing .Any :
67
+ if not self ._simvue :
68
+ raise RuntimeError (
69
+ "Simvue Run must be initialised before calling "
70
+ f"'{ function .__name__ } '"
71
+ )
72
+ return function (self , * args , ** kwargs )
73
+
74
+ _wrapper .__name__ = f"{ function .__name__ } __init_locked"
75
+
76
+ return _wrapper
77
+
78
+
63
79
class Run :
64
80
"""Track simulation details based on token and URL
65
81
@@ -822,6 +838,7 @@ def config(
822
838
823
839
return True
824
840
841
+ @check_run_initialised
825
842
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
826
843
@pydantic .validate_call
827
844
def update_metadata (self , metadata : dict [str , typing .Any ]) -> bool :
@@ -847,6 +864,7 @@ def update_metadata(self, metadata: dict[str, typing.Any]) -> bool:
847
864
848
865
return False
849
866
867
+ @check_run_initialised
850
868
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
851
869
@pydantic .validate_call
852
870
def update_tags (self , tags : list [str ]) -> bool :
@@ -867,6 +885,7 @@ def update_tags(self, tags: list[str]) -> bool:
867
885
868
886
return False
869
887
888
+ @check_run_initialised
870
889
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
871
890
@pydantic .validate_call
872
891
def log_event (self , message , timestamp : typing .Optional [str ] = None ) -> bool :
@@ -941,6 +960,7 @@ def _add_metrics_to_dispatch(
941
960
942
961
return True
943
962
963
+ @check_run_initialised
944
964
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
945
965
@pydantic .validate_call
946
966
def log_metrics (
@@ -959,6 +979,7 @@ def log_metrics(
959
979
self ._step += 1
960
980
return add_dispatch
961
981
982
+ @check_run_initialised
962
983
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
963
984
@pydantic .validate_call
964
985
def save (
@@ -1075,6 +1096,7 @@ def save(
1075
1096
1076
1097
return True
1077
1098
1099
+ @check_run_initialised
1078
1100
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
1079
1101
@pydantic .validate_call
1080
1102
def save_directory (
@@ -1111,6 +1133,7 @@ def save_directory(
1111
1133
1112
1134
return True
1113
1135
1136
+ @check_run_initialised
1114
1137
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
1115
1138
@pydantic .validate_call
1116
1139
def save_all (
@@ -1141,6 +1164,7 @@ def save_all(
1141
1164
1142
1165
return True
1143
1166
1167
+ @check_run_initialised
1144
1168
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
1145
1169
@pydantic .validate_call
1146
1170
def set_status (
@@ -1210,6 +1234,7 @@ def close(self) -> bool:
1210
1234
1211
1235
return True
1212
1236
1237
+ @check_run_initialised
1213
1238
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
1214
1239
@pydantic .validate_call
1215
1240
def set_folder_details (
@@ -1264,6 +1289,7 @@ def set_folder_details(
1264
1289
1265
1290
return False
1266
1291
1292
+ @check_run_initialised
1267
1293
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
1268
1294
@pydantic .validate_call
1269
1295
def add_alerts (
@@ -1311,6 +1337,7 @@ def add_alerts(
1311
1337
1312
1338
return False
1313
1339
1340
+ @check_run_initialised
1314
1341
@skip_if_failed ("_aborted" , "_suppress_errors" , None )
1315
1342
@pydantic .validate_call
1316
1343
def create_alert (
@@ -1472,6 +1499,7 @@ def create_alert(
1472
1499
1473
1500
return alert_id
1474
1501
1502
+ @check_run_initialised
1475
1503
@skip_if_failed ("_aborted" , "_suppress_errors" , False )
1476
1504
@pydantic .validate_call
1477
1505
def log_alert (
0 commit comments