# HG changeset patch # User Matt Harbison # Date 1721509410 14400 # Node ID a3dc962cac6224939f6aedb3050e88d593e6085f # Parent 9367571fea21d88506624cd15da4e1474715007f typing: add type hints to `mercurial.policy` Mostly trivial, but this seems like the logical module to use to inject the hints from `cext`, `pure`, etc, given that this file has the fallback policy. This is a first step. There doesn't appear to be a predefined type for a module in py3.7, so those are omitted for now. diff -r 9367571fea21 -r a3dc962cac62 mercurial/policy.py --- a/mercurial/policy.py Sat Jul 20 01:55:09 2024 -0400 +++ b/mercurial/policy.py Sat Jul 20 17:03:30 2024 -0400 @@ -8,6 +8,14 @@ import os import sys +import typing + +if typing.TYPE_CHECKING: + from typing import ( + Dict, + Optional, + Tuple, + ) # Rules for how modules can be loaded. Values are: # @@ -23,8 +31,8 @@ # By default, fall back to the pure modules so the in-place build can # run without recompiling the C extensions. This will be overridden by # __modulepolicy__ generated by setup.py. -policy = b'allow' -_packageprefs = { +policy: bytes = b'allow' +_packageprefs: "Dict[bytes, Tuple[Optional[str], Optional[str]]]" = { # policy: (versioned package, pure package) b'c': ('cext', None), b'allow': ('cext', 'pure'), @@ -39,7 +47,7 @@ try: from . import __modulepolicy__ # type: ignore - policy = __modulepolicy__.modulepolicy + policy: bytes = __modulepolicy__.modulepolicy except ImportError: pass @@ -48,14 +56,14 @@ # The canonical way to do this is to test platform.python_implementation(). # But we don't import platform and don't bloat for it here. if '__pypy__' in sys.builtin_module_names: - policy = b'cffi' + policy: bytes = b'cffi' # Environment variable can always force settings. if 'HGMODULEPOLICY' in os.environ: - policy = os.environ['HGMODULEPOLICY'].encode('utf-8') + policy: bytes = os.environ['HGMODULEPOLICY'].encode('utf-8') -def _importfrom(pkgname, modname): +def _importfrom(pkgname: str, modname: str): # from . import (where . is looked through this module) fakelocals = {} pkg = __import__(pkgname, globals(), fakelocals, [modname], level=1) @@ -69,7 +77,7 @@ # keep in sync with "version" in C modules -_cextversions = { +_cextversions: "Dict[Tuple[str, str], int]" = { ('cext', 'base85'): 1, ('cext', 'bdiff'): 3, ('cext', 'mpatch'): 1, @@ -78,7 +86,7 @@ } # map import request to other package or module -_modredirects = { +_modredirects: "Dict[Tuple[str, str], Tuple[str, str]]" = { ('cext', 'charencode'): ('cext', 'parsers'), ('cffi', 'base85'): ('pure', 'base85'), ('cffi', 'charencode'): ('pure', 'charencode'), @@ -86,7 +94,7 @@ } -def _checkmod(pkgname, modname, mod): +def _checkmod(pkgname: str, modname: str, mod) -> None: expected = _cextversions.get((pkgname, modname)) actual = getattr(mod, 'version', None) if actual != expected: @@ -97,7 +105,7 @@ ) -def importmod(modname): +def importmod(modname: str): """Import module according to policy and check API version""" try: verpkg, purepkg = _packageprefs[policy] @@ -118,12 +126,12 @@ return _importfrom(pn, mn) -def _isrustpermissive(): +def _isrustpermissive() -> bool: """Assuming the policy is a Rust one, tell if it's permissive.""" return policy.endswith(b'-allow') -def importrust(modname, member=None, default=None): +def importrust(modname: str, member: "Optional[str]" = None, default=None): """Import Rust module according to policy and availability. If policy isn't a Rust one, this returns `default`.