pytype: import typing directly
First we no longer needs the pycompat layer, second having the types imported in
all case will allow to use them more directly in type annotation, something
important to upgrade the old "type comment" to proper type annotation.
A lot a stupid assert are needed to keep pyflakes happy. We should be able to
remove most of them once the type comment have been upgraded.
--- a/mercurial/branchmap.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/branchmap.py Wed Dec 20 12:51:20 2023 +0100
@@ -13,47 +13,50 @@
hex,
nullrev,
)
+
+from typing import (
+ Any,
+ Callable,
+ Dict,
+ Iterable,
+ List,
+ Optional,
+ Set,
+ TYPE_CHECKING,
+ Tuple,
+ Union,
+)
+
from . import (
encoding,
error,
obsolete,
- pycompat,
scmutil,
util,
)
+
from .utils import (
repoviewutil,
stringutil,
)
-if pycompat.TYPE_CHECKING:
- from typing import (
- Any,
- Callable,
- Dict,
- Iterable,
- List,
- Optional,
- Set,
- Tuple,
- Union,
- )
+# keeps pyflakes happy
+assert [
+ Any,
+ Callable,
+ Dict,
+ Iterable,
+ List,
+ Optional,
+ Set,
+ Tuple,
+ Union,
+]
+
+if TYPE_CHECKING:
from . import localrepo
- assert any(
- (
- Any,
- Callable,
- Dict,
- Iterable,
- List,
- Optional,
- Set,
- Tuple,
- Union,
- localrepo,
- )
- )
+ assert [localrepo]
subsettable = repoviewutil.subsettable
--- a/mercurial/cmdutil.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/cmdutil.py Wed Dec 20 12:51:20 2023 +0100
@@ -18,6 +18,7 @@
Dict,
Iterable,
Optional,
+ TYPE_CHECKING,
cast,
)
@@ -71,7 +72,7 @@
constants as revlog_constants,
)
-if pycompat.TYPE_CHECKING:
+if TYPE_CHECKING:
from . import (
ui as uimod,
)
--- a/mercurial/encoding.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/encoding.py Wed Dec 20 12:51:20 2023 +0100
@@ -9,8 +9,19 @@
import locale
import os
import re
+import typing
import unicodedata
+from typing import (
+ Any,
+ Callable,
+ List,
+ Text,
+ Type,
+ TypeVar,
+ Union,
+)
+
from . import (
error,
policy,
@@ -19,22 +30,11 @@
from .pure import charencode as charencodepure
-if pycompat.TYPE_CHECKING:
- from typing import (
- Any,
- Callable,
- List,
- Text,
- Type,
- TypeVar,
- Union,
- )
+# keep pyflakes happy
+for t in (Any, Callable, List, Text, Type, Union):
+ assert t
- # keep pyflakes happy
- for t in (Any, Callable, List, Text, Type, Union):
- assert t
-
- _Tlocalstr = TypeVar('_Tlocalstr', bound='localstr')
+_Tlocalstr = TypeVar('_Tlocalstr', bound='localstr')
charencode = policy.importmod('charencode')
@@ -131,7 +131,7 @@
s._utf8 = u
return s
- if pycompat.TYPE_CHECKING:
+ if typing.TYPE_CHECKING:
# pseudo implementation to help pytype see localstr() constructor
def __init__(self, u, l):
# type: (bytes, bytes) -> None
--- a/mercurial/error.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/error.py Wed Dec 20 12:51:20 2023 +0100
@@ -14,19 +14,30 @@
import difflib
+from typing import (
+ Any,
+ AnyStr,
+ Iterable,
+ List,
+ Optional,
+ Sequence,
+ Union,
+)
+
# Do not import anything but pycompat here, please
from . import pycompat
-if pycompat.TYPE_CHECKING:
- from typing import (
- Any,
- AnyStr,
- Iterable,
- List,
- Optional,
- Sequence,
- Union,
- )
+
+# keeps pyflakes happy
+assert [
+ Any,
+ AnyStr,
+ Iterable,
+ List,
+ Optional,
+ Sequence,
+ Union,
+]
def _tobytes(exc):
--- a/mercurial/i18n.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/i18n.py Wed Dec 20 12:51:20 2023 +0100
@@ -11,18 +11,22 @@
import os
import sys
+from typing import (
+ Callable,
+ List,
+)
+
from .utils import resourceutil
from . import (
encoding,
pycompat,
)
-if pycompat.TYPE_CHECKING:
- from typing import (
- Callable,
- List,
- )
-
+# keeps pyflakes happy
+assert [
+ Callable,
+ List,
+]
# modelled after templater.templatepath:
if getattr(sys, 'frozen', None) is not None:
--- a/mercurial/logcmdutil.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/logcmdutil.py Wed Dec 20 12:51:20 2023 +0100
@@ -10,6 +10,15 @@
import os
import posixpath
+from typing import (
+ Any,
+ Callable,
+ Dict,
+ Optional,
+ Sequence,
+ Tuple,
+)
+
from .i18n import _
from .node import wdirrev
@@ -39,19 +48,19 @@
stringutil,
)
+# keeps pyflakes happy
+assert [
+ Any,
+ Callable,
+ Dict,
+ Optional,
+ Sequence,
+ Tuple,
+]
-if pycompat.TYPE_CHECKING:
- from typing import (
- Any,
- Callable,
- Dict,
- Optional,
- Sequence,
- Tuple,
- )
-
- for t in (Any, Callable, Dict, Optional, Tuple):
- assert t
+# keep pyflakes happy
+for t in (Any, Callable, Dict, Optional, Tuple):
+ assert t
def getlimit(opts):
--- a/mercurial/mail.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/mail.py Wed Dec 20 12:51:20 2023 +0100
@@ -18,6 +18,13 @@
import socket
import time
+from typing import (
+ Any,
+ List,
+ Tuple,
+ Union,
+)
+
from .i18n import _
from .pycompat import (
open,
@@ -35,11 +42,14 @@
urlutil,
)
-if pycompat.TYPE_CHECKING:
- from typing import Any, List, Tuple, Union
- # keep pyflakes happy
- assert all((Any, List, Tuple, Union))
+# keep pyflakes happy
+assert [
+ Any,
+ List,
+ Tuple,
+ Union,
+]
class STARTTLS(smtplib.SMTP):
--- a/mercurial/pathutil.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/pathutil.py Wed Dec 20 12:51:20 2023 +0100
@@ -23,6 +23,14 @@
rustdirs = policy.importrust('dirstate', 'Dirs')
parsers = policy.importmod('parsers')
+# keeps pyflakes happy
+assert [
+ Any,
+ Callable,
+ Iterator,
+ Optional,
+]
+
def _lowerclean(s):
# type: (bytes) -> bytes
--- a/mercurial/phases.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/phases.py Wed Dec 20 12:51:20 2023 +0100
@@ -102,6 +102,18 @@
import struct
+import typing
+
+from typing import (
+ Any,
+ Callable,
+ Dict,
+ Iterable,
+ List,
+ Optional,
+ Set,
+ Tuple,
+)
from .i18n import _
from .node import (
@@ -120,23 +132,29 @@
util,
)
-if pycompat.TYPE_CHECKING:
- from typing import (
- Any,
- Callable,
- Dict,
- Iterable,
- List,
- Optional,
- Set,
- Tuple,
- )
+# keeps pyflakes happy
+assert [
+ Any,
+ Callable,
+ Dict,
+ Iterable,
+ List,
+ Optional,
+ Set,
+ Tuple,
+]
+
+Phaseroots = Dict[int, Set[bytes]]
+
+if typing.TYPE_CHECKING:
from . import (
localrepo,
ui as uimod,
)
- Phaseroots = Dict[int, Set[bytes]]
+ # keeps pyflakes happy
+ assert [uimod]
+
Phasedefaults = List[
Callable[[localrepo.localrepository, Phaseroots], Phaseroots]
]
--- a/mercurial/posix.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/posix.py Wed Dec 20 12:51:20 2023 +0100
@@ -70,13 +70,6 @@
removedirs = os.removedirs
if typing.TYPE_CHECKING:
- # Replace the various overloads that come along with aliasing stdlib methods
- # with the narrow definition that we care about in the type checking phase
- # only. This ensures that both Windows and POSIX see only the definition
- # that is actually available.
- #
- # Note that if we check pycompat.TYPE_CHECKING here, it is always False, and
- # the methods aren't replaced.
def normpath(path: bytes) -> bytes:
raise NotImplementedError
--- a/mercurial/scmposix.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/scmposix.py Wed Dec 20 12:51:20 2023 +0100
@@ -3,6 +3,7 @@
import fcntl
import os
import sys
+import typing
from typing import (
List,
@@ -15,7 +16,7 @@
util,
)
-if pycompat.TYPE_CHECKING:
+if typing.TYPE_CHECKING:
from . import ui as uimod
# BSD 'more' escapes ANSI color sequences by default. This can be disabled by
--- a/mercurial/scmwindows.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/scmwindows.py Wed Dec 20 12:51:20 2023 +0100
@@ -3,6 +3,7 @@
from typing import (
List,
+ TYPE_CHECKING,
Tuple,
)
@@ -13,7 +14,7 @@
win32,
)
-if pycompat.TYPE_CHECKING:
+if TYPE_CHECKING:
from . import ui as uimod
# MS-DOS 'more' is the only pager available by default on Windows.
--- a/mercurial/state.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/state.py Wed Dec 20 12:51:20 2023 +0100
@@ -20,23 +20,22 @@
import contextlib
+from typing import (
+ Any,
+ Dict,
+)
+
from .i18n import _
from . import (
error,
- pycompat,
util,
)
from .utils import cborutil
-if pycompat.TYPE_CHECKING:
- from typing import (
- Any,
- Dict,
- )
-
- for t in (Any, Dict):
- assert t
+# keeps pyflakes happy
+for t in (Any, Dict):
+ assert t
class cmdstate:
--- a/mercurial/subrepoutil.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/subrepoutil.py Wed Dec 20 12:51:20 2023 +0100
@@ -9,6 +9,16 @@
import os
import posixpath
import re
+import typing
+
+from typing import (
+ Any,
+ Dict,
+ List,
+ Optional,
+ Set,
+ Tuple,
+)
from .i18n import _
from . import (
@@ -17,7 +27,6 @@
filemerge,
pathutil,
phases,
- pycompat,
util,
)
from .utils import (
@@ -25,17 +34,19 @@
urlutil,
)
+# keeps pyflakes happy
+assert [
+ Any,
+ Dict,
+ List,
+ Optional,
+ Set,
+ Tuple,
+]
+
nullstate = (b'', b'', b'empty')
-if pycompat.TYPE_CHECKING:
- from typing import (
- Any,
- Dict,
- List,
- Optional,
- Set,
- Tuple,
- )
+if typing.TYPE_CHECKING:
from . import (
context,
localrepo,
@@ -45,7 +56,17 @@
ui as uimod,
)
- Substate = Dict[bytes, Tuple[bytes, bytes, bytes]]
+ # keeps pyflakes happy
+ assert [
+ context,
+ localrepo,
+ matchmod,
+ scmutil,
+ subrepo,
+ uimod,
+ ]
+
+Substate = Dict[bytes, Tuple[bytes, bytes, bytes]]
def state(ctx, ui):
--- a/mercurial/ui.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/ui.py Wed Dec 20 12:51:20 2023 +0100
@@ -18,6 +18,7 @@
import subprocess
import sys
import traceback
+import typing
from typing import (
Any,
@@ -1766,7 +1767,7 @@
return line
- if pycompat.TYPE_CHECKING:
+ if typing.TYPE_CHECKING:
@overload
def prompt(self, msg: bytes, default: bytes) -> bytes:
@@ -1782,7 +1783,7 @@
"""
return self._prompt(msg, default=default)
- if pycompat.TYPE_CHECKING:
+ if typing.TYPE_CHECKING:
@overload
def _prompt(
--- a/mercurial/upgrade_utils/actions.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/upgrade_utils/actions.py Wed Dec 20 12:51:20 2023 +0100
@@ -7,11 +7,15 @@
import random
+from typing import (
+ List,
+ Type,
+)
+
from ..i18n import _
from .. import (
error,
localrepo,
- pycompat,
requirements,
revlog,
util,
@@ -19,12 +23,11 @@
from ..utils import compression
-if pycompat.TYPE_CHECKING:
- from typing import (
- List,
- Type,
- )
-
+# keeps pyflakes happy
+assert [
+ List,
+ Type,
+]
# list of requirements that request a clone of all revlog if added/removed
RECLONES_REQUIREMENTS = {
--- a/mercurial/util.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/util.py Wed Dec 20 12:51:20 2023 +0100
@@ -34,6 +34,14 @@
import traceback
import warnings
+from typing import (
+ Iterable,
+ Iterator,
+ List,
+ Optional,
+ Tuple,
+)
+
from .node import hex
from .thirdparty import attr
from .pycompat import (
@@ -55,14 +63,14 @@
stringutil,
)
-if pycompat.TYPE_CHECKING:
- from typing import (
- Iterable,
- Iterator,
- List,
- Optional,
- Tuple,
- )
+# keeps pyflakes happy
+assert [
+ Iterable,
+ Iterator,
+ List,
+ Optional,
+ Tuple,
+]
base85 = policy.importmod('base85')
--- a/mercurial/utils/dateutil.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/utils/dateutil.py Wed Dec 20 12:51:20 2023 +0100
@@ -10,6 +10,15 @@
import datetime
import time
+from typing import (
+ Callable,
+ Dict,
+ Iterable,
+ Optional,
+ Tuple,
+ Union,
+)
+
from ..i18n import _
from .. import (
encoding,
@@ -17,17 +26,17 @@
pycompat,
)
-if pycompat.TYPE_CHECKING:
- from typing import (
- Callable,
- Dict,
- Iterable,
- Optional,
- Tuple,
- Union,
- )
+# keeps pyflakes happy
+assert [
+ Callable,
+ Dict,
+ Iterable,
+ Optional,
+ Tuple,
+ Union,
+]
- hgdate = Tuple[float, int] # (unixtime, offset)
+hgdate = Tuple[float, int] # (unixtime, offset)
# used by parsedate
defaultdateformats = (
--- a/mercurial/utils/urlutil.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/utils/urlutil.py Wed Dec 20 12:51:20 2023 +0100
@@ -8,6 +8,10 @@
import re as remod
import socket
+from typing import (
+ Union,
+)
+
from ..i18n import _
from .. import (
encoding,
@@ -24,11 +28,8 @@
constants as revlog_constants,
)
-
-if pycompat.TYPE_CHECKING:
- from typing import (
- Union,
- )
+# keeps pyflakes happy
+assert [Union]
urlreq = urllibcompat.urlreq
--- a/mercurial/windows.py Wed Nov 08 01:58:16 2023 +0100
+++ b/mercurial/windows.py Wed Dec 20 12:51:20 2023 +0100
@@ -61,13 +61,7 @@
unlink = win32.unlink
if typing.TYPE_CHECKING:
- # Replace the various overloads that come along with aliasing stdlib methods
- # with the narrow definition that we care about in the type checking phase
- # only. This ensures that both Windows and POSIX see only the definition
- # that is actually available.
- #
- # Note that if we check pycompat.TYPE_CHECKING here, it is always False, and
- # the methods aren't replaced.
+
def split(p: bytes) -> Tuple[bytes, bytes]:
raise NotImplementedError