Skip to content

Commit 6028542

Browse files
committed
move types for References to implementation
1 parent 468f196 commit 6028542

File tree

3 files changed

+28
-30
lines changed

3 files changed

+28
-30
lines changed

pygit2/_pygit2.pyi

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ from .enums import (
6161
from .filter import Filter
6262
from .index import MergeFileResult
6363
from .packbuilder import PackBuilder
64+
from .references import References
6465
from .remotes import Remote
6566
from .repository import BaseRepository
6667
from .submodules import SubmoduleCollection
@@ -668,21 +669,6 @@ class RefdbBackend:
668669
class RefdbFsBackend(RefdbBackend):
669670
def __init__(self, *args, **kwargs) -> None: ...
670671

671-
class References:
672-
def __init__(self, repository: BaseRepository) -> None: ...
673-
def __getitem__(self, name: str) -> Reference: ...
674-
def get(self, key: str) -> Reference: ...
675-
def __iter__(self) -> Iterator[str]: ...
676-
def iterator(
677-
self, references_return_type: ReferenceFilter = ...
678-
) -> Iterator[Reference]: ...
679-
def create(self, name: str, target: _OidArg, force: bool = False) -> Reference: ...
680-
def delete(self, name: str) -> None: ...
681-
def __contains__(self, name: str) -> bool: ...
682-
@property
683-
def objects(self) -> list[Reference]: ...
684-
def compress(self) -> None: ...
685-
686672
_Proxy = None | Literal[True] | str
687673

688674
class _StrArray:

pygit2/references.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,32 @@
2525

2626
from __future__ import annotations
2727

28-
from typing import TYPE_CHECKING
28+
from typing import TYPE_CHECKING, Iterator
29+
30+
from pygit2 import Oid
2931

3032
from .enums import ReferenceFilter
3133

3234
# Need BaseRepository for type hints, but don't let it cause a circular dependency
3335
if TYPE_CHECKING:
36+
from ._pygit2 import Reference
3437
from .repository import BaseRepository
3538

3639

3740
class References:
38-
def __init__(self, repository: BaseRepository):
41+
def __init__(self, repository: BaseRepository) -> None:
3942
self._repository = repository
4043

41-
def __getitem__(self, name: str):
44+
def __getitem__(self, name: str) -> 'Reference':
4245
return self._repository.lookup_reference(name)
4346

44-
def get(self, key: str):
47+
def get(self, key: str) -> 'Reference':
4548
try:
4649
return self[key]
4750
except KeyError:
48-
return None
51+
return None # type: ignore # will be corrected in next commit!
4952

50-
def __iter__(self):
53+
def __iter__(self) -> Iterator[str]:
5154
iter = self._repository.references_iterator_init()
5255
while True:
5356
ref = self._repository.references_iterator_next(iter)
@@ -56,7 +59,9 @@ def __iter__(self):
5659
else:
5760
return
5861

59-
def iterator(self, references_return_type: ReferenceFilter = ReferenceFilter.ALL):
62+
def iterator(
63+
self, references_return_type: ReferenceFilter = ReferenceFilter.ALL
64+
) -> Iterator['Reference']:
6065
"""Creates a new iterator and fetches references for a given repository.
6166
6267
Can also filter and pass all refs or only branches or only tags.
@@ -88,18 +93,18 @@ def iterator(self, references_return_type: ReferenceFilter = ReferenceFilter.ALL
8893
else:
8994
return
9095

91-
def create(self, name, target, force=False):
96+
def create(self, name: str, target: Oid | str, force: bool = False) -> 'Reference':
9297
return self._repository.create_reference(name, target, force)
9398

94-
def delete(self, name: str):
99+
def delete(self, name: str) -> None:
95100
self[name].delete()
96101

97-
def __contains__(self, name: str):
102+
def __contains__(self, name: str) -> bool:
98103
return self.get(name) is not None
99104

100105
@property
101-
def objects(self):
106+
def objects(self) -> list['Reference']:
102107
return self._repository.listall_reference_objects()
103108

104-
def compress(self):
109+
def compress(self) -> None:
105110
return self._repository.compress_references()

pygit2/repository.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,13 @@ def config_snapshot(self):
251251
#
252252
# References
253253
#
254-
def create_reference(self, name, target, force=False, message=None):
254+
def create_reference(
255+
self,
256+
name: str,
257+
target: Oid | str,
258+
force: bool = False,
259+
message: str | None = None,
260+
) -> 'Reference':
255261
"""Create a new reference "name" which points to an object or to
256262
another reference.
257263
@@ -273,12 +279,13 @@ def create_reference(self, name, target, force=False, message=None):
273279
repo.create_reference('refs/tags/foo', 'refs/heads/master')
274280
repo.create_reference('refs/tags/foo', 'bbb78a9cec580')
275281
"""
276-
direct = type(target) is Oid or (
282+
direct = isinstance(target, Oid) or (
277283
all(c in hexdigits for c in target)
278284
and GIT_OID_MINPREFIXLEN <= len(target) <= GIT_OID_HEXSZ
279285
)
280286

281-
if direct:
287+
# duplicate isinstance call for mypy
288+
if direct or isinstance(target, Oid):
282289
return self.create_reference_direct(name, target, force, message=message)
283290

284291
return self.create_reference_symbolic(name, target, force, message=message)

0 commit comments

Comments
 (0)