fix: add missing Device and Component fields for deserialization #530
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #529 by adding missing fields to the Device and Component models that were causing deserialization failures.
Changes
optionalfield to Component model - The SmartThings API returnsoptional: falsein component objects, but our Component dataclass was missing this fieldrelationshipstype fromdict | Nonetodict | list | Noneto handle API variations where some devices return empty lists, non-empty lists, or dictsDevice.__pre_deserialize__()to normalize empty values:[]toNone{}toNone(since Viper model has required fields)device.components["main"].capabilitiesTesting
✅ Verified deserialization of all 184 real devices from my SmartThings account
✅ All quality checks passing:
Root Cause
The SmartThings API has inconsistent data structures:
relationships: [](empty list)relationships: [{'deviceId': '...', 'relationshipType': 'COMBINATION', ...}](non-empty list)viper: {}(empty dict, but Viper model expects required fields)optional: false(field was missing from our model)The fix handles all these variations gracefully while maintaining type safety.
Developer's Certificate of Origin
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or
(b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or
(c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it.
(d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved.