Skip to content

Commit 83e3549

Browse files
committed
Add Python 3.15 urllib.parse updates
1 parent 29bffca commit 83e3549

2 files changed

Lines changed: 250 additions & 36 deletions

File tree

stdlib/@tests/stubtest_allowlists/py315.txt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -420,14 +420,6 @@ unicodedata.isxidstart
420420
unicodedata.iter_graphemes
421421
unittest._log._AssertLogsContext.__init__
422422
unittest.case.TestCase.assertLogs
423-
urllib.parse._DefragResultBase.geturl
424-
urllib.parse._ParseResultBase.geturl
425-
urllib.parse._SplitResultBase.geturl
426-
urllib.parse.urldefrag
427-
urllib.parse.urlparse
428-
urllib.parse.urlsplit
429-
urllib.parse.urlunparse
430-
urllib.parse.urlunsplit
431423
warnings.WarningMessage.__init__
432424
wave.WAVE_FORMAT_EXTENSIBLE
433425
wave.WAVE_FORMAT_IEEE_FLOAT

stdlib/urllib/parse.pyi

Lines changed: 250 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import sys
2+
from _typeshed import Incomplete
23
from collections.abc import Iterable, Mapping, Sequence
34
from types import GenericAlias
45
from typing import Any, AnyStr, Final, Generic, Literal, NamedTuple, Protocol, TypeAlias, overload, type_check_only
@@ -63,24 +64,52 @@ class _NetlocResultMixinStr(_NetlocResultMixinBase[str], _ResultMixinStr):
6364
class _NetlocResultMixinBytes(_NetlocResultMixinBase[bytes], _ResultMixinBytes):
6465
__slots__ = ()
6566

66-
class _DefragResultBase(NamedTuple, Generic[AnyStr]):
67-
url: AnyStr
68-
fragment: AnyStr
69-
70-
class _SplitResultBase(NamedTuple, Generic[AnyStr]):
71-
scheme: AnyStr
72-
netloc: AnyStr
73-
path: AnyStr
74-
query: AnyStr
75-
fragment: AnyStr
76-
77-
class _ParseResultBase(NamedTuple, Generic[AnyStr]):
78-
scheme: AnyStr
79-
netloc: AnyStr
80-
path: AnyStr
81-
params: AnyStr
82-
query: AnyStr
83-
fragment: AnyStr
67+
if sys.version_info >= (3, 15):
68+
class _DefragResultBase(NamedTuple, Generic[AnyStr]):
69+
url: AnyStr
70+
fragment: AnyStr
71+
def geturl(self) -> AnyStr: ... # type: ignore[misc]
72+
73+
else:
74+
class _DefragResultBase(NamedTuple, Generic[AnyStr]):
75+
url: AnyStr
76+
fragment: AnyStr
77+
78+
if sys.version_info >= (3, 15):
79+
class _SplitResultBase(NamedTuple, Generic[AnyStr]):
80+
scheme: AnyStr
81+
netloc: AnyStr
82+
path: AnyStr
83+
query: AnyStr
84+
fragment: AnyStr
85+
def geturl(self) -> AnyStr: ... # type: ignore[misc]
86+
87+
else:
88+
class _SplitResultBase(NamedTuple, Generic[AnyStr]):
89+
scheme: AnyStr
90+
netloc: AnyStr
91+
path: AnyStr
92+
query: AnyStr
93+
fragment: AnyStr
94+
95+
if sys.version_info >= (3, 15):
96+
class _ParseResultBase(NamedTuple, Generic[AnyStr]):
97+
scheme: AnyStr
98+
netloc: AnyStr
99+
path: AnyStr
100+
params: AnyStr
101+
query: AnyStr
102+
fragment: AnyStr
103+
def geturl(self) -> AnyStr: ... # type: ignore[misc]
104+
105+
else:
106+
class _ParseResultBase(NamedTuple, Generic[AnyStr]):
107+
scheme: AnyStr
108+
netloc: AnyStr
109+
path: AnyStr
110+
params: AnyStr
111+
query: AnyStr
112+
fragment: AnyStr
84113

85114
# Structured result objects for string data
86115
class DefragResult(_DefragResultBase[str], _ResultMixinStr):
@@ -102,6 +131,95 @@ class SplitResultBytes(_SplitResultBase[bytes], _NetlocResultMixinBytes):
102131
class ParseResultBytes(_ParseResultBase[bytes], _NetlocResultMixinBytes):
103132
def geturl(self) -> bytes: ...
104133

