-
-
Notifications
You must be signed in to change notification settings - Fork 4.4k
fix(typing): Stronglist the entire notifications module #98117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
Added return types to functions that just return literal strings, ints, or bools. Used the following python script: ``` from re import sub # find **/*.py > files.txt for file in open("files.txt"): source = open(file.strip()).read() """ def foo(x: int, y): return f"1234" """ # Literal strings source = sub( r"def ([^\n>]+):(\n\s+)(return [rf]?(\"[^\"]*\"|'[^']*')\n)", r"def \1 -> str:\2\3", source, ) # Literal ints source = sub( r"def ([^\n>]+):(\n\s+)(return \d+\n)", r"def \1 -> int:\2\3", source, ) # Literal bools source = sub( r"def ([^\n>]+):(\n\s+)(return (True|False)\n)", r"def \1 -> bool:\2\3", source, ) open(file.strip(), "w").write(source) ```
Added a bunch of return types. (Took the HttpResponseBase from the root class.) `mypy` no errors
two super-duper low-lift files (just adding `None` return types).
Part of Hackweek 2025 typing efforts ⭐
# Summary Grabbed this because I thought it would just be a bunch of easy missing-return-type errors. It turns out, when you add return types you expose other errors. Who'd've thunk? 😅 Here's the complicating factor: the plugin framework uses `Request`. `RequestFactory` returns `WSGIRequest`. `BaseTestCase.make_request` returns `HttpRequest`. Our typing revealed that a bunch of incorrect `Request-ish` types were being passed around. This PR changes the incompatible frameworks to `MagicMock`, which more correctly limits behavior to what is explicitly defined (and not what would not actually happen due to type differences). # Test Plan `mypy tests/sentry_plugins` ==> no errors `pytest tests/sentry_plugins/**` ==> `162 passed, 1 skipped`
was picking through the files with only one error. this got a lot of the initially-known-to-mypy errors fixed... but I'm concerned that it exposed more errors that I don't have a good way of exposing, since I didn't stick to a single easily-added-to-pyproject module. I think in the future I'll probably stick to codemods or modules.
Just needed to type the setup functions! `rg -l 'def setUp\(self\):' tests/apidocs | xargs sed -i '' -E -e 's/def setUp\(self\):/def setUp(self) -> None:/'` # Test Plan Ran `mypy tests/apidocs`, no errors
# Summary 59 files, newly typed! # Test Plan `mypy` no errors --------- Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
# Summary Developed a new pattern that let me run through some files I identified as low-lift quickly: * Added `"sentry.*", "test.*"` to `pyproject.toml` * Developed a list of expected-to-be-low-lift files from mypy output * Mostly files that were in test directory, only had one error, or only needed `None` return types * Then repeatedly ran `mypy <big_list_of_files>` and whittled that down * Before pushing the branch, I removed the changes to `pyproject.toml` Result is that I can confidently say that this PR successfully types ~150 new files. # Test Plan Reverted changes to `pyproject.toml` and ran `mypy` to ensure the new types had no effect on steady-state — no errors!
These magic test functions always have the same returns! I already messed with some in `tests/sentry`; worth expanding to all of `tests` ``` rg 'def tearDown' tests -ls | xargs sed -i '' 's/def tearDown(self):/def tearDown(self) -> None:/' rg 'def setUp' tests -ls | xargs sed -i '' 's/def setUp(self):/def setUp(self) -> None:/' ```
Follows #97998 Turns out there's a utility function to convert `HttpRequest` to `Request`! Better to use the normal requests than full mocks.
completely types an additional 65 files with low errors-per-file count
This was more complex than expected 😅
# Summary Typed a new module, 11 files fixed. # Test Plan `mypy` no errors
`mypy` no errors
# Summary dragged types from `pytest.mark.parametrize` to the test function header fully types an additional 28 files # Test Plan `mypy` no errors
class UserNotificationDetailsSerializer(serializers.Serializer): | ||
class UserNotificationDetailsSerializer(serializers.Serializer[UserNotificationDetailsArgs]): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For several drf serializers I kept getting some variant of -
error: Missing type parameters for generic type "CamelSnakeSerializer"
, despite seeing other drf serializers not declaring the concrete type(example).
Also I'm having a hard time understanding what exactly does declaring the concrete type do for drf Serializer
since I couldn't find any generics in the parent class.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## hackweek/typing-25 #98117 +/- ##
=====================================================
Coverage ? 80.63%
=====================================================
Files ? 8598
Lines ? 379477
Branches ? 24710
=====================================================
Hits ? 305978
Misses ? 73121
Partials ? 378 |
64dbc1f
to
6312178
Compare
No description provided.