Repository navigation
Conversation
@modelclass builds an __init__ that accepts every field positionally or by keyword, but type checkers could not see it: a call such as CryptoQuote(pair="BTC-USD", bid_price=1.5) was reported as "Unexpected keyword argument" for every field. Mark modelclass with dataclass_transform (PEP 681) so checkers derive the constructor from the field annotations. The decorator is imported only under TYPE_CHECKING, from typing on 3.11+ and from typing_extensions on 3.10, and is a no-op at runtime, so there is no new runtime dependency and Python 3.10 keeps working.
Without the PEP 561 marker, mypy skips the installed package and reports
import-untyped, and users who silence that get Any for every massive type.
- Add massive/py.typed. The existing packages entry in pyproject.toml
already includes it in the wheel and sdist.
- Re-export RESTClient and WebSocketClient explicitly ("X as X"), so
"from massive import RESTClient" passes mypy --strict, which does not
treat plain imports in a typed package as re-exports. No __all__ is
added, so "from massive import *" exports the same names as before.
- Add a test that "from massive import *" still provides the main names.
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Comment |
This was referenced Oct 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Fixes #<issue: F4c>
Builds on #14. Merge #15 first: shipping the marker makes checkers see model constructors, so #15 should be in the same release. This branch includes a copy of #15's commit so that #17 can build on it; once #15 merges I rebase and the copy drops out. The change this PR adds is the last commit.
The package has no PEP 561 marker, so mypy skips it (see massive-com#876 and massive-com#379):
massive/py.typed. The existingpackagesentry inpyproject.tomlalready ships it in the wheel and sdist.RESTClientandWebSocketClientwithimport X as X, sofrom massive import RESTClientpasses--strict. No__all__is added, sofrom massive import *exports the same names as before; a new test checks the main ones.Known limitation. Every REST method is still annotated
Union[Model, HTTPResponse], becauseraw=Truereturns the undecoded response. Once checkers read the hints, strict users must narrow results:#17 adds
@overloads onrawso the default call returns the model type. It should merge together with this PR, or soon after.The callback type of
WebSocketClient.run()is a second known limitation, massive-com#1022, with a fix in massive-com#1032; this PR does not touch it.