@@ -62,9 +62,9 @@ class TraverseNT(NamedTuple):
62
62
T_TIobj = TypeVar ("T_TIobj" , bound = "TraversableIterableObj" ) # For TraversableIterableObj.traverse()
63
63
64
64
TraversedTup = Union [
65
- Tuple [Union ["Traversable" , None ], "Traversable" ], # For commit, submodule
66
- "TraversedTreeTup" ,
67
- ] # for tree.traverse()
65
+ Tuple [Union ["Traversable" , None ], "Traversable" ], # For Commit, Submodule.
66
+ "TraversedTreeTup" , # For Tree.traverse().
67
+ ]
68
68
69
69
# --------------------------------------------------------------------
70
70
@@ -380,11 +380,15 @@ class Tree:: (cls, Tree) -> Tuple[Tree, ...]
380
380
381
381
@abstractmethod
382
382
def 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
+ """
384
388
warnings .warn (
385
389
"list_traverse() method should only be called from subclasses."
386
- "Calling from Traversable abstract class will raise NotImplementedError in 3.1.20 "
387
- "Builtin sublclasses are 'Submodule ', 'Tree' and 'Commit " ,
390
+ " Calling from Traversable abstract class will raise NotImplementedError in 4.0.0. "
391
+ " The concrete subclasses in GitPython itself are 'Commit ', 'RootModule', 'Submodule', and 'Tree'. " ,
388
392
DeprecationWarning ,
389
393
stacklevel = 2 ,
390
394
)
@@ -393,12 +397,14 @@ def list_traverse(self, *args: Any, **kwargs: Any) -> Any:
393
397
def _list_traverse (
394
398
self , as_edge : bool = False , * args : Any , ** kwargs : Any
395
399
) -> IterableList [Union ["Commit" , "Submodule" , "Tree" , "Blob" ]]:
396
- """
400
+ """Traverse self and collect all items found.
401
+
397
402
: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']]
402
408
"""
403
409
# Commit and Submodule have id.__attribute__ as IterableObj.
404
410
# Tree has id.__attribute__ inherited from IndexObject.
@@ -421,11 +427,15 @@ def _list_traverse(
421
427
422
428
@abstractmethod
423
429
def 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
+ """
425
435
warnings .warn (
426
436
"traverse() method should only be called from subclasses."
427
- "Calling from Traversable abstract class will raise NotImplementedError in 3.1.20 "
428
- "Builtin sublclasses are 'Submodule ', 'Tree' and 'Commit " ,
437
+ " Calling from Traversable abstract class will raise NotImplementedError in 4.0.0. "
438
+ " The concrete subclasses in GitPython itself are 'Commit ', 'RootModule', 'Submodule', and 'Tree'. " ,
429
439
DeprecationWarning ,
430
440
stacklevel = 2 ,
431
441
)
@@ -441,7 +451,7 @@ def _traverse(
441
451
ignore_self : int = 1 ,
442
452
as_edge : bool = False ,
443
453
) -> Union [Iterator [Union ["Traversable" , "Blob" ]], Iterator [TraversedTup ]]:
444
- """:return: Iterator yielding items found when traversing self
454
+ """Iterator yielding items found when traversing self.
445
455
446
456
:param predicate: f(i,d) returns False if item i at depth d should not be
447
457
included in the result.
@@ -471,18 +481,18 @@ def _traverse(
471
481
if True, return a pair of items, first being the source, second the
472
482
destination, i.e. tuple(src, dest) with the edge spanning from source to
473
483
destination
474
- """
475
484
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]]
486
496
"""
487
497
488
498
visited = set ()
@@ -547,7 +557,7 @@ class Serializable(Protocol):
547
557
def _serialize (self , stream : "BytesIO" ) -> "Serializable" :
548
558
"""Serialize the data of this object into the given data stream.
549
559
550
- :note: A serialized object would `` _deserialize` ` into the same object.
560
+ :note: A serialized object would :meth:` _deserialize` into the same object.
551
561
552
562
:param stream: a file-like object
553
563
@@ -627,24 +637,24 @@ def traverse(
627
637
ignore_self : int = 1 ,
628
638
as_edge : bool = False ,
629
639
) -> 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]
631
657
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
- """
648
658
return cast (
649
659
Union [Iterator [T_TIobj ], Iterator [Tuple [Union [None , T_TIobj ], T_TIobj ]]],
650
660
super ()._traverse (predicate , prune , depth , branch_first , visit_once , ignore_self , as_edge ), # type: ignore
0 commit comments