Просмотр исходного кода

Add type annotations to dulwich/config.py

Jelmer Vernooij 5 месяцев назад
Родитель
Сommit
881a4a676a
2 измененных файлов с 28 добавлено и 12 удалено
  1. 16 12
      dulwich/config.py
  2. 12 0
      dulwich/file.py

+ 16 - 12
dulwich/config.py

@@ -48,6 +48,7 @@ from typing import (
     Optional,
     TypeVar,
     Union,
+    cast,
     overload,
 )
 
@@ -176,7 +177,8 @@ class CaseInsensitiveOrderedMultiDict(MutableMapping[K, V], Generic[K, V]):
 
     @classmethod
     def make(
-        cls, dict_in=None, default_factory=None
+        cls, dict_in: Optional[Union[MutableMapping[K, V], "CaseInsensitiveOrderedMultiDict[K, V]"]] = None, 
+        default_factory: Optional[Callable[[], V]] = None
     ) -> "CaseInsensitiveOrderedMultiDict[K, V]":
         if isinstance(dict_in, cls):
             return dict_in
@@ -226,22 +228,22 @@ class CaseInsensitiveOrderedMultiDict(MutableMapping[K, V], Generic[K, V]):
     def values(self) -> ValuesView[V]:
         return self._keyed.values()
 
-    def __setitem__(self, key, value) -> None:
+    def __setitem__(self, key: K, value: V) -> None:
         self._real.append((key, value))
         self._keyed[lower_key(key)] = value
 
-    def set(self, key, value) -> None:
+    def set(self, key: K, value: V) -> None:
         # This method replaces all existing values for the key
         lower = lower_key(key)
         self._real = [(k, v) for k, v in self._real if lower_key(k) != lower]
         self._real.append((key, value))
         self._keyed[lower] = value
 
-    def __delitem__(self, key) -> None:
-        key = lower_key(key)
-        del self._keyed[key]
+    def __delitem__(self, key: K) -> None:
+        lower_k = lower_key(key)
+        del self._keyed[lower_k]
         for i, (actual, unused_value) in reversed(list(enumerate(self._real))):
-            if lower_key(actual) == key:
+            if lower_key(actual) == lower_k:
                 del self._real[i]
 
     def __getitem__(self, item: K) -> V:
@@ -417,7 +419,7 @@ class ConfigDict(Config):
     def __getitem__(self, key: Section) -> CaseInsensitiveOrderedMultiDict[Name, Value]:
         return self._values.__getitem__(key)
 
-    def __setitem__(self, key: Section, value: MutableMapping[Name, Value]) -> None:
+    def __setitem__(self, key: Section, value: CaseInsensitiveOrderedMultiDict[Name, Value]) -> None:
         return self._values.__setitem__(key, value)
 
     def __delitem__(self, key: Section) -> None:
@@ -924,10 +926,11 @@ class ConfigFile(ConfigDict):
         # Load and merge the included file
         try:
             # Use provided file opener or default to GitFile
+            opener: FileOpener
             if file_opener is None:
 
-                def opener(path):
-                    return GitFile(path, "rb")
+                def opener(path: Union[str, os.PathLike]) -> BinaryIO:
+                    return cast(BinaryIO, GitFile(path, "rb"))
             else:
                 opener = file_opener
 
@@ -1084,10 +1087,11 @@ class ConfigFile(ConfigDict):
         config_dir = os.path.dirname(abs_path)
 
         # Use provided file opener or default to GitFile
+        opener: FileOpener
         if file_opener is None:
 
-            def opener(p):
-                return GitFile(p, "rb")
+            def opener(p: Union[str, os.PathLike]) -> BinaryIO:
+                return cast(BinaryIO, GitFile(p, "rb"))
         else:
             opener = file_opener
 

+ 12 - 0
dulwich/file.py

@@ -266,3 +266,15 @@ class _GitFile:
         if name in self.PROXY_PROPERTIES:
             return getattr(self._file, name)
         raise AttributeError(name)
+    
+    def readable(self) -> bool:
+        """Return whether the file is readable."""
+        return self._file.readable()
+    
+    def writable(self) -> bool:
+        """Return whether the file is writable."""
+        return self._file.writable()
+    
+    def seekable(self) -> bool:
+        """Return whether the file is seekable."""
+        return self._file.seekable()