Skip to content

Commit 1585c6e

Browse files
authored
Merge pull request #393 from capocchi/version-5.1
Version 5.1
2 parents feb86da + b54d882 commit 1585c6e

File tree

6 files changed

+53
-26
lines changed

6 files changed

+53
-26
lines changed

devsimpy/DEVSKernel/PyDEVS/SimStrategies.py

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,28 +29,20 @@
2929
from DEVSKernel.PyDEVS.DEVS import AtomicDEVS, CoupledDEVS, IPort, OPort
3030

3131
def getFlatImmChildrenList(model, flat_imm_list: list = None) -> list:
32-
"""Set priority flat list compatible avec DEFAULT_DEVS_DIRNAME."""
33-
if flat_imm_list is None:
34-
flat_imm_list = []
35-
36-
devs_backend_name = getattr(builtins, 'DEFAULT_DEVS_DIRNAME', 'PyDEVS')
37-
devs_mod = globals().get(devs_backend_name, None)
38-
if devs_mod is None:
39-
raise RuntimeError(f"Backend DEVS '{devs_backend_name}' non importé")
40-
41-
AtomicDEVS = getattr(devs_mod, 'AtomicDEVS', None)
42-
CoupledDEVS = getattr(devs_mod, 'CoupledDEVS', None)
43-
if AtomicDEVS is None or CoupledDEVS is None:
44-
raise RuntimeError(f"Classes AtomicDEVS/CoupledDEVS introuvables dans backend '{devs_backend_name}'")
45-
46-
for m in model.immChildren:
47-
if isinstance(m, AtomicDEVS):
48-
flat_imm_list.append(m)
49-
elif isinstance(m, CoupledDEVS):
50-
getFlatImmChildrenList(m, flat_imm_list)
51-
52-
return flat_imm_list
53-
32+
"""Set priority flat list compatible avec DEFAULT_DEVS_DIRNAME."""
33+
if flat_imm_list is None:
34+
flat_imm_list = []
35+
36+
# Use the imported classes directly instead of trying to get them from globals()
37+
for m in model.immChildren:
38+
if isinstance(m, AtomicDEVS):
39+
flat_imm_list.append(m)
40+
elif isinstance(m, CoupledDEVS):
41+
getFlatImmChildrenList(m, flat_imm_list)
42+
else:
43+
sys.stdout.write(_(f'Unknown model {m}'))
44+
45+
return flat_imm_list
5446

5547
def getFlatPriorityList(model, flat_priority_list: list = None) -> list:
5648
"""Set priority flat list."""

devsimpy/DomainInterface/DomainBehavior.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ def getSigma(self)->float:
131131
def getStatus(self)->str:
132132
return self.state['status']
133133

134+
def getPhase(self)->str:
135+
return self.getStatus()
136+
134137
def getState(self)->dict:
135138
return self.state
136139

devsimpy/Editor.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,7 +2215,7 @@ def setChoices(self,block):
22152215
self._choices = collections.OrderedDict([(_('New init phase'),self.OnInitPhase), (_('New peek'),self.OnPeek), (_('New all peek'),self.OnAllPeek),
22162216
(_('New poke'),self.OnPoke), (_('New hold in state'),self.OnInsertHoldInState), (_('New passivate in state'),self.OnInsertPassivateInState),
22172217
(_('New passivate state'),self.OnInsertPassivateState), (_('New Phase test'),self.OnInsertPhaseIs), (_('New debugger stdout'),self.OnInsertDebug),
2218-
(_('Get state'),self.OnInsertGetState), (_('Get sigma'),self.OnInsertGetSigma), (_('Get elapsed'),self.OnInsertGetElapsed), (_('Get message value'),self.OnInsertGetMsgValue), (_('Get message time'),self.OnInsertGetMsgTime)])
2218+
(_('Get state'),self.OnInsertGetState), (_('Get phase'),self.OnInsertGetPhase), (_('Get sigma'),self.OnInsertGetSigma), (_('Get elapsed'),self.OnInsertGetElapsed), (_('Get message value'),self.OnInsertGetMsgValue), (_('Get message time'),self.OnInsertGetMsgTime)])
22192219
else:
22202220
if 'PyPDEVS' in getattr(builtins, 'DEFAULT_DEVS_DIRNAME'):
22212221
self._choices = collections.OrderedDict([(_("New add sub model"),self.OnAddModel),(_("New remove sub model"),self.OnRemoveModel),(_("New port connection"),self.OnDisConnectPorts),(_("New port connection"),self.OnConnectPorts),(_('New debugger stdout'),self.OnInsertDebug)])
@@ -2349,13 +2349,20 @@ def OnInsertGetState(self, event):
23492349
cp.AddText("self.getState()")
23502350
self.Notification(True, _('%s modified' % (os.path.basename(cp.GetFilename()))), '', '')
23512351

