Mercurial > public > mercurial-scm > hg-stable
diff mercurial/interfaces/misc.py @ 52907:ba343f763595
typing: add an interface for url
This is fairly simple. This is a dependency for the "path" class in the same
module, that is itself imported by `mercurial.interfaces.repository`. So we get
it out of the way first.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 10 Feb 2025 00:15:22 +0100 |
parents | bde94bd8e8a2 |
children | 180591a9a6a1 |
line wrap: on
line diff
--- a/mercurial/interfaces/misc.py Sat Feb 08 18:15:18 2025 +0100 +++ b/mercurial/interfaces/misc.py Mon Feb 10 00:15:22 2025 +0100 @@ -9,7 +9,9 @@ Callable, Iterator, List, + Optional, Protocol, + Tuple, ) @@ -45,3 +47,64 @@ @abc.abstractmethod def __contains__(self, d: bytes) -> bool: ... + + +AuthInfoT = Tuple[ + bytes, + Optional[ + Tuple[ + None, + Tuple[bytes, bytes], + bytes, + bytes, + ] + ], +] + + +class IUrl(Protocol): + r"""Reliable URL parser. + + This parses URLs and provides attributes for the following + components: + + <scheme>://<user>:<passwd>@<host>:<port>/<path>?<query>#<fragment> + + Missing components are set to None. The only exception is + fragment, which is set to '' if present but empty. + + If parsefragment is False, fragment is included in query. If + parsequery is False, query is included in path. If both are + False, both fragment and query are included in path. + + See http://www.ietf.org/rfc/rfc2396.txt for more information. + """ + + path: Optional[bytes] + scheme: Optional[bytes] + user: Optional[bytes] + passwd: Optional[bytes] + host: Optional[bytes] + port: Optional[bytes] + query: Optional[bytes] + fragment: Optional[bytes] + + @abc.abstractmethod + def copy(self) -> IUrl: + ... + + @abc.abstractmethod + def authinfo(self) -> AuthInfoT: + ... + + @abc.abstractmethod + def isabs(self) -> bool: + ... + + @abc.abstractmethod + def localpath(self) -> bytes: + ... + + @abc.abstractmethod + def islocal(self) -> bool: + ...