44import io
55import os
66import random
7+ import zipfile
78from base64 import b64encode
89from binascii import hexlify
910from 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
0 commit comments