@@ -434,15 +434,16 @@ def _val(self) -> SplitURL:
434
434
return (self ._scheme , self ._netloc , self ._path , self ._query , self ._fragment )
435
435
436
436
@classmethod
437
- def _from_tup (cls , val : SplitURL ) -> "URL" :
438
- """Create a new URL from a tuple.
439
-
440
- The tuple should be in the form of a SplitURL.
441
-
442
- (scheme, netloc, path, query, fragment)
443
- """
437
+ def _from_parts (
438
+ cls , scheme : str , netloc : str , path : str , query : str , fragment : str
439
+ ) -> "URL" :
440
+ """Create a new URL from parts."""
444
441
self = object .__new__ (cls )
445
- self ._scheme , self ._netloc , self ._path , self ._query , self ._fragment = val
442
+ self ._scheme = scheme
443
+ self ._netloc = netloc
444
+ self ._path = path
445
+ self ._query = query
446
+ self ._fragment = fragment
446
447
self ._cache = {}
447
448
return self
448
449
@@ -592,7 +593,7 @@ def _origin(self) -> "URL":
592
593
netloc = make_netloc (None , None , encoded_host , self .explicit_port )
593
594
elif not self ._path and not self ._query and not self ._fragment :
594
595
return self
595
- return self ._from_tup (( scheme , netloc , "" , "" , "" ) )
596
+ return self ._from_parts ( scheme , netloc , "" , "" , "" )
596
597
597
598
def relative (self ) -> "URL" :
598
599
"""Return a relative part of the URL.
@@ -602,7 +603,7 @@ def relative(self) -> "URL":
602
603
"""
603
604
if not self ._netloc :
604
605
raise ValueError ("URL should be absolute" )
605
- return self ._from_tup (( "" , "" , self ._path , self ._query , self ._fragment ) )
606
+ return self ._from_parts ( "" , "" , self ._path , self ._query , self ._fragment )
606
607
607
608
@cached_property
608
609
def absolute (self ) -> bool :
@@ -924,11 +925,11 @@ def parent(self) -> "URL":
924
925
path = self ._path
925
926
if not path or path == "/" :
926
927
if self ._fragment or self ._query :
927
- return self ._from_tup (( self ._scheme , self ._netloc , path , "" , "" ) )
928
+ return self ._from_parts ( self ._scheme , self ._netloc , path , "" , "" )
928
929
return self
929
930
parts = path .split ("/" )
930
- return self ._from_tup (
931
- ( self ._scheme , self ._netloc , "/" .join (parts [:- 1 ]), "" , "" )
931
+ return self ._from_parts (
932
+ self ._scheme , self ._netloc , "/" .join (parts [:- 1 ]), "" , ""
932
933
)
933
934
934
935
@cached_property
@@ -1012,7 +1013,7 @@ def _make_child(self, paths: "Sequence[str]", encoded: bool = False) -> "URL":
1012
1013
1013
1014
new_path = "/" .join (parsed )
1014
1015
1015
- return self ._from_tup (( self ._scheme , netloc , new_path , "" , "" ) )
1016
+ return self ._from_parts ( self ._scheme , netloc , new_path , "" , "" )
1016
1017
1017
1018
def with_scheme (self , scheme : str ) -> "URL" :
1018
1019
"""Return a new URL with scheme replaced."""
@@ -1027,8 +1028,8 @@ def with_scheme(self, scheme: str) -> "URL":
1027
1028
f"relative URLs for the { lower_scheme } scheme"
1028
1029
)
1029
1030
raise ValueError (msg )
1030
- return self ._from_tup (
1031
- ( lower_scheme , netloc , self ._path , self ._query , self ._fragment )
1031
+ return self ._from_parts (
1032
+ lower_scheme , netloc , self ._path , self ._query , self ._fragment
1032
1033
)
1033
1034
1034
1035
def with_user (self , user : Union [str , None ]) -> "URL" :
@@ -1051,8 +1052,8 @@ def with_user(self, user: Union[str, None]) -> "URL":
1051
1052
raise ValueError ("user replacement is not allowed for relative URLs" )
1052
1053
encoded_host = self .host_subcomponent or ""
1053
1054
netloc = make_netloc (user , password , encoded_host , self .explicit_port )
1054
- return self ._from_tup (
1055
- ( self ._scheme , netloc , self ._path , self ._query , self ._fragment )
1055
+ return self ._from_parts (
1056
+ self ._scheme , netloc , self ._path , self ._query , self ._fragment
1056
1057
)
1057
1058
1058
1059
def with_password (self , password : Union [str , None ]) -> "URL" :
@@ -1075,8 +1076,8 @@ def with_password(self, password: Union[str, None]) -> "URL":
1075
1076
encoded_host = self .host_subcomponent or ""
1076
1077
port = self .explicit_port
1077
1078
netloc = make_netloc (self .raw_user , password , encoded_host , port )
1078
- return self ._from_tup (
1079
- ( self ._scheme , netloc , self ._path , self ._query , self ._fragment )
1079
+ return self ._from_parts (
1080
+ self ._scheme , netloc , self ._path , self ._query , self ._fragment
1080
1081
)
1081
1082
1082
1083
def with_host (self , host : str ) -> "URL" :
@@ -1098,8 +1099,8 @@ def with_host(self, host: str) -> "URL":
1098
1099
encoded_host = _encode_host (host , validate_host = True ) if host else ""
1099
1100
port = self .explicit_port
1100
1101
netloc = make_netloc (self .raw_user , self .raw_password , encoded_host , port )
1101
- return self ._from_tup (
1102
- ( self ._scheme , netloc , self ._path , self ._query , self ._fragment )
1102
+ return self ._from_parts (
1103
+ self ._scheme , netloc , self ._path , self ._query , self ._fragment
1103
1104
)
1104
1105
1105
1106
def with_port (self , port : Union [int , None ]) -> "URL" :
@@ -1118,8 +1119,8 @@ def with_port(self, port: Union[int, None]) -> "URL":
1118
1119
raise ValueError ("port replacement is not allowed for relative URLs" )
1119
1120
encoded_host = self .host_subcomponent or ""
1120
1121
netloc = make_netloc (self .raw_user , self .raw_password , encoded_host , port )
1121
- return self ._from_tup (
1122
- ( self ._scheme , netloc , self ._path , self ._query , self ._fragment )
1122
+ return self ._from_parts (
1123
+ self ._scheme , netloc , self ._path , self ._query , self ._fragment
1123
1124
)
1124
1125
1125
1126
def with_path (self , path : str , * , encoded : bool = False ) -> "URL" :
@@ -1131,7 +1132,7 @@ def with_path(self, path: str, *, encoded: bool = False) -> "URL":
1131
1132
path = normalize_path (path ) if "." in path else path
1132
1133
if path and path [0 ] != "/" :
1133
1134
path = f"/{ path } "
1134
- return self ._from_tup (( self ._scheme , netloc , path , "" , "" ) )
1135
+ return self ._from_parts ( self ._scheme , netloc , path , "" , "" )
1135
1136
1136
1137
@overload
1137
1138
def with_query (self , query : Query ) -> "URL" : ...
@@ -1154,8 +1155,8 @@ def with_query(self, *args: Any, **kwargs: Any) -> "URL":
1154
1155
"""
1155
1156
# N.B. doesn't cleanup query/fragment
1156
1157
query = get_str_query (* args , ** kwargs ) or ""
1157
- return self ._from_tup (
1158
- ( self ._scheme , self ._netloc , self ._path , query , self ._fragment )
1158
+ return self ._from_parts (
1159
+ self ._scheme , self ._netloc , self ._path , query , self ._fragment
1159
1160
)
1160
1161
1161
1162
@overload
@@ -1182,8 +1183,8 @@ def extend_query(self, *args: Any, **kwargs: Any) -> "URL":
1182
1183
query += new_query if query [- 1 ] == "&" else f"&{ new_query } "
1183
1184
else :
1184
1185
query = new_query
1185
- return self ._from_tup (
1186
- ( self ._scheme , self ._netloc , self ._path , query , self ._fragment )
1186
+ return self ._from_parts (
1187
+ self ._scheme , self ._netloc , self ._path , query , self ._fragment
1187
1188
)
1188
1189
1189
1190
@overload
@@ -1241,8 +1242,8 @@ def update_query(self, *args: Any, **kwargs: Any) -> "URL":
1241
1242
"Invalid query type: only str, mapping or "
1242
1243
"sequence of (key, value) pairs is allowed"
1243
1244
)
1244
- return self ._from_tup (
1245
- ( self ._scheme , self ._netloc , self ._path , query , self ._fragment )
1245
+ return self ._from_parts (
1246
+ self ._scheme , self ._netloc , self ._path , query , self ._fragment
1246
1247
)
1247
1248
1248
1249
def without_query_params (self , * query_params : str ) -> "URL" :
@@ -1275,8 +1276,8 @@ def with_fragment(self, fragment: Union[str, None]) -> "URL":
1275
1276
raw_fragment = FRAGMENT_QUOTER (fragment )
1276
1277
if self ._fragment == raw_fragment :
1277
1278
return self
1278
- return self ._from_tup (
1279
- ( self ._scheme , self ._netloc , self ._path , self ._query , raw_fragment )
1279
+ return self ._from_parts (
1280
+ self ._scheme , self ._netloc , self ._path , self ._query , raw_fragment
1280
1281
)
1281
1282
1282
1283
def with_name (self , name : str ) -> "URL" :
@@ -1307,7 +1308,7 @@ def with_name(self, name: str) -> "URL":
1307
1308
parts [- 1 ] = name
1308
1309
if parts [0 ] == "/" :
1309
1310
parts [0 ] = "" # replace leading '/'
1310
- return self ._from_tup (( scheme , netloc , "/" .join (parts ), "" , "" ) )
1311
+ return self ._from_parts ( scheme , netloc , "/" .join (parts ), "" , "" )
1311
1312
1312
1313
def with_suffix (self , suffix : str ) -> "URL" :
1313
1314
"""Return a new URL with suffix (file extension of name) replaced.
@@ -1357,8 +1358,8 @@ def join(self, url: "URL") -> "URL":
1357
1358
1358
1359
# scheme is in uses_authority as uses_authority is a superset of uses_relative
1359
1360
if join_netloc and scheme in USES_AUTHORITY :
1360
- return self ._from_tup (
1361
- ( scheme , join_netloc , join_path , join_query , join_fragment )
1361
+ return self ._from_parts (
1362
+ scheme , join_netloc , join_path , join_query , join_fragment
1362
1363
)
1363
1364
1364
1365
fragment = join_fragment if join_path or join_fragment else orig_fragment
0 commit comments