Mercurial > hg
changeset 51870:9d4ad05bc91c
typing: make `bundlerepository` subclass `localrepository` while type checking
Currently, `mercurial/bundlerepo.py` is excluded from pytype, mostly because it
complains that various `ui` and `vfs` fields in `localrepository` are missing.
(`bundlerepository` dynamically subclasses `localrepository` when it is
instantiated, so it works at runtime.) This makes that class hierarchy known to
pytype.
Having a protocol for `Repository` is probably the right thing to do, but that
will be a lot of work and this still reflects the class at runtime. Subclassing
also has the benefit of making sure any method overrides have a matching
signature, so maybe this is a situation where we do both of these things. (I'm
not sure how clear the diagnostics are if a class *almost* implements a
protocol, but is missing a method argument or similar.) The subclassing is not
done outside of type checking runs to avoid any side effects on already complex
code.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 18 Sep 2024 17:50:57 -0400 |
parents | db7dbe6f7bb2 |
children | cfd30df0f8e4 |
files | mercurial/bundlerepo.py |
diffstat | 1 files changed, 8 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/bundlerepo.py Wed Jun 19 14:49:35 2024 +0200 +++ b/mercurial/bundlerepo.py Wed Sep 18 17:50:57 2024 -0400 @@ -16,6 +16,7 @@ import contextlib import os import shutil +import typing from .i18n import _ from .node import ( @@ -287,7 +288,13 @@ return filespos -class bundlerepository: +_bundle_repo_baseclass = object + +if typing.TYPE_CHECKING: + _bundle_repo_baseclass = localrepo.localrepository + + +class bundlerepository(_bundle_repo_baseclass): """A repository instance that is a union of a local repo and a bundle. Instances represent a read-only repository composed of a local repository