Title: `NmtBase.state` should always return a `str` · Issue #500 · canopen-python/canopen · GitHub
Open Graph Title: `NmtBase.state` should always return a `str` · Issue #500 · canopen-python/canopen
X Title: `NmtBase.state` should always return a `str` · Issue #500 · canopen-python/canopen
Description: Problem NmtBase.state is documented and annotated as always returning a string, however there is a code path that may return an int: https://github.com/christiansandberg/canopen/blob/62e9c1f851cb8721355d22c8571f2b41599c1b36/canopen/nmt.p...
Open Graph Description: Problem NmtBase.state is documented and annotated as always returning a string, however there is a code path that may return an int: https://github.com/christiansandberg/canopen/blob/62e9c1f851cb87...
X Description: Problem NmtBase.state is documented and annotated as always returning a string, however there is a code path that may return an int: https://github.com/christiansandberg/canopen/blob/62e9c1f851cb87...
Opengraph URL: https://github.com/canopen-python/canopen/issues/500
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"`NmtBase.state` should always return a `str`","articleBody":"## Problem\r\n\r\n`NmtBase.state` is documented and annotated as always returning a string, however there is a code path that may return an `int`:\r\n\r\nhttps://github.com/christiansandberg/canopen/blob/62e9c1f851cb8721355d22c8571f2b41599c1b36/canopen/nmt.py#L74-L92\r\n\r\nThe code path in question is highly unlikely; the `NmtBase._state` member is set in the following places:\r\n\r\n- ✅ `NmtBase.__init__`: explicitly set to 0\r\n- ✅ `NmtBase.on_command`: set _iff_ the new state is a valid/known state\r\n- ✅ `NmtBase.send_command`: set _iff_ the new state is a valid/known state\r\n- ❓ `NmtMaster.on_heartbeat`: set to whatever was decoded from the heartbeat message, which _should_ be fine for any compliant device\r\n\r\n## Possible solutions\r\n\r\nIn `NmtMaster.on_heartbeat`, only set `_state` if it is a valid state; if it's not, `log.error(...)` or raise an exception.\r\n\r\nIn `NmtBase.state`, either raise an exception if `._state` is not a valid state, or return something a la `f\"UNKNOWN STATE {self._state}\"`.\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eDraft diff\u003c/summary\u003e\r\n\r\n```diff\r\ndiff --git a/canopen/nmt.py b/canopen/nmt.py\r\nindex 401ad15..1316a5c 100644\r\n--- a/canopen/nmt.py\r\n+++ b/canopen/nmt.py\r\n@@ -86,10 +86,8 @@ class NmtBase:\r\n - 'RESET'\r\n - 'RESET COMMUNICATION'\r\n \"\"\"\r\n- if self._state in NMT_STATES:\r\n- return NMT_STATES[self._state]\r\n- else:\r\n- return self._state\r\n+ assert self._state in NMT_STATES:\r\n+ return NMT_STATES[self._state]\r\n \r\n @state.setter\r\n def state(self, new_state: str):\r\n@@ -122,6 +120,12 @@ class NmtMaster(NmtBase):\r\n logger.debug(\"Received heartbeat can-id %d, state is %d\", can_id, new_state)\r\n for callback in self._callbacks:\r\n callback(new_state)\r\n+ if new_state not in NMT_STATES:\r\n+ log.error(\r\n+ \"Received heartbeat can-id %d with invalid state %d\",\r\n+ can_id, new_state\r\n+ )\r\n+ return\r\n if new_state == 0:\r\n # Boot-up, will go to PRE-OPERATIONAL automatically\r\n self._state = 127\r\n```\r\n\r\n\u003c/details\u003e","author":{"url":"https://github.com/erlend-aasland","@type":"Person","name":"erlend-aasland"},"datePublished":"2024-07-08T09:29:45.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":11},"url":"https://github.com/500/canopen/issues/500"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:62561dfd-967a-9a59-0053-0636d6fb5ec9 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 8E32:12D7DC:A9168CB:E3A0A8E:6A5EC5E9 |
| html-safe-nonce | 612e572095abb61395eb2323dc566d43df346b5b6667b2d0c9a264ac47aac688 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4RTMyOjEyRDdEQzpBOTE2OENCOkUzQTBBOEU6NkE1RUM1RTkiLCJ2aXNpdG9yX2lkIjoiNTc0Njk0ODM3NTkzOTMwMjg4OSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 64675b740e1fca86f4658da804e5713e95e775ba989618b4a160ed37b7dbd71a |
| hovercard-subject-tag | issue:2395129184 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/canopen-python/canopen/500/issue_layout |
| twitter:image | https://opengraph.githubassets.com/e778d0c1be0604ea86a712b14e6784b9b2009ae096ac78bd19a3e1830a3dc137/canopen-python/canopen/issues/500 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/e778d0c1be0604ea86a712b14e6784b9b2009ae096ac78bd19a3e1830a3dc137/canopen-python/canopen/issues/500 |
| og:image:alt | Problem NmtBase.state is documented and annotated as always returning a string, however there is a code path that may return an int: https://github.com/christiansandberg/canopen/blob/62e9c1f851cb87... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | erlend-aasland |
| hostname | github.com |
| expected-hostname | github.com |
| None | fbe2b3a3baf2f0e0ac1671a4d190d9de098dcf218eb73137ad46da364d3df398 |
| turbo-cache-control | no-preview |
| go-import | github.com/canopen-python/canopen git https://github.com/canopen-python/canopen.git |
| octolytics-dimension-user_id | 200581454 |
| octolytics-dimension-user_login | canopen-python |
| octolytics-dimension-repository_id | 68737600 |
| octolytics-dimension-repository_nwo | canopen-python/canopen |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 68737600 |
| octolytics-dimension-repository_network_root_nwo | canopen-python/canopen |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 0cd844a7ab298ec8d89b66ef4b195d158229d335 |
| ui-target | canary-2 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width