88from dataclasses import dataclass
99from functools import cached_property
1010from pathlib import Path
11- from typing import TypedDict
11+ from typing import TypedDict , Optional
1212
1313import requests
1414from typing_extensions import NotRequired
@@ -132,12 +132,13 @@ def parse_version_string(cls, value: str) -> tuple[str, str, str]:
132132 return match_result .group (1 ), match_result .group (2 ), match_result .group (3 )
133133
134134 @classmethod
135- def init_frontend_unsafe (cls , version_string : str ) -> str :
135+ def init_frontend_unsafe (cls , version_string : str , provider : Optional [ FrontEndProvider ] = None ) -> str :
136136 """
137137 Initializes the frontend for the specified version.
138138
139139 Args:
140140 version_string (str): The version string.
141+ provider (FrontEndProvider, optional): The provider to use. Defaults to None.
141142
142143 Returns:
143144 str: The path to the initialized frontend.
@@ -150,23 +151,29 @@ def init_frontend_unsafe(cls, version_string: str) -> str:
150151 return cls .DEFAULT_FRONTEND_PATH
151152
152153 repo_owner , repo_name , version = cls .parse_version_string (version_string )
153- provider = FrontEndProvider (repo_owner , repo_name )
154+ provider = provider or FrontEndProvider (repo_owner , repo_name )
154155 release = provider .get_release (version )
155156
156157 semantic_version = release ["tag_name" ].lstrip ("v" )
157158 web_root = str (
158159 Path (cls .CUSTOM_FRONTENDS_ROOT ) / provider .folder_name / semantic_version
159160 )
160161 if not os .path .exists (web_root ):
161- os .makedirs (web_root , exist_ok = True )
162- logging .info (
163- "Downloading frontend(%s) version(%s) to (%s)" ,
164- provider .folder_name ,
165- semantic_version ,
166- web_root ,
167- )
168- logging .debug (release )
169- download_release_asset_zip (release , destination_path = web_root )
162+ try :
163+ os .makedirs (web_root , exist_ok = True )
164+ logging .info (
165+ "Downloading frontend(%s) version(%s) to (%s)" ,
166+ provider .folder_name ,
167+ semantic_version ,
168+ web_root ,
169+ )
170+ logging .debug (release )
171+ download_release_asset_zip (release , destination_path = web_root )
172+ finally :
173+ # Clean up the directory if it is empty, i.e. the download failed
174+ if not os .listdir (web_root ):
175+ os .rmdir (web_root )
176+
170177 return web_root
171178
172179 @classmethod
0 commit comments