Skip to content

Conversation

Christinarlong
Copy link
Contributor

No description provided.

thetruecpaul and others added 26 commits August 18, 2025 09:44
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
@github-actions github-actions bot added the Scope: Backend Automatically applied to PRs that change backend components label Aug 21, 2025
Comment on lines -51 to +74
class UserNotificationDetailsSerializer(serializers.Serializer):
class UserNotificationDetailsSerializer(serializers.Serializer[UserNotificationDetailsArgs]):
Copy link
Contributor Author

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.

Copy link

codecov bot commented Aug 21, 2025

Codecov Report

❌ Patch coverage is 97.59036% with 2 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
...ns/api/serializers/notification_action_response.py 92.59% 2 Missing ⚠️
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           

Base automatically changed from hackweek/typing-25 to master August 25, 2025 16:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Scope: Backend Automatically applied to PRs that change backend components
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants