Mercurial > public > mercurial-scm > hg-stable
diff mercurial/interfaces/repository.py @ 52533:199b0e62b403
interfaces: make the `peer` mixin not a Protocol to fix Python 3.10 failures
I can't find any documentation on this, but it appears that Protocol class
attributes don't get inherited in subclasses that explicitly subclass a Protocol
until Python 3.11, which caused a ton of failures in CI on macOS and Windows
(which both test using Python 3.9). The problem started with 1df97507c6b8, and
typically manifested as most tests failing to access `ui` on various `peer`
classes.
Here's a short proof of concept:
from __future__ import annotations
from typing import (
Protocol,
)
class peer(Protocol):
limitedarguments: bool = False
def __init__(self, arg1, arg2, remotehidden: bool = False) -> None:
self.arg1 = arg1
self.arg2 = arg2
class subclass(peer):
def __init__(self, arg1, arg2):
super(subclass, self).__init__(arg1, arg2, False)
sub = subclass(1, 2)
print("sub.arg1 is %r" % sub.arg1)
When run with Python 3.8.10, 3.9.13, and 3.10.11, the result is:
$ py -3.8 prot-test.py
Traceback (most recent call last):
File "prot-test.py", line 20, in <module>
print("sub.arg1 is %r" % sub.arg1)
AttributeError: 'subclass' object has no attribute 'arg1'
On Python 3.11.9, 3.12.7, and 3.13.0, the result is:
$ py -3.11 ../prot-test.py
sub.arg1 is 1
Explicitly adding annotations to `peer` like `limitedarguments` didn't help.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sun, 15 Dec 2024 18:52:05 -0500 |
parents | 3abf9bc10fcc |
children | 5a924cb07768 |
line wrap: on
line diff
--- a/mercurial/interfaces/repository.py Mon Dec 02 02:45:41 2024 +0100 +++ b/mercurial/interfaces/repository.py Sun Dec 15 18:52:05 2024 -0500 @@ -449,7 +449,8 @@ """ -class peer(_ipeerconnection, ipeercapabilities, ipeerrequests, Protocol): +# TODO: make this a Protocol class when 3.11 is the minimum supported version? +class peer(_ipeerconnection, ipeercapabilities, ipeerrequests): """Unified interface for peer repositories. All peer instances must conform to this interface.