2352+
def OnInsertGetPhase(self, event):
2353+
""" Insert a sentence to get the status.
2354+
"""
2355+
cp = self.nb.GetCurrentPage()
2356+
cp.AddText("self.getPhase()")
2357+
self.Notification(True, _('%s modified' % (os.path.basename(cp.GetFilename()))), '', '')
2358+
23522359
def OnInsertGetStatus(self, event):
23532360
""" Insert a sentence to get the status.
23542361
"""
23552362
cp = self.nb.GetCurrentPage()
23562363
cp.AddText("self.getStatus()")
23572364
self.Notification(True, _('%s modified' % (os.path.basename(cp.GetFilename()))), '', '')
2358-
2365+
23592366
def OnInsertGetSigma(self, event):
23602367
""" Insert a sentence to get the sigma value.
23612368
"""

devsimpy/Mixins/Savable.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ def Save(self, obj_dumped, fileName=None) -> bool:
194194

195195
with open(dump_filename, 'wb') as file:
196196
pickle.dump(obj=PickledCollection(obj_dumped), file=file, protocol=pickle.HIGHEST_PROTOCOL)
197+
file.flush() # Ensure data is written to disk
198+
os.fsync(file.fileno()) # Force OS to write to disk
197199

198200
except (OSError, pickle.PickleError) as error:
199201
tb = traceback.format_exc()
@@ -301,6 +303,16 @@ def Load(self, obj_loaded, fileName = None):
301303
try:
302304
with open(path,'rb') as f:
303305
L = pickle.load(f)
306+
except (pickle.UnpicklingError, EOFError) as info:
307+
tb = traceback.format_exc()
308+
file_size = os.path.getsize(path)
309+
sys.stderr.write(_("Problem loading: %s -- %s \n")%(str(fileName), str(tb)))
310+
sys.stderr.write(_("The pickle file appears to be corrupted or truncated (size: %d bytes).\n") % file_size)
311+
sys.stderr.write(_("This file cannot be loaded. Possible solutions:\n"))
312+
sys.stderr.write(_("1. Restore from a backup if available\n"))
313+
sys.stderr.write(_("2. Delete the corrupted file and recreate the model\n"))
314+
sys.stderr.write(_("File location: %s\n") % path)
315+
return info
304316
except Exception as info:
305317
tb = traceback.format_exc()
306318
sys.stderr.write(_("Problem loading: %s -- %s \n")%(str(fileName), str(tb)))
@@ -471,6 +483,15 @@ def Load(self, obj_loaded, fileName=None) -> bool:
471483
f.read(1) # Teste si le fichier est compressé
472484
f.seek(0) # Remet le curseur au début
473485
dsp = pickle.load(f) # Charge l'objet sérialisé
486+
except (pickle.UnpicklingError, EOFError) as error:
487+
tb = traceback.format_exc()
488+
file_size = os.path.getsize(fileName)
489+
sys.stderr.write(f"Problem loading: {fileName} -- The pickle file appears to be corrupted or truncated (size: {file_size} bytes).\n")
490+
sys.stderr.write(f"This file cannot be loaded. Possible solutions:\n")
491+
sys.stderr.write(f"1. Restore from a backup if available\n")
492+
sys.stderr.write(f"2. Delete the corrupted file and recreate the diagram\n")
493+
sys.stderr.write(f"Full traceback: {tb}\n")
494+
return error
474495
except Exception as error:
475496
tb = traceback.format_exc()
476497
sys.stderr.write(f"Problem loading: {fileName} -- {tb}\n")

devsimpy/WizardGUI.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ def Validate(self, win):
216216
textCtrl.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
217217
finally:
218218
textCtrl.Refresh()
219-
return True
219+
return True
220220

221221
def TransferToWindow(self):
222222
""" Prevent wxDialog from complaining.

requirements.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
wxPython <= 4.2.3 ; python_version >= '3.10'
55
wxPython <= 4.1.1 ; python_version >= '3.8' and python_version < '3.10'
66

7+
wxPython > 4.2 ; python_version >= '3.14'
8+
79
PyPubSub #<= 3.3.0
810

911
PyYAML #>= 5.1.2
@@ -47,4 +49,6 @@ pydantic
4749
msgpack
4850

4951
paho-mqtt
50-
kafka-python
52+
kafka-python
53+
54+
confluent_kafka

0 commit comments

Comments
 (0)