Skip to content

Conversation

Christinarlong
Copy link
Contributor

@Christinarlong Christinarlong commented Aug 21, 2025

This PR types

  • sentry.integrations.slack.message_builder.notifications.issues
  • sentry.integrations.slack.webhooks.event

PR mainly changes a lot of User -> RpcUser & Integration -> RpcIntegration since we know for alerts & notifications their operations take place in Region silo so type with the equiv. region resources

thetruecpaul and others added 21 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
@github-actions github-actions bot added the Scope: Backend Automatically applied to PRs that change backend components label Aug 21, 2025
thetruecpaul and others added 5 commits August 21, 2025 11:23
`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
@Christinarlong Christinarlong changed the title fix(typing): Type slack schtuff fix(typing): Type slack modules with typing issues Aug 21, 2025
@thetruecpaul thetruecpaul requested review from a team as code owners August 25, 2025 15:53
Base automatically changed from hackweek/typing-25 to master August 25, 2025 16:24
@Christinarlong
Copy link
Contributor Author

@thetruecpaul mb for not fixing earlier, this got in all the changes from the typing branch so Imma make a new PR.

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