Skip to content

Commit a913d6f

Browse files
chore: disallow incomplete type defs
Don't allow a partially annotated function definition. Either none of the function is annotated or all of it must be. Update code to ensure no-more partially annotated functions. Update gitlab/cli.py with better type-hints. Changed Tuple[Any, ...] to Tuple[str, ...]
1 parent b0d75d9 commit a913d6f

File tree

5 files changed

+50
-34
lines changed

5 files changed

+50
-34
lines changed

.mypy.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
[mypy]
22
files = gitlab/*.py
3+
4+
# disallow_incomplete_defs: This flag reports an error whenever it encounters a
5+
# partly annotated function definition.
6+
disallow_incomplete_defs = True

gitlab/base.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def __getattr__(self, name: str) -> Any:
9292
except KeyError:
9393
raise AttributeError(name)
9494

95-
def __setattr__(self, name: str, value) -> None:
95+
def __setattr__(self, name: str, value: Any) -> None:
9696
self.__dict__["_updated_attrs"][name] = value
9797

9898
def __str__(self) -> str:
@@ -110,12 +110,16 @@ def __repr__(self) -> str:
110110
else:
111111
return "<%s>" % self.__class__.__name__
112112

113-
def __eq__(self, other) -> bool:
113+
def __eq__(self, other: object) -> bool:
114+
if not isinstance(other, RESTObject):
115+
return NotImplemented
114116
if self.get_id() and other.get_id():
115117
return self.get_id() == other.get_id()
116118
return super(RESTObject, self) == other
117119

118-
def __ne__(self, other) -> bool:
120+
def __ne__(self, other: object) -> bool:
121+
if not isinstance(other, RESTObject):
122+
return NotImplemented
119123
if self.get_id() and other.get_id():
120124
return self.get_id() != other.get_id()
121125
return super(RESTObject, self) != other
@@ -138,7 +142,7 @@ def _create_managers(self) -> None:
138142
manager = cls(self.manager.gitlab, parent=self)
139143
self.__dict__[attr] = manager
140144

141-
def _update_attrs(self, new_attrs) -> None:
145+
def _update_attrs(self, new_attrs: Dict[str, Any]) -> None:
142146
self.__dict__["_updated_attrs"] = {}
143147
self.__dict__["_attrs"] = new_attrs
144148

gitlab/cli.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import functools
2222
import re
2323
import sys
24-
from typing import Any, Callable, Dict, Tuple
24+
from typing import Any, Callable, Dict, Optional, Tuple, Union
2525

2626
import gitlab.config
2727

@@ -32,21 +32,24 @@
3232
# action: (mandatory_args, optional_args, in_obj),
3333
# },
3434
# }
35-
custom_actions: Dict[str, Dict[str, Tuple[Tuple[Any, ...], Tuple[Any, ...], bool]]] = {}
35+
custom_actions: Dict[str, Dict[str, Tuple[Tuple[str, ...], Tuple[str, ...], bool]]] = {}
3636

3737

3838
def register_custom_action(
39-
cls_names, mandatory: Tuple[Any, ...] = tuple(), optional: Tuple[Any, ...] = tuple()
39+
cls_names: Union[str, Tuple[str, ...]],
40+
mandatory: Tuple[str, ...] = tuple(),
41+
optional: Tuple[str, ...] = tuple(),
4042
) -> Callable:
41-
def wrap(f) -> Callable:
43+
def wrap(f: Callable) -> Callable:
4244
@functools.wraps(f)
4345
def wrapped_f(*args, **kwargs):
4446
return f(*args, **kwargs)
4547

4648
# in_obj defines whether the method belongs to the obj or the manager
4749
in_obj = True
48-
classes = cls_names
49-
if type(cls_names) != tuple:
50+
if isinstance(cls_names, tuple):
51+
classes = cls_names
52+
else:
5053
classes = (cls_names,)
5154

5255
for cls_name in classes:
@@ -65,7 +68,7 @@ def wrapped_f(*args, **kwargs):
6568
return wrap
6669

6770

68-
def die(msg: str, e=None) -> None:
71+
def die(msg: str, e: Optional[Exception] = None) -> None:
6972
if e:
7073
msg = "%s (%s)" % (msg, e)
7174
sys.stderr.write(msg + "\n")
@@ -76,7 +79,7 @@ def what_to_cls(what: str) -> str:
7679
return "".join([s.capitalize() for s in what.split("-")])
7780

7881

79-
def cls_to_what(cls) -> str:
82+
def cls_to_what(cls: Any) -> str:
8083
return camel_re.sub(r"\1-\2", cls.__name__).lower()
8184

8285

gitlab/client.py

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def __init__(
145145
def __enter__(self) -> "Gitlab":
146146
return self
147147

148-
def __exit__(self, *args) -> None:
148+
def __exit__(self, *args: Any) -> None:
149149
self.session.close()
150150

151151
def __getstate__(self) -> Dict[str, Any]:
@@ -180,7 +180,9 @@ def api_version(self) -> str:
180180
return self._api_version
181181

182182
@classmethod
183-
def from_config(cls, gitlab_id=None, config_files=None) -> "Gitlab":
183+
def from_config(
184+
cls, gitlab_id: Optional[str] = None, config_files: Optional[List[str]] = None
185+
) -> "Gitlab":
184186
"""Create a Gitlab connection from configuration files.
185187
186188
Args:
@@ -247,7 +249,7 @@ def version(self) -> Tuple[str, str]:
247249
return cast(str, self._server_version), cast(str, self._server_revision)
248250

249251
@gitlab.exceptions.on_http_error(gitlab.exceptions.GitlabVerifyError)
250-
def lint(self, content: str, **kwargs) -> Tuple[bool, List[str]]:
252+
def lint(self, content: str, **kwargs: Any) -> Tuple[bool, List[str]]:
251253
"""Validate a gitlab CI configuration.
252254
253255
Args:
@@ -269,7 +271,7 @@ def lint(self, content: str, **kwargs) -> Tuple[bool, List[str]]:
269271

270272
@gitlab.exceptions.on_http_error(gitlab.exceptions.GitlabMarkdownError)
271273
def markdown(
272-
self, text: str, gfm: bool = False, project: Optional[str] = None, **kwargs
274+
self, text: str, gfm: bool = False, project: Optional[str] = None, **kwargs: Any
273275
) -> str:
274276
"""Render an arbitrary Markdown document.
275277
@@ -296,7 +298,7 @@ def markdown(
296298
return data["html"]
297299

298300
@gitlab.exceptions.on_http_error(gitlab.exceptions.GitlabLicenseError)
299-
def get_license(self, **kwargs) -> Dict[str, Any]:
301+
def get_license(self, **kwargs: Any) -> Dict[str, Any]:
300302
"""Retrieve information about the current license.
301303
302304
Args:
@@ -315,7 +317,7 @@ def get_license(self, **kwargs) -> Dict[str, Any]:
315317
return {}
316318

317319
@gitlab.exceptions.on_http_error(gitlab.exceptions.GitlabLicenseError)
318-
def set_license(self, license: str, **kwargs) -> Dict[str, Any]:
320+
def set_license(self, license: str, **kwargs: Any) -> Dict[str, Any]:
319321
"""Add a new license.
320322
321323
Args:
@@ -446,7 +448,7 @@ def http_request(
446448
post_data: Optional[Dict[str, Any]] = None,
447449
streamed: bool = False,
448450
files: Optional[Dict[str, Any]] = None,
449-
**kwargs,
451+
**kwargs: Any,
450452
) -> requests.Response:
451453
"""Make an HTTP request to the Gitlab server.
452454
@@ -577,7 +579,7 @@ def http_get(
577579
query_data: Optional[Dict[str, Any]] = None,
578580
streamed: bool = False,
579581
raw: bool = False,
580-
**kwargs,
582+
**kwargs: Any,
581583
) -> Union[Dict[str, Any], requests.Response]:
582584
"""Make a GET request to the Gitlab server.
583585
@@ -621,9 +623,9 @@ def http_list(
621623
self,
622624
path: str,
623625
query_data: Optional[Dict[str, Any]] = None,
624-
as_list=None,
625-
**kwargs,
626-
):
626+
as_list: Optional[bool] = None,
627+
**kwargs: Any,
628+
) -> Union["GitlabList", List[Dict[str, Any]]]:
627629
"""Make a GET request to the Gitlab server for list-oriented queries.
628630
629631
Args:
@@ -670,7 +672,7 @@ def http_post(
670672
query_data: Optional[Dict[str, Any]] = None,
671673
post_data: Optional[Dict[str, Any]] = None,
672674
files: Optional[Dict[str, Any]] = None,
673-
**kwargs,
675+
**kwargs: Any,
674676
) -> Union[Dict[str, Any], requests.Response]:
675677
"""Make a POST request to the Gitlab server.
676678
@@ -717,7 +719,7 @@ def http_put(
717719
query_data: Optional[Dict[str, Any]] = None,
718720
post_data: Optional[Dict[str, Any]] = None,
719721
files: Optional[Dict[str, Any]] = None,
720-
**kwargs,
722+
**kwargs: Any,
721723
) -> Union[Dict[str, Any], requests.Response]:
722724
"""Make a PUT request to the Gitlab server.
723725
@@ -755,7 +757,7 @@ def http_put(
755757
error_message="Failed to parse the server message"
756758
) from e
757759

758-
def http_delete(self, path: str, **kwargs) -> requests.Response:
760+
def http_delete(self, path: str, **kwargs: Any) -> requests.Response:
759761
"""Make a PUT request to the Gitlab server.
760762
761763
Args:
@@ -772,7 +774,9 @@ def http_delete(self, path: str, **kwargs) -> requests.Response:
772774
return self.http_request("delete", path, **kwargs)
773775

774776
@gitlab.exceptions.on_http_error(gitlab.exceptions.GitlabSearchError)
775-
def search(self, scope: str, search: str, **kwargs) -> requests.Response:
777+
def search(
778+
self, scope: str, search: str, **kwargs: Any
779+
) -> Union["GitlabList", List[Dict[str, Any]]]:
776780
"""Search GitLab resources matching the provided string.'
777781
778782
Args:
@@ -804,7 +808,7 @@ def __init__(
804808
url: str,
805809
query_data: Dict[str, Any],
806810
get_next: bool = True,
807-
**kwargs,
811+
**kwargs: Any,
808812
) -> None:
809813
self._gl = gl
810814

@@ -815,7 +819,7 @@ def __init__(
815819
self._get_next = get_next
816820

817821
def _query(
818-
self, url: str, query_data: Optional[Dict[str, Any]] = None, **kwargs
822+
self, url: str, query_data: Optional[Dict[str, Any]] = None, **kwargs: Any
819823
) -> None:
820824
query_data = query_data or {}
821825
result = self._gl.http_request("get", url, query_data=query_data, **kwargs)
@@ -840,7 +844,7 @@ def _query(
840844
self._total: Optional[Union[str, int]] = result.headers.get("X-Total")
841845

842846
try:
843-
self._data = result.json()
847+
self._data: List[Dict[str, Any]] = result.json()
844848
except Exception as e:
845849
raise gitlab.exceptions.GitlabParsingError(
846850
error_message="Failed to parse the server message"
@@ -896,10 +900,10 @@ def __len__(self) -> int:
896900
return 0
897901
return int(self._total)
898902

899-
def __next__(self):
903+
def __next__(self) -> Dict[str, Any]:
900904
return self.next()
901905

902-
def next(self) -> "Gitlab":
906+
def next(self) -> Dict[str, Any]:
903907
try:
904908
item = self._data[self._current]
905909
self._current += 1

gitlab/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323

2424
class _StdoutStream(object):
25-
def __call__(self, chunk) -> None:
25+
def __call__(self, chunk: Any) -> None:
2626
print(chunk)
2727

2828

@@ -31,7 +31,7 @@ def response_content(
3131
streamed: bool,
3232
action: Optional[Callable],
3333
chunk_size: int,
34-
):
34+
) -> Optional[bytes]:
3535
if streamed is False:
3636
return response.content
3737

@@ -41,6 +41,7 @@ def response_content(
4141
for chunk in response.iter_content(chunk_size=chunk_size):
4242
if chunk:
4343
action(chunk)
44+
return None
4445

4546

4647
def copy_dict(dest: Dict[str, Any], src: Dict[str, Any]) -> None:

0 commit comments

Comments
 (0)