Refactor validator return type to support warnings via ValidationResult wrapper (#1479) - #1480
Refactor validator return type to support warnings via ValidationResult wrapper (#1479)#1480sejalpunwatkar wants to merge 15 commits into
Conversation
for more information, see https://pre-commit.ci
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## dev #1480 +/- ##
==========================================
- Coverage 93.22% 93.10% -0.13%
==========================================
Files 41 41
Lines 10221 10272 +51
Branches 2115 2117 +2
==========================================
+ Hits 9529 9564 +35
- Misses 415 431 +16
Partials 277 277 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Thanks! Looks good overall. Could you please add some basic tests of
Could you please also add a changelog entry that points to this PR? |
3a072bb to
669261e
Compare
9d3ea64 to
88bb8e9
Compare
|
@sejalpunwatkar Thanks for your work on this. Let me know when it is ready for re-review. |
|
Hi @rly, the PR is now ready for your re-review! I have fully addressed your feedback from the initial code review:
|
| return hash(self) == hash(other) | ||
|
|
||
|
|
||
| class ValidationWarning: |
There was a problem hiding this comment.
Since ValidationWarning is almost entirely identical to Error, it would be better to create a shared base class ValidationIssue that both extend from and that contains all the shared code. Downstream code will still be able to differentiate between Error and ValidationWarning because they are different classes.
One minor thing is that because __eq__ is defined based on the hash and I believe the hash of a ValidationWarning and the hash of an identical Error object will be the same, then Error("name", "reason") == ValidationWarning("name", "reason") will be True. This might become an issue if/when errors and warnings are placed in a dict together.
To address this, I would change __eq__ to:
def __eq__(self, other):
return type(self) is type(other) and hash(self) == hash(other)There was a problem hiding this comment.
Thanks for the below change to ValidationWarning.__eq__.
Since ValidationWarning and Error share significant code, could you also create a shared base class ValidationIssue that both extend from and that contains all the shared code? That would also make Error.__eq__ match ValidationWarning.__eq__, which it should.
There was a problem hiding this comment.
With these changes, could you also add a quick test that an error and warning with the same name are not equal, so that these changed lines are tested?
|
Thanks @sejalpunwatkar . This is looking much better. I have a few more comments and suggestions above |
5e33150 to
964acbf
Compare
|
Hi @rly, I've addressed all your feedback: fixed the changelog section, updated the docstrings, corrected the test indentation, implemented the missing test, and updated the ValidationWarning.eq check. Ready for review! |
# Conflicts: # CHANGELOG.md
Change "Validate an file" to "Validate a file" per code review suggestion.
|
Thanks for catching that, @rly ! Fixed now. |
Motivation
Addresses #1479
This PR implements Phase 1 (the foundational plumbing) to introduce
ValidationWarninginfrastructure without breaking the existing error reporting model. This change ensures that downstream packages (like PyNWB and NWB Inspector) can eventually consume warning-level messages without modifying their immediate logic or incorrectly marking files as invalid.How to test the behavior?
ValidationWarningclass as a sibling toErrorinsideerrors.py, preserving the matching internal shape (.name,.reason,.location).ValidationResultwrapper class inerrors.pywith custom Python overrides (__bool__,__len__,__iter__,__getitem__) pointing explicitly to theerrorsbucket to ensure backward compatibility.ValidatorMap.validate()insidevalidator.pyto capture theerrors_list, wrap it into the newValidationResultcontainer with an empty warnings container (warnings=[]), and adjusted its strict@docvalreturn type check tortype=(list, ValidationResult).Checklist
CHANGELOG.mdwith your changes?