Skip to content

Commit 960f923

Browse files
committed
Fixup exceptions and add test framework
1 parent 1b0b1e8 commit 960f923

19 files changed

+275
-156
lines changed

.env

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
PYTHONPATH=src

.gitignore

+7-9
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,23 @@
22
*.code-workspace
33
.vscode/
44
*.egg-info/
5+
.pytest_cache/
56
build/
6-
77
htmlcov/
88
.coverage
99
.pylintrc
10-
11-
objdictgen.new
12-
objdictgen.mod
13-
objdictgen.orig
10+
tmp/
1411

1512
*.pyc
1613
*.bak
1714
*.whl
1815
__*
1916
!__*__.py
20-
tmp/
21-
objdictgen2/
22-
mirror-canfestival-3-asc/
23-
od-*
2417

18+
objdictgen.new
19+
objdictgen.mod
20+
objdictgen.orig
21+
mirror-canfestival-3-asc/
22+
od-*/
2523
runall*.sh
2624
results-*.diff

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@
155155
# projects.
156156
extras_require={ # Optional
157157
'dev': ['pylint', 'flake8', 'mypy', 'black'],
158-
'test': ['pytest', 'coverage', 'pytest-cov'],
158+
'test': ['pytest', 'coverage', 'pytest-cov', 'pytest-mock'],
159159
},
160160

161161
# If there are data files included in your packages that need to be

src/objdictgen/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
def dbg(msg): # pylint: disable=unused-argument
3+
print(">> %s" % (msg,))

src/objdictgen/commondialogs.py

+12-11
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import wx.grid
3232

3333
from . import node as nod
34+
from . import dbg
3435

3536
ScriptDirectory = os.path.split(__file__)[0]
3637

@@ -356,12 +357,12 @@ def OnOK(self, event): # pylint: disable=unused-argument
356357
error = []
357358
try:
358359
int(self.Index.GetValue(), 16)
359-
except Exception:
360+
except ValueError:
360361
error.append("Index")
361362
if self.radioButton2.GetValue() or self.radioButton3.GetValue():
362363
try:
363364
int(self.Number.GetValue())
364-
except Exception:
365+
except ValueError:
365366
error.append("Number")
366367
if len(error) > 0:
367368
text = ""
@@ -545,16 +546,16 @@ def OnOK(self, event): # pylint: disable=unused-argument
545546
if valuetype == 0:
546547
try:
547548
int(self.Min.GetValue(), 16)
548-
except Exception:
549+
except ValueError:
549550
error.append("Minimum")
550551
try:
551552
int(self.Max.GetValue(), 16)
552-
except Exception:
553+
except ValueError:
553554
error.append("Maximum")
554555
elif valuetype == 1:
555556
try:
556557
int(self.Length.GetValue(), 16)
557-
except Exception:
558+
except ValueError:
558559
error.append("Length")
559560
if len(error) > 0:
560561
message = ""
@@ -764,7 +765,7 @@ def OnOK(self, event): # pylint: disable=unused-argument
764765
if message != "":
765766
try:
766767
_ = int(self.NodeID.GetValue(), 16)
767-
except Exception:
768+
except ValueError:
768769
message = "Node ID must be integer!"
769770
if message != "":
770771
message = wx.MessageDialog(self, message, "ERROR", wx.OK | wx.ICON_ERROR)
@@ -1040,7 +1041,7 @@ def OnOK(self, event): # pylint: disable=unused-argument
10401041
if message != "":
10411042
try:
10421043
_ = int(self.NodeID.GetValue(), 16)
1043-
except Exception:
1044+
except ValueError:
10441045
message = "Node ID must be integer!"
10451046
if message != "":
10461047
message = wx.MessageDialog(self, message, "ERROR", wx.OK | wx.ICON_ERROR)
@@ -1229,7 +1230,7 @@ def OnOK(self, event): # pylint: disable=unused-argument
12291230
nodeid = int(nodeid, 16)
12301231
else:
12311232
nodeid = int(nodeid)
1232-
except Exception:
1233+
except ValueError:
12331234
message = wx.MessageDialog(self, "Slave Node ID must be a value in decimal or hexadecimal!", "Error", wx.OK | wx.ICON_ERROR)
12341235
message.ShowModal()
12351236
message.Destroy()
@@ -1314,7 +1315,7 @@ def __init__(self, parent, data, colnames):
13141315
self.data = data
13151316
self.colnames = colnames
13161317
self.Parent = parent
1317-
# XXX
1318+
# NOTE
13181319
# we need to store the row length and col length to
13191320
# see if the table has changed size
13201321
self._rows = self.GetNumberRows()
@@ -1525,8 +1526,8 @@ def OnValuesGridCellChange(self, event):
15251526
value = self.Table.GetValue(row, col)
15261527
try:
15271528
self.Values[row][colname] = int(value, 16)
1528-
except Exception:
1529-
message = wx.MessageDialog(self, "\"%s\" is not a valid value!" % value, "Error", wx.OK | wx.ICON_ERROR)
1529+
except ValueError:
1530+
message = wx.MessageDialog(self, "'%s' is not a valid value!" % value, "Error", wx.OK | wx.ICON_ERROR)
15301531
message.ShowModal()
15311532
message.Destroy()
15321533
wx.CallAfter(self.RefreshValues)

src/objdictgen/eds_utils.py

+44-42
Large diffs are not rendered by default.

src/objdictgen/gen_cfile.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,19 @@ def GetValidTypeInfos(typename, items=None):
8989
elif values[0] == "BOOLEAN":
9090
typeinfos = ("UNS8", None, "boolean", False)
9191
else:
92-
raise ValueError("""!!! %s isn't a valid type for CanFestival.""" % typename)
92+
raise ValueError("""!!! '%s' isn't a valid type for CanFestival.""" % typename)
9393
if typeinfos[2] not in ["visible_string", "domain"]:
9494
internal_types[typename] = typeinfos
9595
else:
96-
raise ValueError("""!!! %s isn't a valid type for CanFestival.""" % typename)
96+
raise ValueError("""!!! '%s' isn't a valid type for CanFestival.""" % typename)
9797
return typeinfos
9898

9999

100100
def ComputeValue(type_, value):
101101
if type_ == "visible_string":
102-
return "\"%s\"" % value, ""
102+
return '"%s"' % value, ""
103103
elif type_ == "domain":
104-
return "\"%s\"" % ''.join(["\\x%2.2x" % ord(char) for char in value]), ""
104+
return '"%s"' % ''.join(["\\x%2.2x" % ord(char) for char in value]), ""
105105
elif type_.startswith("real"):
106106
return "%f" % value, ""
107107
else: # value is integer; make sure to handle negative numbers correctly
@@ -119,7 +119,7 @@ def WriteFile(filepath, content):
119119
def GetTypeName(node, typenumber):
120120
typename = node.GetTypeName(typenumber)
121121
if typename is None:
122-
raise ValueError("""!!! Datatype with value "0x%4.4X" isn't defined in CanFestival.""" % typenumber)
122+
raise ValueError("""!!! Datatype with value '0x%4.4X' isn't defined in CanFestival.""" % typenumber)
123123
return typename
124124

125125

@@ -220,7 +220,7 @@ def GenerateFileContent(node, headerfilepath, pointers_dict=None):
220220
typeinfos = GetValidTypeInfos(typename, [values])
221221
if typename == "DOMAIN" and index in variablelist:
222222
if not typeinfos[1]:
223-
raise ValueError("\nDomain variable not initialized\nindex : 0x%04X\nsubindex : 0x00" % index)
223+
raise ValueError("Domain variable not initialized, index: 0x%04X, subindex: 0x00" % index)
224224
texts["subIndexType"] = typeinfos[0]
225225
if typeinfos[1] is not None:
226226
if params_infos["buffer_size"] != "":
@@ -273,7 +273,7 @@ def GenerateFileContent(node, headerfilepath, pointers_dict=None):
273273
sep = ""
274274
value, comment = ComputeValue(typeinfos[2], value)
275275
if len(value) == 2 and typename == "DOMAIN":
276-
raise ValueError("\nDomain variable not initialized\nindex : 0x%04X\nsubindex : 0x%02X" % (index, subindex))
276+
raise ValueError("Domain variable not initialized, index : 0x%04X, subindex : 0x%02X" % (index, subindex))
277277
mappedVariableContent += " %s%s%s\n" % (value, sep, comment)
278278
mappedVariableContent += " };\n"
279279
else:
@@ -671,4 +671,4 @@ def GenerateFile(filepath, node, pointers_dict=None):
671671
WriteFile(objectdefinitionheaderpath, header_defs)
672672
return None
673673
except ValueError as message:
674-
return "Unable to Generate C File\n%s" % message
674+
return "Unable to Generate C File: %s" % message

src/objdictgen/networkedit.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@
3838
from .nodelist import NodeList
3939
from .nodemanager import NodeManager
4040
from .networkeditortemplate import NetworkEditorTemplate
41+
from . import dbg
4142

42-
if sys.version_info[0] >= 3:
43-
unicode = str # pylint: disable=invalid-name
4443

4544
__version__ = "$Revision: 1.27 $"
4645

src/objdictgen/networkeditortemplate.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ def RefreshCurrentIndexList(self):
3939
if selected == 0:
4040
window = self.NetworkNodes.GetPage(selected)
4141
window.RefreshIndexList()
42-
else:
43-
pass
4442

