Skip to content

Commit f6cb475

Browse files
ref: fix typing in sentry.testutils.factories (#67046)
<!-- Describe your PR here. -->
1 parent bb1a2ef commit f6cb475

File tree

5 files changed

+36
-33
lines changed

5 files changed

+36
-33
lines changed

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,6 @@ module = [
485485
"sentry.templatetags.sentry_plugins",
486486
"sentry.testutils.asserts",
487487
"sentry.testutils.cases",
488-
"sentry.testutils.factories",
489488
"sentry.testutils.fixtures",
490489
"sentry.testutils.helpers.features",
491490
"sentry.testutils.helpers.notifications",

src/sentry/models/integrations/integration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def add_organization(
119119
"""
120120
Add an organization to this integration.
121121
122-
Returns False if the OrganizationIntegration was not created
122+
Returns None if the OrganizationIntegration was not created
123123
"""
124124
from sentry.models.integrations.organization_integration import OrganizationIntegration
125125

src/sentry/testutils/factories.py

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io
55
import os
66
import random
7+
import zipfile
78
from base64 import b64encode
89
from binascii import hexlify
910
from collections.abc import Mapping, Sequence
@@ -304,22 +305,22 @@ def create_organization(name=None, owner=None, region: Region | str | None = Non
304305
if not name:
305306
name = petname.generate(2, " ", letters=10).title()
306307

307-
if region is None or SiloMode.get_current_mode() == SiloMode.MONOLITH:
308-
region_name = get_local_region().name
309-
org_creation_context = contextlib.nullcontext()
310-
else:
311-
if isinstance(region, Region):
312-
region_name = region.name
308+
with contextlib.ExitStack() as ctx:
309+
if region is None or SiloMode.get_current_mode() == SiloMode.MONOLITH:
310+
region_name = get_local_region().name
313311
else:
314-
region_obj = get_region_by_name(region) # Verify it exists
315-
region_name = region_obj.name
316-
org_creation_context = override_settings(
317-
SILO_MODE=SiloMode.REGION, SENTRY_REGION=region_name
318-
)
312+
if isinstance(region, Region):
313+
region_name = region.name
314+
else:
315+
region_obj = get_region_by_name(region) # Verify it exists
316+
region_name = region_obj.name
317+
318+
ctx.enter_context(
319+
override_settings(SILO_MODE=SiloMode.REGION, SENTRY_REGION=region_name)
320+
)
319321

320-
with org_creation_context:
321322
with outbox_context(flush=False):
322-
org: Organization = Organization.objects.create(name=name, **kwargs)
323+
org = Organization.objects.create(name=name, **kwargs)
323324

324325
with assume_test_silo_mode(SiloMode.CONTROL):
325326
# Organization mapping creation relies on having a matching org slug reservation
@@ -592,7 +593,7 @@ def create_release(
592593
ReleaseEnvironment.objects.create(
593594
organization=project.organization, release=release, environment=environment
594595
)
595-
for project in [project] + additional_projects:
596+
for project in [project, *additional_projects]:
596597
ReleaseProjectEnvironment.objects.create(
597598
project=project,
598599
release=release,
@@ -626,6 +627,7 @@ def create_release(
626627

627628
return release
628629

630+
@staticmethod
629631
def create_group_release(project: Project, group: Group, release: Release) -> GroupRelease:
630632
return GroupRelease.objects.create(
631633
project_id=project.id,
@@ -662,13 +664,11 @@ def create_release_file(release_id, file=None, name=None, dist_id=None):
662664
def create_artifact_bundle_zip(
663665
org=None, release=None, project=None, extra_files=None, fixture_path="artifact_bundle"
664666
):
665-
import zipfile
666-
667667
bundle = io.BytesIO()
668668
bundle_dir = get_fixture_path(fixture_path)
669-
with zipfile.ZipFile(bundle, "w", zipfile.ZIP_DEFLATED) as zipfile:
669+
with zipfile.ZipFile(bundle, "w", zipfile.ZIP_DEFLATED) as zipf:
670670
for path, content in (extra_files or {}).items():
671-
zipfile.writestr(path, content)
671+
zipf.writestr(path, content)
672672
for path, _, files in os.walk(bundle_dir):
673673
for filename in files:
674674
fullpath = os.path.join(path, filename)
@@ -677,20 +677,20 @@ def create_artifact_bundle_zip(
677677
manifest = _patch_artifact_manifest(
678678
fullpath, org, release, project, extra_files
679679
)
680-
zipfile.writestr(relpath, manifest)
680+
zipf.writestr(relpath, manifest)
681681
else:
682-
zipfile.write(fullpath, relpath)
682+
zipf.write(fullpath, relpath)
683683

684684
return bundle.getvalue()
685685

686686
@classmethod
687687
@assume_test_silo_mode(SiloMode.REGION)
688688
def create_release_archive(cls, org, release: str, project=None, dist=None):
689689
bundle = cls.create_artifact_bundle_zip(org, release, project)
690-
file_ = File.objects.create(name="release-artifacts.zip")
691-
file_.putfile(ContentFile(bundle))
692-
release = Release.objects.get(organization__slug=org, version=release)
693-
return update_artifact_index(release, dist, file_)
690+
file = File.objects.create(name="release-artifacts.zip")
691+
file.putfile(ContentFile(bundle))
692+
release_obj = Release.objects.get(organization__slug=org, version=release)
693+
return update_artifact_index(release_obj, dist, file)
694694

695695
@classmethod
696696
@assume_test_silo_mode(SiloMode.REGION)
@@ -854,7 +854,7 @@ def create_usersocialauth(
854854
user: User,
855855
provider: str | None = None,
856856
uid: str | None = None,
857-
extra_data: Mapping[str, Any] | None = None,
857+
extra_data: dict[str, Any] | None = None,
858858
):
859859
if not provider:
860860
provider = "asana"
@@ -885,7 +885,7 @@ def inject_performance_problems(jobs, _):
885885
type=group_type,
886886
parent_span_ids=None,
887887
cause_span_ids=None,
888-
offender_span_ids=None,
888+
offender_span_ids=[],
889889
evidence_data={},
890890
evidence_display=[],
891891
)
@@ -1075,16 +1075,18 @@ def create_internal_integration_token(
10751075
) -> ApiToken:
10761076
if internal_integration and install:
10771077
raise ValueError("Only one of internal_integration or install arg can be provided")
1078-
if internal_integration is None and install is None:
1078+
elif internal_integration is None and install is None:
10791079
raise ValueError("Must pass in either internal_integration or install arg")
10801080

1081-
if install is None:
1081+
if internal_integration is not None and install is None:
10821082
# Fetch install from provided or created internal integration
10831083
with assume_test_silo_mode(SiloMode.CONTROL):
10841084
install = SentryAppInstallation.objects.get(
10851085
sentry_app=internal_integration.id,
10861086
organization_id=internal_integration.owner_id,
10871087
)
1088+
elif install is None:
1089+
raise AssertionError("unreachable")
10881090

10891091
return SentryAppInstallationTokenCreator(sentry_app_installation=install).run(
10901092
user=user, request=request
@@ -1138,6 +1140,7 @@ def create_sentry_app_installation(
11381140
if not prevent_token_exchange and (
11391141
install.sentry_app.status != SentryAppStatus.INTERNAL
11401142
):
1143+
assert install.api_grant is not None
11411144
GrantExchanger.run(
11421145
install=rpc_install,
11431146
code=install.api_grant.code,
@@ -1678,6 +1681,7 @@ def create_identity_integration(
16781681
organization_integration = integration.add_organization(
16791682
organization_id=organization.id, user=user, default_auth_id=identity.id
16801683
)
1684+
assert organization_integration is not None
16811685
return integration, organization_integration, identity, identity_provider
16821686

16831687
@staticmethod
@@ -1820,7 +1824,7 @@ def create_user_option(*args, **kwargs) -> UserOption:
18201824
return UserOption.objects.create(*args, **kwargs)
18211825

18221826
@staticmethod
1823-
def create_basic_auth_header(username: str, password: str = "") -> str:
1827+
def create_basic_auth_header(username: str, password: str = "") -> bytes:
18241828
return b"Basic " + b64encode(f"{username}:{password}".encode())
18251829

18261830
@staticmethod

src/sentry/testutils/fixtures.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ def create_saved_search(self, *args, **kwargs):
560560
def create_organization_mapping(self, *args, **kwargs):
561561
return Factories.create_org_mapping(*args, **kwargs)
562562

563-
def create_basic_auth_header(self, *args, **kwargs):
563+
def create_basic_auth_header(self, *args, **kwargs) -> bytes:
564564
return Factories.create_basic_auth_header(*args, **kwargs)
565565

566566
def snooze_rule(self, *args, **kwargs):

src/social_auth/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class UserSocialAuth(models.Model):
3030
user = models.ForeignKey(AUTH_USER_MODEL, related_name="social_auth", on_delete=models.CASCADE)
3131
provider = models.CharField(max_length=32)
3232
uid = models.CharField(max_length=UID_LENGTH)
33-
extra_data: models.Field[dict[str, Any], dict[str, Any]] = JSONField(default="{}")
33+
extra_data: models.Field[dict[str, Any] | None, dict[str, Any]] = JSONField(default="{}")
3434

3535
class Meta:
3636
"""Meta data"""

0 commit comments

Comments
 (0)