@@ -62,9 +62,9 @@ class TraverseNT(NamedTuple):
6262T_TIobj = TypeVar ("T_TIobj" ,bound = "TraversableIterableObj" )# For TraversableIterableObj.traverse()
6363
6464TraversedTup = Union [
65- Tuple [Union ["Traversable" ,None ],"Traversable" ],# Forcommit, submodule
66- "TraversedTreeTup" ,
67- ]# for tree.traverse()
65+ Tuple [Union ["Traversable" ,None ],"Traversable" ],# ForCommit, Submodule.
66+ "TraversedTreeTup" ,# For Tree.traverse().
67+ ]
6868
6969# --------------------------------------------------------------------
7070
@@ -380,11 +380,15 @@ class Tree:: (cls, Tree) -> Tuple[Tree, ...]
380380
381381@abstractmethod
382382def list_traverse (self ,* args :Any ,** kwargs :Any )-> Any :
383- """ """
383+ """Traverse self and collect all items found.
384+
385+ Calling this directly only the abstract base class, including via a ``super()``
386+ proxy, is deprecated. Only overridden implementations should be called.
387+ """
384388warnings .warn (
385389"list_traverse() method should only be called from subclasses."
386- "Calling from Traversable abstract class will raise NotImplementedError in3.1.20 "
387- "Builtin sublclasses are 'Submodule ', 'Tree' and 'Commit " ,
390+ " Calling from Traversable abstract class will raise NotImplementedError in4.0.0. "
391+ " The concrete subclasses in GitPython itself are 'Commit ', 'RootModule', 'Submodule', and 'Tree'. " ,
388392DeprecationWarning ,
389393stacklevel = 2 ,
390394 )
@@ -393,12 +397,14 @@ def list_traverse(self, *args: Any, **kwargs: Any) -> Any:
393397def _list_traverse (
394398self ,as_edge :bool = False ,* args :Any ,** kwargs :Any
395399 )-> IterableList [Union ["Commit" ,"Submodule" ,"Tree" ,"Blob" ]]:
396- """
400+ """Traverse self and collect all items found.
401+
397402 :return: IterableList with the results of the traversal as produced by
398- traverse()
399- Commit -> IterableList['Commit']
400- Submodule -> IterableList['Submodule']
401- Tree -> IterableList[Union['Submodule', 'Tree', 'Blob']]
403+ :meth:`traverse`::
404+
405+ Commit -> IterableList['Commit']
406+ Submodule -> IterableList['Submodule']
407+ Tree -> IterableList[Union['Submodule', 'Tree', 'Blob']]
402408 """
403409# Commit and Submodule have id.__attribute__ as IterableObj.
404410# Tree has id.__attribute__ inherited from IndexObject.
@@ -421,11 +427,15 @@ def _list_traverse(
421427
422428@abstractmethod
423429def traverse (self ,* args :Any ,** kwargs :Any )-> Any :
424- """ """
430+ """Iterator yielding items found when traversing self.
431+
432+ Calling this directly on the abstract base class, including via a ``super()``
433+ proxy, is deprecated. Only overridden implementations should be called.
434+ """
425435warnings .warn (
426436"traverse() method should only be called from subclasses."
427- "Calling from Traversable abstract class will raise NotImplementedError in3.1.20 "
428- "Builtin sublclasses are 'Submodule ', 'Tree' and 'Commit " ,
437+ " Calling from Traversable abstract class will raise NotImplementedError in4.0.0. "
438+ " The concrete subclasses in GitPython itself are 'Commit ', 'RootModule', 'Submodule', and 'Tree'. " ,
429439DeprecationWarning ,
430440stacklevel = 2 ,
431441 )
@@ -441,7 +451,7 @@ def _traverse(
441451ignore_self :int = 1 ,
442452as_edge :bool = False ,
443453 )-> Union [Iterator [Union ["Traversable" ,"Blob" ]],Iterator [TraversedTup ]]:
444- """:return: Iterator yielding items found when traversing self
454+ """Iterator yielding items found when traversing self.
445455
446456 :param predicate: f(i,d) returns False if item i at depth d should not be
447457 included in the result.
@@ -471,18 +481,18 @@ def _traverse(
471481 if True, return a pair of items, first being the source, second the
472482 destination, i.e. tuple(src, dest) with the edge spanning from source to
473483 destination
474- """
475484
476- """
477- Commit -> Iterator[Union[Commit, Tuple[Commit, Commit]]
478- Submodule -> Iterator[Submodule, Tuple[Submodule, Submodule]]
479- Tree -> Iterator[Union[Blob, Tree, Submodule,
480- Tuple[Union[Submodule, Tree], Union[Blob, Tree, Submodule]]]
481-
482- ignore_self=True is_edge=True -> Iterator[item]
483- ignore_self=True is_edge=False --> Iterator[item]
484- ignore_self=False is_edge=True -> Iterator[item] | Iterator[Tuple[src, item]]
485- ignore_self=False is_edge=False -> Iterator[Tuple[src, item]]
485+ :return: Iterator yielding items found when traversing self::
486+
487+ Commit -> Iterator[Union[Commit, Tuple[Commit, Commit]]
488+ Submodule -> Iterator[Submodule, Tuple[Submodule, Submodule]]
489+ Tree -> Iterator[Union[Blob, Tree, Submodule,
490+ Tuple[Union[Submodule, Tree], Union[Blob, Tree, Submodule]]]
491+
492+ ignore_self=True is_edge=True -> Iterator[item]
493+ ignore_self=True is_edge=False --> Iterator[item]
494+ ignore_self=False is_edge=True -> Iterator[item] | Iterator[Tuple[src, item]]
495+ ignore_self=False is_edge=False -> Iterator[Tuple[src, item]]
486496 """
487497
488498visited = set ()
@@ -547,7 +557,7 @@ class Serializable(Protocol):
547557def _serialize (self ,stream :"BytesIO" )-> "Serializable" :
548558"""Serialize the data of this object into the given data stream.
549559
550- :note: A serialized object would`` _deserialize` ` into the same object.
560+ :note: A serialized object would:meth:` _deserialize` into the same object.
551561
552562 :param stream: a file-like object
553563
@@ -627,24 +637,24 @@ def traverse(
627637ignore_self :int = 1 ,
628638as_edge :bool = False ,
629639 )-> Union [Iterator [T_TIobj ],Iterator [Tuple [T_TIobj ,T_TIobj ]],Iterator [TIobj_tuple ]]:
630- """For documentation, see util.Traversable._traverse()"""
640+ """For documentation, see :meth:`Traversable._traverse`."""
641+
642+ ## To typecheck instead of using cast:
643+ #
644+ # import itertools
645+ # from git.types import TypeGuard
646+ # def is_commit_traversed(inp: Tuple) -> TypeGuard[Tuple[Iterator[Tuple['Commit', 'Commit']]]]:
647+ # for x in inp[1]:
648+ # if not isinstance(x, tuple) and len(x) != 2:
649+ # if all(isinstance(inner, Commit) for inner in x):
650+ # continue
651+ # return True
652+ #
653+ # ret = super(Commit, self).traverse(predicate, prune, depth, branch_first, visit_once, ignore_self, as_edge)
654+ # ret_tup = itertools.tee(ret, 2)
655+ # assert is_commit_traversed(ret_tup), f"{[type(x) for x in list(ret_tup[0])]}"
656+ # return ret_tup[0]
631657
632- """
633- # To typecheck instead of using cast.
634- import itertools
635- from git.types import TypeGuard
636- def is_commit_traversed(inp: Tuple) -> TypeGuard[Tuple[Iterator[Tuple['Commit', 'Commit']]]]:
637- for x in inp[1]:
638- if not isinstance(x, tuple) and len(x) != 2:
639- if all(isinstance(inner, Commit) for inner in x):
640- continue
641- return True
642-
643- ret = super(Commit, self).traverse(predicate, prune, depth, branch_first, visit_once, ignore_self, as_edge)
644- ret_tup = itertools.tee(ret, 2)
645- assert is_commit_traversed(ret_tup), f"{[type(x) for x in list(ret_tup[0])]}"
646- return ret_tup[0]
647- """
648658return cast (
649659Union [Iterator [T_TIobj ],Iterator [Tuple [Union [None ,T_TIobj ],T_TIobj ]]],
650660super ()._traverse (predicate ,prune ,depth ,branch_first ,visit_once ,ignore_self ,as_edge ),# type: ignore