4543
def RefreshNetworkNodes(self):
4644
if self.NetworkNodes.GetPageCount() > 0:
@@ -61,7 +59,7 @@ def OnNodeSelectedChanged(self, event):
6159
if selected >= 0:
6260
window = self.NetworkNodes.GetPage(selected)
6361
self.NodeList.SetCurrentSelected(window.GetIndex())
64-
wx.CallAfter(self.RefreshMainMenu) # FIXME: Missing. Should be from where?
62+
wx.CallAfter(self.RefreshMainMenu) # FIXME: Missing symbol. From where?
6563
wx.CallAfter(self.RefreshStatusBar)
6664
event.Skip()
6765

src/objdictgen/node.py

+6-10
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,16 @@
3232
import sys
3333
import re
3434
import pickle
35+
from collections import OrderedDict
36+
from future.utils import raise_from
3537

3638
from .nosis import pickle as nosis
39+
from . import dbg
3740

3841
if sys.version_info[0] >= 3:
3942
unicode = str # pylint: disable=invalid-name
4043

4144

42-
def dbg(s): # pylint: disable=unused-argument
43-
pass
44-
# print(">> %s"% (s,))
45-
46-
4745
#
4846
# Dictionary of translation between access symbol and their signification
4947
#
@@ -431,7 +429,7 @@ def StringFormat(text, idx, sub): # pylint: disable=unused-argument
431429
result = name_model.match(text)
432430
if result:
433431
fmt = result.groups()
434-
# FIXME: Using eval is not good
432+
# FIXME: Using eval is not safe
435433
dbg("EVAL in StringFormat(): '%s'" % (fmt[1],))
436434
return fmt[0] % eval(fmt[1])
437435
else:
@@ -761,9 +759,7 @@ def IsMappingEntry(self, index):
761759
"""
762760
Check if an entry exists in the User Mapping Dictionary and returns the answer.
763761
"""
764-
if index in self.UserMapping:
765-
return True
766-
return False
762+
return index in self.UserMapping
767763

768764
def AddMappingEntry(self, index, subindex=None, name="Undefined", struct=0, size=None, nbmax=None, default=None, values=None):
769765
"""
@@ -967,7 +963,7 @@ def CompileValue(self, value, index, compute=True):
967963
if isinstance(value, (str, unicode)) and value.upper().find("$NODEID") != -1:
968964
base = self.GetBaseIndex(index) # NOTE: Don't change this, as the eval() below depend on it
969965
try:
970-
# FIXME: Using eval is not good
966+
# FIXME: Using eval is not safe
971967
dbg("EVAL in CompileValue(): '%s'" % (value,))
972968
raw = eval(value)
973969
if compute:

src/objdictgen/nodelist.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@
2727

2828
import os
2929
import shutil
30+
import errno
31+
from future.utils import raise_from
3032

31-
from .node import Node
3233
from . import eds_utils
3334

3435

@@ -112,12 +113,12 @@ def LoadProject(self, root, netname=None):
112113

113114
self.Root = root
114115
if not os.path.exists(self.Root):
115-
return "\"%s\" folder doesn't exist" % self.Root
116+
return "'%s' folder doesn't exist" % self.Root
116117

117118
eds_folder = self.GetEDSFolder()
118119
if not os.path.exists(eds_folder):
119120
os.mkdir(eds_folder)
120-
# return "\"%s\" folder doesn't contain a \"eds\" folder"%self.Root
121+
# return "'%s' folder doesn't contain a 'eds' folder"%self.Root
121122

122123
files = os.listdir(eds_folder)
123124
for file in files:
@@ -172,15 +173,15 @@ def AddSlaveNode(self, nodename, nodeid, eds):
172173
self.Changed = True
173174
return None
174175
else:
175-
return "\"%s\" EDS file is not available" % eds
176+
return "'%s' EDS file is not available" % eds
176177

177178
def RemoveSlaveNode(self, index):
178179
if index in self.SlaveNodes:
179180
self.SlaveNodes.pop(index)
180181
self.Changed = True
181182
return None
182183
else:
183-
return "Node with \"0x%2.2X\" ID doesn't exist"
184+
return "Node with '0x%2.2X' ID doesn't exist"
184185

185186
def LoadMasterNode(self, netname=None):
186187
if netname:
@@ -227,7 +228,7 @@ def LoadSlaveNodes(self, netname=None):
227228
return result
228229
self.Changed = False
229230
except SyntaxError as message:
230-
return "Unable to load CPJ file\n%s" % message
231+
return "Unable to load CPJ file: %s" % message
231232
return None
232233

233234
def SaveNodeList(self, netname=None):

0 commit comments

Comments
 (0)