comparison mercurial/interfaces/repository.py @ 52506: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
comparison
equal deleted inserted replaced
52505:68dc6cecca32 52506:199b0e62b403
447 command executor could result in a new connection or wire-level request 447 command executor could result in a new connection or wire-level request
448 being issued. 448 being issued.
449 """ 449 """
450 450
451 451
452 class peer(_ipeerconnection, ipeercapabilities, ipeerrequests, Protocol): 452 # TODO: make this a Protocol class when 3.11 is the minimum supported version?
453 class peer(_ipeerconnection, ipeercapabilities, ipeerrequests):
453 """Unified interface for peer repositories. 454 """Unified interface for peer repositories.
454 455
455 All peer instances must conform to this interface. 456 All peer instances must conform to this interface.
456 """ 457 """
457 458