Skip to content
Prev Previous commit
Next Next commit
Add overloads for Submodule.traverse()
  • Loading branch information
Yobmod committed Jun 28, 2021
commit ac5a9750045a38b7e99b2a633824bf84734ed425
42 changes: 39 additions & 3 deletions git/objects/submodule/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@

# typing ----------------------------------------------------------------------
from typing import Dict, TYPE_CHECKING, Tuple
from typing import Any, Callable, Iterator, Union, cast
from typing import Any, Callable, Iterator, Union, cast, overload

from git.types import Commit_ish, PathLike
from git.types import Commit_ish, PathLike, Literal

if TYPE_CHECKING:
from git.repo import Repo
Expand Down Expand Up @@ -167,6 +167,42 @@ def _get_intermediate_items(cls, item: 'Submodule') -> IterableList['Submodule']
return IterableList('')
# END handle intermediate items

@overload # type: ignore
def traverse(self,
predicate: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool],
prune: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool],
depth: int,
branch_first: bool,
visit_once: bool,
ignore_self: Literal[True],
as_edge: Literal[False], # No Tuple
) -> Iterator['Submodule']:
...

@overload
def traverse(self,
predicate: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool],
prune: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool],
depth: int,
branch_first: bool,
visit_once: bool,
ignore_self: Literal[False],
as_edge: Literal[True],
) -> Iterator[Tuple[Union[None, 'Submodule'], 'Submodule']]:
...

@overload
def traverse(self,
predicate: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool],
prune: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool],
depth: int,
branch_first: bool,
visit_once: bool,
ignore_self: Literal[True],
as_edge: Literal[True],
) -> Iterator[Tuple['Submodule', 'Submodule']]:
...

def traverse(self,
predicate: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool] = lambda i, d: True,
prune: Callable[[Union['TraversedObj', 'TraversedTup'], int], bool] = lambda i, d: False,
Expand All @@ -175,7 +211,7 @@ def traverse(self,
visit_once: bool = True,
ignore_self: int = 1,
as_edge: bool = False
) -> Union[Iterator['Submodule'], Iterator[Tuple['Submodule', 'Submodule']]]:
) -> Union[Iterator['Submodule'], Iterator[Tuple[Union[None, 'Submodule'], 'Submodule']]]:
"""For documentation, see util.Traversable._traverse()"""

# """
Expand Down
5 changes: 4 additions & 1 deletion test/test_commit.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,10 @@ def test_traversal(self):
for itemtup in stoptraverse_list:
self.assertIsInstance(itemtup, (tuple)) and self.assertEqual(len(itemtup), 2) # as_edge=True -> tuple
src, item = itemtup
self.assertIsInstance(src, Commit) or self.assertIsNone(src) # ignore_self=0 -> first is (None, Commit)
if src:
self.assertIsInstance(src, Commit)
else:
self.assertIsNone(src) # ignore_self=0 -> first is (None, Commit)
self.assertIsInstance(item, Commit)

stoptraverse = self.rorepo.commit("254d04aa3180eb8b8daf7b7ff25f010cd69b4e7d").traverse(as_edge=True)
Expand Down