66
77
88class UrlBuilder :
9+ """Builds backend and frontend URLs for the CLI."""
10+
911 def __init__ (self , backend_url : str , frontend_url : str ) -> None :
12+ """Create a URL builder from base backend and frontend URLs."""
1013 self ._backend_url = self .__ensure_scheme (backend_url )
1114 self ._frontend_url = self .__ensure_scheme (frontend_url )
1215
1316 @staticmethod
1417 def __ensure_scheme (url : str ) -> str :
18+ """Ensure the URL includes a scheme."""
1519 if not urlparse (url ).scheme :
1620 return "https://" + url .lstrip ("/" )
1721 return url
1822
1923 @staticmethod
2024 def __ensure_trailing_slash (url : str ) -> str :
25+ """Ensure the URL ends with a trailing slash."""
2126 if not url .endswith ("/" ):
2227 return url + "/"
2328 return url
2429
2530 @classmethod
2631 def resolve (cls , initial_url : str | None = None ) -> "UrlBuilder" :
32+ """Resolve URLs from input, settings, or interactive prompts."""
2733 url_candidate = initial_url or settings .INSTANCE_URL
2834
2935 if url_candidate :
@@ -46,22 +52,28 @@ def resolve(cls, initial_url: str | None = None) -> "UrlBuilder":
4652
4753 @property
4854 def backend_url (self ) -> str :
55+ """Return the normalized backend base URL."""
4956 return self .__ensure_trailing_slash (self ._backend_url )
5057
5158 @property
5259 def frontend_url (self ) -> str :
60+ """Return the normalized frontend base URL."""
5361 return self .__ensure_trailing_slash (self ._frontend_url )
5462
5563 def upload_url (self ) -> str :
64+ """Return the upload endpoint URL."""
5665 return urljoin (self .backend_url , "upload" )
5766
5867 def config_url (self ) -> str :
68+ """Return the config endpoint URL."""
5969 return urljoin (self .backend_url , "config" )
6070
6171 def download_url (self ) -> str :
72+ """Return the download endpoint base URL."""
6273 return urljoin (self .backend_url , "download/" )
6374
6475 def share_url (self , slug : str , key_secret : str ) -> str :
76+ """Build a shareable frontend URL including the key fragment."""
6577 # urljoin handles the path joining
6678 base_share = urljoin (self .frontend_url , f"download/{ slug } " )
6779 return f"{ base_share } #{ key_secret } "
0 commit comments