diff --git a/pyproject.toml b/pyproject.toml index 4131ed9..ad3f83c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,3 +71,14 @@ filterwarnings = "ignore::DeprecationWarning" [tool.ruff] line-length = 120 +exclude = [ + "tests/od/**", +] + +[tool.ruff.lint.per-file-ignores] +"tests/*" = [ + "S101", # Allow use of assert statements in tests +] +"tests/test_imports.py" = [ + "F401", # Allow unused imports in this file +] diff --git a/src/objdictgen/__main__.py b/src/objdictgen/__main__.py index 190b86b..c6557d5 100644 --- a/src/objdictgen/__main__.py +++ b/src/objdictgen/__main__.py @@ -63,7 +63,7 @@ def inner(*args, **kw): opts = DebugOpts() try: return fn(opts, *args, **kw) - except Exception as exc: # pylint: disable=broad-except + except Exception as exc: if opts.show_debug: raise print(f"{ODG_PROGRAM}: {exc.__class__.__name__}: {exc}") @@ -212,8 +212,8 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None): if opts.command == "help": if opts.subcommand: for subparsers_action in ( - a for a in parser._actions # pylint: disable=protected-access - if isinstance(a, argparse._SubParsersAction) # pylint: disable=protected-access + a for a in parser._actions + if isinstance(a, argparse._SubParsersAction) ): for choice, subparser in subparsers_action.choices.items(): if choice != opts.subcommand: @@ -294,8 +294,7 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None): elif opts.command == "edit": # Import here to prevent including optional UI components for cmd-line use - from .ui.objdictedit import \ - uimain # pylint: disable=import-outside-toplevel + from .ui.objdictedit import uimain uimain(opts.od) @@ -322,8 +321,7 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None): elif opts.command == "network": # Import here to prevent including optional UI components for cmd-line use - from .ui.networkedit import \ - uimain # pylint: disable=import-outside-toplevel + from .ui.networkedit import uimain uimain(opts.dir) @@ -331,8 +329,7 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None): elif opts.command == "nodelist": # Import here to prevent including optional UI components for cmd-line use - from .nodelist import \ - main as _main # pylint: disable=import-outside-toplevel + from .nodelist import main as _main _main(opts.dir) @@ -342,5 +339,4 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None): # To support -m objdictgen if __name__ == '__main__': - # pylint: disable=no-value-for-parameter main() diff --git a/src/objdictgen/eds_utils.py b/src/objdictgen/eds_utils.py index b9e9fbe..865a0c8 100644 --- a/src/objdictgen/eds_utils.py +++ b/src/objdictgen/eds_utils.py @@ -60,9 +60,9 @@ } # Function for verifying data values -is_integer = lambda x: isinstance(x, int) # pylint: disable=unnecessary-lambda-assignment -is_string = lambda x: isinstance(x, str) # pylint: disable=unnecessary-lambda-assignment -is_boolean = lambda x: x in (0, 1) # pylint: disable=unnecessary-lambda-assignment +is_integer = lambda x: isinstance(x, int) # noqa: E731 +is_string = lambda x: isinstance(x, str) # noqa: E731 +is_boolean = lambda x: x in (0, 1) # noqa: E731 # Define checking of value for each attribute ENTRY_ATTRIBUTES: dict[str, Callable[[Any], bool]] = { @@ -505,7 +505,6 @@ def generate_eds_content(node: Node, filepath: TPath): entries = list(node) # FIXME: Too many camelCase vars in here - # pylint: disable=invalid-name try: value = node.GetEntry(0x1018) diff --git a/src/objdictgen/gen_cfile.py b/src/objdictgen/gen_cfile.py index 5dbb729..2a65349 100644 --- a/src/objdictgen/gen_cfile.py +++ b/src/objdictgen/gen_cfile.py @@ -114,7 +114,7 @@ def text(self, s: str = "") -> Text: # FIXME: Delete this method when everything is converted to f-strings def ftext(self, s: str) -> Text: """Format a text string.""" - return Text(self, "").__imod__(s) # pylint: disable=unnecessary-dunder-call + return Text(self, "").__imod__(s) def get_valid_type_infos(self, typename: str, items=None) -> TypeInfos: """Get valid type infos from a typename. @@ -191,7 +191,6 @@ def generate_file_content(node: NodeProtocol, headerfile: str, pointers_dict=Non """ # FIXME: Too many camelCase vars in here - # pylint: disable=invalid-name # Setup the main context to store the data ctx = CFileContext() diff --git a/src/objdictgen/jsonod.py b/src/objdictgen/jsonod.py index ea98798..07868cb 100644 --- a/src/objdictgen/jsonod.py +++ b/src/objdictgen/jsonod.py @@ -31,15 +31,25 @@ import jsonschema import objdictgen + # Accessed by node.py, so we need to import node as module to avoid circular references from objdictgen import maps from objdictgen import node as nodelib from objdictgen.maps import OD, ODMapping, ODMappingList -from objdictgen.typing import (TDiffNodes, TIndexEntry, TODJson, TODObj, - TODObjJson, TODSubObj, TODSubObjJson, TODValue, - TParamEntry, TPath, TProfileMenu) -from objdictgen.utils import (copy_in_order, exc_amend, maybe_number, - str_to_int, strip_brackets) +from objdictgen.typing import ( + TDiffNodes, + TIndexEntry, + TODJson, + TODObj, + TODObjJson, + TODSubObj, + TODSubObjJson, + TODValue, + TParamEntry, + TPath, + TProfileMenu, +) +from objdictgen.utils import copy_in_order, exc_amend, maybe_number, str_to_int, strip_brackets T = TypeVar('T') M = TypeVar('M', bound=Mapping) @@ -352,10 +362,10 @@ def generate_jsonc(node: Node, compact=False, sort=False, internal=False, if jsonc: # In jsonc the field is converted to ", // " - repl = lambda m: m[1].replace('\\"', '"') + m[3] + m[2] + repl = lambda m: m[1].replace('\\"', '"') + m[3] + m[2] # noqa: E731 else: # In json the field is converted to "," - repl = lambda m: m[1].replace('\\"', '"') + m[3] + repl = lambda m: m[1].replace('\\"', '"') + m[3] # noqa: E731 # Convert the special @@ fields to jsonc comments # Syntax: "@@, // @@" @@ -396,7 +406,7 @@ def generate_node(contents: str|TODJson, validate: bool = True) -> Node: # validate_fromdict() is better at giving useful errors # than the json validator. However the type checking of the json # validator is better. - global SCHEMA # pylint: disable=global-statement + global SCHEMA if not SCHEMA: with open(objdictgen.JSON_SCHEMA, 'r', encoding="utf-8") as f: SCHEMA = json.loads(remove_jsonc(f.read())) diff --git a/src/objdictgen/maps.py b/src/objdictgen/maps.py index 5d4a747..c14673b 100644 --- a/src/objdictgen/maps.py +++ b/src/objdictgen/maps.py @@ -30,8 +30,7 @@ from typing import TYPE_CHECKING, Any, Callable, Generator, TypeVar import objdictgen -from objdictgen.typing import (TODObj, TODSubObj, TODValue, TParamEntry, TPath, - TProfileMenu) +from objdictgen.typing import TODObj, TODSubObj, TODValue, TParamEntry, TPath, TProfileMenu T = TypeVar('T') @@ -327,15 +326,14 @@ def import_profile(profilename: TPath) -> tuple["ODMapping", TProfileMenu]: # Mapping and AddMenuEntries are expected to be defined by the execfile # The profiles requires some vars to be set - # pylint: disable=unused-variable try: with open(profilepath, "r", encoding="utf-8") as f: log.debug("EXECFILE %s", profilepath) code = compile(f.read(), profilepath, 'exec') exec(code, globals(), locals()) # FIXME: Using exec is unsafe - # pylint: disable=undefined-variable - return Mapping, AddMenuEntries # type: ignore[name-defined] # due to the exec() magic - except Exception as exc: # pylint: disable=broad-except + # NOTE: These seem missing due to the exec() magic + return Mapping, AddMenuEntries # type: ignore[name-defined] # noqa: F821 + except Exception as exc: log.debug("EXECFILE FAILED: %s", exc) log.debug(traceback.format_exc()) raise ValueError(f"Loading profile '{profilepath}' failed: {exc}") from exc diff --git a/src/objdictgen/nodelist.py b/src/objdictgen/nodelist.py index 7b207bb..1f4b056 100644 --- a/src/objdictgen/nodelist.py +++ b/src/objdictgen/nodelist.py @@ -151,7 +151,7 @@ def SaveMasterNode(self, netname: str = ""): masterpath = self.Root / "master.od" try: self.Manager.SaveCurrentInFile(masterpath) - except Exception as exc: # pylint: disable=broad-except + except Exception as exc: raise ValueError(f"Fail to save master node in '{masterpath}'") from exc def LoadSlaveNodes(self, netname: str = ""): @@ -174,7 +174,7 @@ def LoadSlaveNodes(self, netname: str = ""): self.LoadEDS(node["DCFName"]) self.AddSlaveNode(node["Name"], nodeid, node["DCFName"]) self.Changed = False - except Exception as exc: # pylint: disable=broad-except + except Exception as exc: raise ValueError(f"Unable to load CPJ file '{cpjpath}'") from exc def SaveNodeList(self, netname: str = ""): @@ -188,7 +188,7 @@ def SaveNodeList(self, netname: str = ""): with open(cpjpath, mode=mode, encoding="utf-8") as f: f.write(content) self.Changed = False - except Exception as exc: # pylint: disable=broad-except + except Exception as exc: raise ValueError(f"Fail to save node list in '{cpjpath}'") from exc def GetOrderNumber(self, nodeid: int) -> int: diff --git a/src/objdictgen/nodemanager.py b/src/objdictgen/nodemanager.py index 727c582..f2a807f 100644 --- a/src/objdictgen/nodemanager.py +++ b/src/objdictgen/nodemanager.py @@ -44,7 +44,7 @@ # Returns a new id def get_new_id(): - global CURRENTID # pylint: disable=global-statement + global CURRENTID CURRENTID += 1 return CURRENTID diff --git a/src/objdictgen/nosis.py b/src/objdictgen/nosis.py index 09ed207..29f78f3 100644 --- a/src/objdictgen/nosis.py +++ b/src/objdictgen/nosis.py @@ -255,7 +255,7 @@ def xmldump(filehandle: io.TextIOWrapper|None, py_obj: object, omit = omit or () # Store the ref id to the pickling object (if not deepcopying) - global VISITED # pylint: disable=global-statement + global VISITED objid = id(py_obj) VISITED = { objid: py_obj @@ -316,7 +316,7 @@ def xmlload(filehandle: SupportsRead[str|bytes]|bytes|str) -> Any: elif isinstance(filehandle, bytes): fh = io.BytesIO(filehandle) - global VISITED # pylint: disable=global-statement + global VISITED VISITED = {} # Reset the visited collection return _thing_from_dom(minidom.parse(fh), None) @@ -511,7 +511,7 @@ def _thing_from_dom(dom_node: minidom.Element|minidom.Document, container: Any = # a value= attribute. ie. pickler can place it in either # place (based on user preference) and unpickler doesn't care node_valuetext = "" - if 'value' in node._attrs: # type: ignore[attr-defined] # pylint: disable=protected-access + if 'value' in node._attrs: # text in tag ttext = node.getAttribute('value') node_valuetext = unsafe_string(ttext, isattr=True) @@ -557,7 +557,6 @@ def _thing_from_dom(dom_node: minidom.Element|minidom.Document, container: Any = # clearer to show all cases being handled (easier to see the pattern # when doing later maintenance). - # pylint: disable=self-assigning-variable if node_type == 'None': node_val = None elif node_type == 'numeric': diff --git a/src/objdictgen/typing.py b/src/objdictgen/typing.py index b75f08a..1a801f0 100644 --- a/src/objdictgen/typing.py +++ b/src/objdictgen/typing.py @@ -92,8 +92,6 @@ class NodeProtocol(Protocol): """Protocol for the Node class.""" - # pylint: disable=unnecessary-ellipsis - Name: str """Name of the node.""" diff --git a/src/objdictgen/ui/commondialogs.py b/src/objdictgen/ui/commondialogs.py index a38717a..bf9a80d 100644 --- a/src/objdictgen/ui/commondialogs.py +++ b/src/objdictgen/ui/commondialogs.py @@ -29,8 +29,7 @@ from objdictgen import maps from objdictgen.maps import OD from objdictgen.typing import TGetValues -from objdictgen.ui.exception import (display_error_dialog, - display_exception_dialog) +from objdictgen.ui.exception import display_error_dialog, display_exception_dialog log = logging.getLogger('objdictgen') @@ -50,7 +49,6 @@ class CommunicationDialog(wx.Dialog): """Edit Communication Profile Dialog.""" - # pylint: disable=attribute-defined-outside-init IndexDictionary: dict[int, tuple[str, bool]] CurrentList: list[int] @@ -249,7 +247,6 @@ def UnselectCurrent(self): class MapVariableDialog(wx.Dialog): """Create Map Variable Dialog.""" - # pylint: disable=attribute-defined-outside-init def _init_coll_flexGridSizer1_Items(self, parent): parent.Add(self.MainSizer, 0, border=20, @@ -383,7 +380,7 @@ def __init__(self, parent): def SetIndex(self, index): self.Index.SetValue(f"0x{index:04X}") - def OnOK(self, event): # pylint: disable=unused-argument + def OnOK(self, event): error = [] try: int(self.Index.GetValue(), 16) @@ -459,7 +456,6 @@ def EnableNumberTyping(self, enable): class UserTypeDialog(wx.Dialog): """Create User Type Dialog.""" - # pylint: disable=attribute-defined-outside-init # Helpers for typing RightBoxSizer: wx.StaticBoxSizer @@ -592,7 +588,7 @@ def __init__(self, parent): self.TypeDictionary: dict[str, tuple[int, int]] = {} - def OnOK(self, event): # pylint: disable=unused-argument + def OnOK(self, event): error = [] message = None name = self.Type.GetStringSelection() @@ -711,7 +707,6 @@ def GetValues(self): class NodeInfosDialog(wx.Dialog): """Dialog for editing node infos.""" - # pylint: disable=attribute-defined-outside-init def _init_coll_flexGridSizer1_Items(self, parent): parent.Add(self.MainSizer, 0, border=20, @@ -821,7 +816,7 @@ def __init__(self, parent): for node_type in NODE_TYPES: self.Type.Append(node_type) - def OnOK(self, event): # pylint: disable=unused-argument + def OnOK(self, event): name = self.NodeName.GetValue() message = "" if name: @@ -883,7 +878,7 @@ def GetValues(self): class CreateNodeDialog(wx.Dialog): """Dialog for creating new node.""" - # pylint: disable=attribute-defined-outside-init + def _init_coll_flexGridSizer1_Items(self, parent): parent.Add(self.MainSizer, 0, border=20, @@ -1123,7 +1118,7 @@ def __init__(self, parent, buttons=wx.OK | wx.CANCEL): self.Profile.SetStringSelection("None") self.NodeName.SetFocus() - def OnOK(self, event): # pylint: disable=unused-argument + def OnOK(self, event): name = self.NodeName.GetValue() message = "" if name: @@ -1217,7 +1212,6 @@ def OnProfileChoice(self, event): class AddSlaveDialog(wx.Dialog): """UI for adding a slave to the nodelist.""" - # pylint: disable=attribute-defined-outside-init def _init_coll_flexGridSizer1_Items(self, parent): parent.Add(self.MainSizer, 0, border=20, @@ -1314,7 +1308,7 @@ def __init__(self, parent): self.SlaveNodeID.SetValue("0x00") - def OnOK(self, event): # pylint: disable=unused-argument + def OnOK(self, event): error = [] if not self.SlaveName.GetValue(): error.append("Slave Name") @@ -1369,7 +1363,7 @@ def OnImportEDSButton(self, event): if dialog.ShowModal() == wx.ID_YES: try: self.NodeList.ImportEDSFile(filepath) - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) self.RefreshEDSFile() @@ -1407,7 +1401,6 @@ def GetValues(self) -> TGetValues: class DCFEntryValuesTable(wx.grid.GridTableBase): - # pylint: disable=attribute-defined-outside-init """ A custom wxGrid Table using user supplied data @@ -1531,7 +1524,6 @@ def Empty(self): class DCFEntryValuesDialog(wx.Dialog): """Dialog to edit DCF Entry values.""" - # pylint: disable=attribute-defined-outside-init def _init_coll_MainSizer_Items(self, parent): parent.Add(self.staticText1, 0, border=20, diff --git a/src/objdictgen/ui/exception.py b/src/objdictgen/ui/exception.py index 88d3467..2d1b41f 100644 --- a/src/objdictgen/ui/exception.py +++ b/src/objdictgen/ui/exception.py @@ -90,8 +90,7 @@ def format_namespace(dic, indent=' '): def handle_exception(e_type, e_value, e_traceback, parent=None): # Import here to prevent circular import - from objdictgen import \ - __version__ # pylint: disable=import-outside-toplevel + from objdictgen import __version__ # this is very helpful when there's an exception in the rest of this func traceback.print_exception(e_type, e_value, e_traceback) diff --git a/src/objdictgen/ui/networkedit.py b/src/objdictgen/ui/networkedit.py index 5628a73..55f4547 100644 --- a/src/objdictgen/ui/networkedit.py +++ b/src/objdictgen/ui/networkedit.py @@ -66,7 +66,6 @@ def usage(): class NetworkEdit(NetworkEditorTemplate): """Network Editor UI.""" - # pylint: disable=attribute-defined-outside-init # Type helpers NodeList: nl.NodeList @@ -256,14 +255,14 @@ def OnCloseFrame(self, event): self.Closing = True event.Skip() - def OnQuitMenu(self, event): # pylint: disable=unused-argument + def OnQuitMenu(self, event): self.Close() # -------------------------------------------------------------------------- # Load and Save Funtions # -------------------------------------------------------------------------- - def OnNewProjectMenu(self, event): # pylint: disable=unused-argument + def OnNewProjectMenu(self, event): if self.NodeList: defaultpath = os.path.dirname(self.NodeList.Root) else: @@ -291,10 +290,10 @@ def OnNewProjectMenu(self, event): # pylint: disable=unused-argument self.RefreshTitle() self.RefreshProfileMenu() self.RefreshMainMenu() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) - def OnOpenProjectMenu(self, event): # pylint: disable=unused-argument + def OnOpenProjectMenu(self, event): if self.NodeList: defaultpath = os.path.dirname(self.NodeList.Root) else: @@ -321,16 +320,16 @@ def OnOpenProjectMenu(self, event): # pylint: disable=unused-argument self.RefreshTitle() self.RefreshProfileMenu() self.RefreshMainMenu() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) - def OnSaveProjectMenu(self, event): # pylint: disable=unused-argument + def OnSaveProjectMenu(self, event): try: self.NodeList.SaveProject() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) - def OnCloseProjectMenu(self, event): # pylint: disable=unused-argument + def OnCloseProjectMenu(self, event): if self.NodeList: if self.NodeList.HasChanged(): with wx.MessageDialog( @@ -342,7 +341,7 @@ def OnCloseProjectMenu(self, event): # pylint: disable=unused-argument if answer == wx.ID_YES: try: self.NodeList.SaveProject() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) elif answer == wx.ID_NO: self.NodeList.Changed = False diff --git a/src/objdictgen/ui/networkeditortemplate.py b/src/objdictgen/ui/networkeditortemplate.py index 325d739..349856e 100644 --- a/src/objdictgen/ui/networkeditortemplate.py +++ b/src/objdictgen/ui/networkeditortemplate.py @@ -35,7 +35,6 @@ class NetworkEditorTemplate(NodeEditorTemplate): """Network Editor Template.""" - # pylint: disable=attribute-defined-outside-init def _init_ctrls(self, parent): # FIXME: This cast is to define right type hints of attributes for this specific instance @@ -112,7 +111,7 @@ def RefreshBufferState(self): # Slave Nodes Management # -------------------------------------------------------------------------- - def OnAddSlaveMenu(self, event): # pylint: disable=unused-argument + def OnAddSlaveMenu(self, event): with AddSlaveDialog(self.Frame) as dialog: dialog.SetNodeList(self.NodeList) if dialog.ShowModal() != wx.ID_OK: @@ -131,10 +130,10 @@ def OnAddSlaveMenu(self, event): # pylint: disable=unused-argument self.NodeList.CurrentSelected = idx self.NetworkNodes.SetSelection(idx) self.RefreshBufferState() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self.Frame) - def OnRemoveSlaveMenu(self, event): # pylint: disable=unused-argument + def OnRemoveSlaveMenu(self, event): slavenames = self.NodeList.GetSlaveNames() slaveids = self.NodeList.GetSlaveIDs() with wx.SingleChoiceDialog( @@ -155,7 +154,7 @@ def OnRemoveSlaveMenu(self, event): # pylint: disable=unused-argument if new_selection > 0: self.NodeList.CurrentSelected = slaveids[new_selection - 1] self.RefreshBufferState() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self.Frame) def OpenMasterDCFDialog(self, node_id: int): diff --git a/src/objdictgen/ui/nodeeditortemplate.py b/src/objdictgen/ui/nodeeditortemplate.py index d358df0..f4cb05e 100644 --- a/src/objdictgen/ui/nodeeditortemplate.py +++ b/src/objdictgen/ui/nodeeditortemplate.py @@ -24,8 +24,7 @@ from objdictgen.node import Node from objdictgen.nodemanager import NodeManager from objdictgen.ui import commondialogs as common -from objdictgen.ui.exception import (display_error_dialog, - display_exception_dialog) +from objdictgen.ui.exception import display_error_dialog, display_exception_dialog class NodeEditorTemplate(wx.Frame): @@ -45,33 +44,33 @@ def __init__(self, manager: NodeManager, mode_solo: bool): self.BusId = None # FIXME: Is this used? EditingPanel.OnSubindexGridCellLeftClick can seem to indicate it is iterable self.Closing = False - def OnAddSDOServerMenu(self, event): # pylint: disable=unused-argument + def OnAddSDOServerMenu(self, event): self.Manager.AddSDOServerToCurrent() self.RefreshBufferState() self.RefreshCurrentIndexList() - def OnAddSDOClientMenu(self, event): # pylint: disable=unused-argument + def OnAddSDOClientMenu(self, event): self.Manager.AddSDOClientToCurrent() self.RefreshBufferState() self.RefreshCurrentIndexList() - def OnAddPDOTransmitMenu(self, event): # pylint: disable=unused-argument + def OnAddPDOTransmitMenu(self, event): self.Manager.AddPDOTransmitToCurrent() self.RefreshBufferState() self.RefreshCurrentIndexList() - def OnAddPDOReceiveMenu(self, event): # pylint: disable=unused-argument + def OnAddPDOReceiveMenu(self, event): self.Manager.AddPDOReceiveToCurrent() self.RefreshBufferState() self.RefreshCurrentIndexList() - def OnAddMapVariableMenu(self, event): # pylint: disable=unused-argument + def OnAddMapVariableMenu(self, event): self.AddMapVariable() - def OnAddUserTypeMenu(self, event): # pylint: disable=unused-argument + def OnAddUserTypeMenu(self, event): self.AddUserType() - def OnRefreshMenu(self, event): # pylint: disable=unused-argument + def OnRefreshMenu(self, event): self.RefreshCurrentIndexList() def RefreshCurrentIndexList(self): @@ -139,12 +138,12 @@ def RefreshProfileMenu(self): def RefreshBufferState(self): pass - def OnUndoMenu(self, event): # pylint: disable=unused-argument + def OnUndoMenu(self, event): self.Manager.LoadCurrentPrevious() self.RefreshCurrentIndexList() self.RefreshBufferState() - def OnRedoMenu(self, event): # pylint: disable=unused-argument + def OnRedoMenu(self, event): self.Manager.LoadCurrentNext() self.RefreshCurrentIndexList() self.RefreshBufferState() @@ -153,15 +152,15 @@ def OnRedoMenu(self, event): # pylint: disable=unused-argument # Editing Profiles functions # -------------------------------------------------------------------------- - def OnCommunicationMenu(self, event): # pylint: disable=unused-argument + def OnCommunicationMenu(self, event): dictionary, current = self.Manager.GetCurrentCommunicationLists() self.EditProfile("Edit DS-301 Profile", dictionary, current) - def OnOtherCommunicationMenu(self, event): # pylint: disable=unused-argument + def OnOtherCommunicationMenu(self, event): dictionary, current = self.Manager.GetCurrentDS302Lists() self.EditProfile("Edit DS-302 Profile", dictionary, current) - def OnEditProfileMenu(self, event): # pylint: disable=unused-argument + def OnEditProfileMenu(self, event): title = f"Edit {self.Manager.current.ProfileName} Profile" dictionary, current = self.Manager.GetCurrentProfileLists() self.EditProfile(title, dictionary, current) @@ -187,7 +186,7 @@ def EditProfile(self, title: str, dictionary: dict[int, tuple[str, bool]], curre self.RefreshBufferState() def GetProfileCallBack(self, text): - def profile_cb(event): # pylint: disable=unused-argument + def profile_cb(event): self.Manager.AddSpecificEntryToCurrent(text) self.RefreshBufferState() self.RefreshCurrentIndexList() @@ -197,7 +196,7 @@ def profile_cb(event): # pylint: disable=unused-argument # Edit Node informations function # -------------------------------------------------------------------------- - def OnNodeInfosMenu(self, event): # pylint: disable=unused-argument + def OnNodeInfosMenu(self, event): dialog = common.NodeInfosDialog(self.Frame) name, nodeid, nodetype, description = self.Manager.GetCurrentNodeInfos() defaultstringsize = self.Manager.current.DefaultStringSize @@ -224,7 +223,7 @@ def AddMapVariable(self): self.Manager.AddMapVariableToCurrent(*dialog.GetValues()) self.RefreshBufferState() self.RefreshCurrentIndexList() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self.Frame) else: display_error_dialog(self.Frame, "No map variable index left!") @@ -237,5 +236,5 @@ def AddUserType(self): self.Manager.AddUserTypeToCurrent(*dialog.GetValues()) self.RefreshBufferState() self.RefreshCurrentIndexList() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self.Frame) diff --git a/src/objdictgen/ui/objdictedit.py b/src/objdictgen/ui/objdictedit.py index bb3b2df..422143b 100644 --- a/src/objdictgen/ui/objdictedit.py +++ b/src/objdictgen/ui/objdictedit.py @@ -31,8 +31,7 @@ from objdictgen.nodemanager import NodeManager from objdictgen.typing import TPath from objdictgen.ui.commondialogs import CreateNodeDialog -from objdictgen.ui.exception import (add_except_hook, display_error_dialog, - display_exception_dialog) +from objdictgen.ui.exception import add_except_hook, display_error_dialog, display_exception_dialog from objdictgen.ui.nodeeditortemplate import NodeEditorTemplate from objdictgen.ui.subindextable import EditingPanel, EditingPanelNotebook @@ -71,7 +70,6 @@ def usage(): class ObjdictEdit(NodeEditorTemplate): """Main frame for the object dictionary editor.""" - # pylint: disable=attribute-defined-outside-init EDITMENU_ID = ID_OBJDICTEDITEDITMENUOTHERPROFILE @@ -290,7 +288,7 @@ def OnFileSelectedChanged(self, event): self.RefreshProfileMenu() event.Skip() - def OnQuitMenu(self, event): # pylint: disable=unused-argument + def OnQuitMenu(self, event): self.Close() def OnCloseFrame(self, event): @@ -390,7 +388,7 @@ def RefreshBufferState(self): # Load and Save Funtions # -------------------------------------------------------------------------- - def OnNewMenu(self, event): # pylint: disable=unused-argument + def OnNewMenu(self, event): # self.FilePath = "" with CreateNodeDialog(self) as dialog: if dialog.ShowModal() != wx.ID_OK: @@ -415,10 +413,10 @@ def OnNewMenu(self, event): # pylint: disable=unused-argument self.RefreshBufferState() self.RefreshProfileMenu() self.RefreshMainMenu() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) - def OnOpenMenu(self, event): # pylint: disable=unused-argument + def OnOpenMenu(self, event): filepath = self.Manager.GetCurrentFilePath() if filepath: directory = os.path.dirname(filepath) @@ -449,13 +447,13 @@ def OnOpenMenu(self, event): # pylint: disable=unused-argument self.RefreshBufferState() self.RefreshProfileMenu() self.RefreshMainMenu() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) - def OnSaveMenu(self, event): # pylint: disable=unused-argument + def OnSaveMenu(self, event): self.Save() - def OnSaveAsMenu(self, event): # pylint: disable=unused-argument + def OnSaveAsMenu(self, event): self.SaveAs() def Save(self): @@ -466,7 +464,7 @@ def Save(self): self.SaveAs() else: self.RefreshBufferState() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) def SaveAs(self): @@ -496,7 +494,7 @@ def SaveAs(self): if self.Manager.SaveCurrentInFile(filepath, sort=True): self.Manager.SetCurrentFilePath(filepath) self.RefreshBufferState() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) def OnCloseMenu(self, event): @@ -529,7 +527,7 @@ def OnCloseMenu(self, event): # Import and Export Functions # -------------------------------------------------------------------------- - def OnImportEDSMenu(self, event): # pylint: disable=unused-argument + def OnImportEDSMenu(self, event): with wx.FileDialog( self, "Choose a file", os.getcwd(), "", "EDS files (*.eds)|*.eds|All files|*.*", style=wx.FD_OPEN | wx.FD_CHANGE_DIR, @@ -553,12 +551,12 @@ def OnImportEDSMenu(self, event): # pylint: disable=unused-argument self, "Import successful", "Information", wx.OK | wx.ICON_INFORMATION, ) as message: message.ShowModal() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) else: display_error_dialog(self, f"'{filepath}' is not a valid file!") - def OnExportEDSMenu(self, event): # pylint: disable=unused-argument + def OnExportEDSMenu(self, event): with wx.FileDialog( self, "Choose a file", os.getcwd(), self.Manager.GetCurrentNodeInfos()[0], "EDS files (*.eds)|*.eds|All files|*.*", @@ -581,10 +579,10 @@ def OnExportEDSMenu(self, event): # pylint: disable=unused-argument wx.OK | wx.ICON_INFORMATION, ) as message: message.ShowModal() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) - def OnExportCMenu(self, event): # pylint: disable=unused-argument + def OnExportCMenu(self, event): with wx.FileDialog( self, "Choose a file", os.getcwd(), self.Manager.GetCurrentNodeInfos()[0], "CANFestival C files (*.c)|*.c|All files|*.*", @@ -606,7 +604,7 @@ def OnExportCMenu(self, event): # pylint: disable=unused-argument self, "Export successful", "Information", wx.OK | wx.ICON_INFORMATION, ) as message: message.ShowModal() - except Exception: # pylint: disable=broad-except + except Exception: display_exception_dialog(self) diff --git a/src/objdictgen/ui/subindextable.py b/src/objdictgen/ui/subindextable.py index 801f5ab..e01ec25 100644 --- a/src/objdictgen/ui/subindextable.py +++ b/src/objdictgen/ui/subindextable.py @@ -143,12 +143,12 @@ def GetNumberCols(self): def GetNumberRows(self): return len(self.data) - def GetColLabelValue(self, col, translate=True): # pylint: disable=unused-argument + def GetColLabelValue(self, col, translate=True): if col < len(self.colnames): return self.colnames[col] return None - def GetValue(self, row, col, translate=True) -> str: # pylint: disable=unused-argument + def GetValue(self, row, col, translate=True) -> str: if row < self.GetNumberRows(): colname = self.GetColLabelValue(col, False) value = str(self.data[row].get(colname, "")) @@ -340,7 +340,6 @@ def Empty(self): class EditingPanel(wx.SplitterWindow): """UI for the Object Dictionary Editor.""" - # pylint: disable=attribute-defined-outside-init # Typing definitions Manager: NodeManager @@ -732,7 +731,7 @@ def ShowDCFEntryDialog(self, row, col): value = dialog.GetValues() try: self.Manager.SetCurrentEntry(index, row, value, "value", "dcf") - except Exception as e: # pylint: disable=broad-except + except Exception as e: display_error_dialog(self, f"Failed to set value: {e}", "Failed to set value") self.ParentWindow.RefreshBufferState() wx.CallAfter(self.RefreshTable) @@ -747,7 +746,7 @@ def OnSubindexGridCellChange(self, event): editor = self.Table.GetEditor(subindex, col) try: self.Manager.SetCurrentEntry(index, subindex, value, name, editor) - except Exception as e: # pylint: disable=broad-except + except Exception as e: display_error_dialog(self, f"Failed to set value: {e}", "Failed to set value") self.ParentWindow.RefreshBufferState() wx.CallAfter(self.RefreshTable) @@ -836,7 +835,7 @@ def OnSubindexGridRightClick(self, event): self.PopupMenu(self.SubindexGridMenu) event.Skip() - def OnAddToDCFSubindexMenu(self, event): # pylint: disable=unused-argument + def OnAddToDCFSubindexMenu(self, event): if not self.Editable: selected = self.IndexList.GetSelection() if selected != wx.NOT_FOUND: @@ -875,7 +874,7 @@ def OpenDCFDialog(self, node_id: int): self.SubindexGrid.SetGridCursor(node_id, 3) self.ShowDCFEntryDialog(node_id, 3) - def OnRenameIndexMenu(self, event): # pylint: disable=unused-argument + def OnRenameIndexMenu(self, event): if self.Editable: selected = self.IndexList.GetSelection() if selected != wx.NOT_FOUND: @@ -891,7 +890,7 @@ def OnRenameIndexMenu(self, event): # pylint: disable=unused-argument self.ParentWindow.RefreshBufferState() self.RefreshIndexList() - def OnModifyIndexMenu(self, event): # pylint: disable=unused-argument + def OnModifyIndexMenu(self, event): if self.Editable: selected = self.IndexList.GetSelection() if selected != wx.NOT_FOUND: @@ -910,7 +909,7 @@ def OnModifyIndexMenu(self, event): # pylint: disable=unused-argument self.ParentWindow.RefreshBufferState() self.RefreshIndexList() - def OnDeleteIndexMenu(self, event): # pylint: disable=unused-argument + def OnDeleteIndexMenu(self, event): if self.Editable: selected = self.IndexList.GetSelection() if selected != wx.NOT_FOUND: @@ -920,7 +919,7 @@ def OnDeleteIndexMenu(self, event): # pylint: disable=unused-argument self.ParentWindow.RefreshBufferState() self.RefreshIndexList() - def OnAddSubindexMenu(self, event): # pylint: disable=unused-argument + def OnAddSubindexMenu(self, event): if self.Editable: selected = self.IndexList.GetSelection() if selected != wx.NOT_FOUND: @@ -939,7 +938,7 @@ def OnAddSubindexMenu(self, event): # pylint: disable=unused-argument except ValueError: display_error_dialog(self, "An integer is required!") - def OnDeleteSubindexMenu(self, event): # pylint: disable=unused-argument + def OnDeleteSubindexMenu(self, event): if self.Editable: selected = self.IndexList.GetSelection() if selected != wx.NOT_FOUND: @@ -958,7 +957,7 @@ def OnDeleteSubindexMenu(self, event): # pylint: disable=unused-argument except ValueError: display_error_dialog(self, "An integer is required!") - def OnDefaultValueSubindexMenu(self, event): # pylint: disable=unused-argument + def OnDefaultValueSubindexMenu(self, event): if self.Editable: selected = self.IndexList.GetSelection() if selected != wx.NOT_FOUND: diff --git a/tests/conftest.py b/tests/conftest.py index 143298e..22c35c9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,19 +1,18 @@ """ Pytest configuration file for the objdictgen package """ -import shutil -from typing import Generator +import difflib import os +import pickle +import shutil +import subprocess import sys -import difflib from dataclasses import dataclass -import subprocess from pathlib import Path -import pickle + import pytest import objdictgen import objdictgen.node - # The path to this directory HERE = Path(__file__).parent @@ -101,7 +100,7 @@ class Fn: def diff(a, b, predicate=None, postprocess=None, **kw): """ Diff two files """ if predicate is None: - predicate = lambda x: True + predicate = lambda x: True # noqa: E731 with open(a, 'r', encoding="utf-8") as f: da = [n.rstrip() for n in f if predicate(n)] with open(b, 'r', encoding="utf-8") as f: diff --git a/tests/test_maps.py b/tests/test_maps.py index 0387334..f666d25 100644 --- a/tests/test_maps.py +++ b/tests/test_maps.py @@ -59,7 +59,7 @@ def test_maps_evaluate_expression(): assert dut("4+3-2") == 5 # Compare - assert dut("1<2") == True + assert dut("1<2") is True with pytest.raises(SyntaxError): dut("1<2<3") with pytest.raises(SyntaxError): diff --git a/tests/test_nodelist.py b/tests/test_nodelist.py index 82843d9..cf888c1 100644 --- a/tests/test_nodelist.py +++ b/tests/test_nodelist.py @@ -1,8 +1,6 @@ -import pytest - -from objdictgen.nodemanager import NodeManager -from objdictgen.nodelist import NodeList, main from objdictgen.node import Node +from objdictgen.nodelist import NodeList, main +from objdictgen.nodemanager import NodeManager def test_nodelist_main(wd): diff --git a/tests/test_nodemanager.py b/tests/test_nodemanager.py index 06605bc..3dee77e 100644 --- a/tests/test_nodemanager.py +++ b/tests/test_nodemanager.py @@ -1,9 +1,9 @@ -import pytest from pprint import pprint -from objdictgen.nodemanager import NodeManager -from objdictgen.maps import OD from objdictgen.jsonod import node_todict +from objdictgen.maps import OD +from objdictgen.nodemanager import NodeManager + def test_nodemanager_createnewnode(): diff --git a/tests/test_printing.py b/tests/test_printing.py index 3ff63a4..330f02f 100644 --- a/tests/test_printing.py +++ b/tests/test_printing.py @@ -1,11 +1,10 @@ """Test functions for printing.py""" import types + import pytest -from objdictgen import __main__ -from objdictgen.printing import (FormatNodeOpts, format_node, format_od_header, - format_od_object, format_diff_nodes) from objdictgen.node import Node +from objdictgen.printing import FormatNodeOpts, format_diff_nodes, format_node, format_od_header, format_od_object @pytest.mark.parametrize("file", [