134+
if sys.version_info >= (3, 15):
135+
@type_check_only
136+
class DefragResultMaybeNone(NamedTuple):
137+
url: str
138+
fragment: str | None
139+
def encode(self, encoding: str = "ascii", errors: str = "strict") -> DefragResultBytesMaybeNone: ...
140+
def geturl(self) -> str: ...
141+
142+
@type_check_only
143+
class SplitResultMaybeNone(NamedTuple):
144+
scheme: str | None
145+
netloc: str | None
146+
path: str
147+
query: str | None
148+
fragment: str | None
149+
@property
150+
def username(self) -> str | None: ...
151+
@property
152+
def password(self) -> str | None: ...
153+
@property
154+
def hostname(self) -> str | None: ...
155+
@property
156+
def port(self) -> int | None: ...
157+
def encode(self, encoding: str = "ascii", errors: str = "strict") -> SplitResultBytesMaybeNone: ...
158+
def geturl(self) -> str: ...
159+
160+
@type_check_only
161+
class ParseResultMaybeNone(NamedTuple):
162+
scheme: str | None
163+
netloc: str | None
164+
path: str
165+
params: str | None
166+
query: str | None
167+
fragment: str | None
168+
@property
169+
def username(self) -> str | None: ...
170+
@property
171+
def password(self) -> str | None: ...
172+
@property
173+
def hostname(self) -> str | None: ...
174+
@property
175+
def port(self) -> int | None: ...
176+
def encode(self, encoding: str = "ascii", errors: str = "strict") -> ParseResultBytesMaybeNone: ...
177+
def geturl(self) -> str: ...
178+
179+
@type_check_only
180+
class DefragResultBytesMaybeNone(NamedTuple):
181+
url: bytes
182+
fragment: bytes | None
183+
def decode(self, encoding: str = "ascii", errors: str = "strict") -> DefragResultMaybeNone: ...
184+
def geturl(self) -> bytes: ...
185+
186+
@type_check_only
187+
class SplitResultBytesMaybeNone(NamedTuple):
188+
scheme: bytes | None
189+
netloc: bytes | None
190+
path: bytes
191+
query: bytes | None
192+
fragment: bytes | None
193+
@property
194+
def username(self) -> bytes | None: ...
195+
@property
196+
def password(self) -> bytes | None: ...
197+
@property
198+
def hostname(self) -> bytes | None: ...
199+
@property
200+
def port(self) -> int | None: ...
201+
def decode(self, encoding: str = "ascii", errors: str = "strict") -> SplitResultMaybeNone: ...
202+
def geturl(self) -> bytes: ...
203+
204+
@type_check_only
205+
class ParseResultBytesMaybeNone(NamedTuple):
206+
scheme: bytes | None
207+
netloc: bytes | None
208+
path: bytes
209+
params: bytes | None
210+
query: bytes | None
211+
fragment: bytes | None
212+
@property
213+
def username(self) -> bytes | None: ...
214+
@property
215+
def password(self) -> bytes | None: ...
216+
@property
217+
def hostname(self) -> bytes | None: ...
218+
@property
219+
def port(self) -> int | None: ...
220+
def decode(self, encoding: str = "ascii", errors: str = "strict") -> ParseResultMaybeNone: ...
221+
def geturl(self) -> bytes: ...
222+
105223
def parse_qs(
106224
qs: AnyStr | None,
107225
keep_blank_values: bool = False,
@@ -137,6 +255,20 @@ def urldefrag(url: str) -> DefragResult: ...
137255
@overload
138256
def urldefrag(url: bytes | bytearray | None) -> DefragResultBytes: ...
139257

258+
if sys.version_info >= (3, 15):
259+
@overload
260+
def urldefrag(url: str, *, missing_as_none: Literal[True]) -> DefragResultMaybeNone: ...
261+
@overload
262+
def urldefrag(url: str, *, missing_as_none: Literal[False] = False) -> DefragResult: ...
263+
@overload
264+
def urldefrag(url: bytes | bytearray | None, *, missing_as_none: Literal[True]) -> DefragResultBytesMaybeNone: ...
265+
@overload
266+
def urldefrag(url: bytes | bytearray | None, *, missing_as_none: Literal[False] = False) -> DefragResultBytes: ...
267+
@overload
268+
def urldefrag(url: str, *, missing_as_none: bool) -> DefragResult | DefragResultMaybeNone: ...
269+
@overload
270+
def urldefrag(url: bytes | bytearray | None, *, missing_as_none: bool) -> DefragResultBytes | DefragResultBytesMaybeNone: ...
271+
140272
# The values are passed through `str()` (unless they are bytes), so anything is valid.
141273
_QueryType: TypeAlias = (
142274
Mapping[str, object]
@@ -171,6 +303,45 @@ def urlparse(url: str, scheme: str = "", allow_fragments: bool = True) -> ParseR
171303
def urlparse(
172304
url: bytes | bytearray | None, scheme: bytes | bytearray | None | Literal[""] = "", allow_fragments: bool = True
173305
) -> ParseResultBytes: ...
306+
307+
if sys.version_info >= (3, 15):
308+
@overload
309+
def urlparse(
310+
url: str, scheme: str = "", allow_fragments: bool = True, *, missing_as_none: Literal[True]
311+
) -> ParseResultMaybeNone: ...
312+
@overload
313+
def urlparse(
314+
url: str, scheme: str = "", allow_fragments: bool = True, *, missing_as_none: Literal[False] = False
315+
) -> ParseResult: ...
316+
@overload
317+
def urlparse(
318+
url: bytes | bytearray | None,
319+
scheme: bytes | bytearray | None | Literal[""] = "",
320+
allow_fragments: bool = True,
321+
*,
322+
missing_as_none: Literal[True],
323+
) -> ParseResultBytesMaybeNone: ...
324+
@overload
325+
def urlparse(
326+
url: bytes | bytearray | None,
327+
scheme: bytes | bytearray | None | Literal[""] = "",
328+
allow_fragments: bool = True,
329+
*,
330+
missing_as_none: Literal[False] = False,
331+
) -> ParseResultBytes: ...
332+
@overload
333+
def urlparse(
334+
url: str, scheme: str = "", allow_fragments: bool = True, *, missing_as_none: bool
335+
) -> ParseResult | ParseResultMaybeNone: ...
336+
@overload
337+
def urlparse(
338+
url: bytes | bytearray | None,
339+
scheme: bytes | bytearray | None | Literal[""] = "",
340+
allow_fragments: bool = True,
341+
*,
342+
missing_as_none: bool,
343+
) -> ParseResultBytes | ParseResultBytesMaybeNone: ...
344+
174345
@overload
175346
def urlsplit(url: str, scheme: str = "", allow_fragments: bool = True) -> SplitResult: ...
176347

@@ -186,15 +357,66 @@ else:
186357
url: bytes | bytearray | None, scheme: bytes | bytearray | None | Literal[""] = "", allow_fragments: bool = True
187358
) -> SplitResultBytes: ...
188359

189-
# Requires an iterable of length 6
190-
@overload
191-
def urlunparse(components: Iterable[None]) -> Literal[b""]: ... # type: ignore[overload-overlap]
192-
@overload
193-
def urlunparse(components: Iterable[AnyStr | None]) -> AnyStr: ...
360+
if sys.version_info >= (3, 15):
361+
@overload
362+
def urlsplit(
363+
url: str, scheme: str = "", allow_fragments: bool = True, *, missing_as_none: Literal[True]
364+
) -> SplitResultMaybeNone: ...
365+
@overload
366+
def urlsplit(
367+
url: str, scheme: str = "", allow_fragments: bool = True, *, missing_as_none: Literal[False] = False
368+
) -> SplitResult: ...
369+
@overload
370+
def urlsplit(
371+
url: bytes | None,
372+
scheme: bytes | None | Literal[""] = "",
373+
allow_fragments: bool = True,
374+
*,
375+
missing_as_none: Literal[True],
376+
) -> SplitResultBytesMaybeNone: ...
377+
@overload
378+
def urlsplit(
379+
url: bytes | None,
380+
scheme: bytes | None | Literal[""] = "",
381+
allow_fragments: bool = True,
382+
*,
383+
missing_as_none: Literal[False] = False,
384+
) -> SplitResultBytes: ...
385+
@overload
386+
def urlsplit(
387+
url: str, scheme: str = "", allow_fragments: bool = True, *, missing_as_none: bool
388+
) -> SplitResult | SplitResultMaybeNone: ...
389+
@overload
390+
def urlsplit(
391+
url: bytes | None, scheme: bytes | None | Literal[""] = "", allow_fragments: bool = True, *, missing_as_none: bool
392+
) -> SplitResultBytes | SplitResultBytesMaybeNone: ...
393+
394+
if sys.version_info >= (3, 15):
395+
# Requires an iterable of length 6
396+
@overload
397+
def urlunparse(components: Iterable[None], *, keep_empty: bool | None | Incomplete = ...) -> Literal[b""]: ... # type: ignore[overload-overlap]
398+
@overload
399+
def urlunparse(components: Iterable[AnyStr | None], *, keep_empty: bool | None | Incomplete = ...) -> AnyStr: ...
400+
401+
else:
402+
# Requires an iterable of length 6
403+
@overload
404+
def urlunparse(components: Iterable[None]) -> Literal[b""]: ... # type: ignore[overload-overlap]
405+
@overload
406+
def urlunparse(components: Iterable[AnyStr | None]) -> AnyStr: ...
407+
408+
if sys.version_info >= (3, 15):
409+
# Requires an iterable of length 5
410+
@overload
411+
def urlunsplit(components: Iterable[None], *, keep_empty: bool | None | Incomplete = ...) -> Literal[b""]: ... # type: ignore[overload-overlap]
412+
@overload
413+
def urlunsplit(components: Iterable[AnyStr | None], *, keep_empty: bool | None | Incomplete = ...) -> AnyStr: ...
414+
415+
else:
416+
# Requires an iterable of length 5
417+
@overload
418+
def urlunsplit(components: Iterable[None]) -> Literal[b""]: ... # type: ignore[overload-overlap]
419+
@overload
420+
def urlunsplit(components: Iterable[AnyStr | None]) -> AnyStr: ...
194421

195-
# Requires an iterable of length 5
196-
@overload
197-
def urlunsplit(components: Iterable[None]) -> Literal[b""]: ... # type: ignore[overload-overlap]
198-
@overload
199-
def urlunsplit(components: Iterable[AnyStr | None]) -> AnyStr: ...
200422
def unwrap(url: str) -> str: ...

0 commit comments

Comments
 (0)