Skip to content

Commit 7e395a8

Browse files
author
Liora Milbaum
committed
refactor: Migrate MultipartEncoder to RequestsBackend
1 parent 62e535b commit 7e395a8

File tree

2 files changed

+36
-35
lines changed

2 files changed

+36
-35
lines changed

gitlab/client.py

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import requests
1010
import requests.utils
11-
from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore
1211

1312
import gitlab
1413
import gitlab.config
@@ -637,38 +636,6 @@ def _check_redirects(result: requests.Response) -> None:
637636
)
638637
)
639638

640-
@staticmethod
641-
def _prepare_send_data(
642-
files: Optional[Dict[str, Any]] = None,
643-
post_data: Optional[Union[Dict[str, Any], bytes]] = None,
644-
raw: bool = False,
645-
) -> Tuple[
646-
Optional[Union[Dict[str, Any], bytes]],
647-
Optional[Union[Dict[str, Any], MultipartEncoder]],
648-
str,
649-
]:
650-
if files:
651-
if post_data is None:
652-
post_data = {}
653-
else:
654-
# booleans does not exists for data (neither for MultipartEncoder):
655-
# cast to string int to avoid: 'bool' object has no attribute 'encode'
656-
if TYPE_CHECKING:
657-
assert isinstance(post_data, dict)
658-
for k, v in post_data.items():
659-
if isinstance(v, bool):
660-
post_data[k] = str(int(v))
661-
post_data["file"] = files.get("file")
662-
post_data["avatar"] = files.get("avatar")
663-
664-
data = MultipartEncoder(post_data)
665-
return (None, data, data.content_type)
666-
667-
if raw and post_data:
668-
return (None, post_data, "application/octet-stream")
669-
670-
return (post_data, None, "application/json")
671-
672639
def http_request(
673640
self,
674641
verb: str,
@@ -746,7 +713,9 @@ def http_request(
746713
retry_transient_errors = self.retry_transient_errors
747714

748715
# We need to deal with json vs. data when uploading files
749-
json, data, content_type = self._prepare_send_data(files, post_data, raw)
716+
json, data, content_type = self.http_backend.prepare_send_data(
717+
files, post_data, raw
718+
)
750719
opts["headers"]["Content-type"] = content_type
751720

752721
cur_retries = 0

gitlab/http_backends/requests_backend.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any, Dict, Optional, Union
1+
from typing import Any, Dict, Optional, Tuple, TYPE_CHECKING, Union
22

33
import requests
44
from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore
@@ -21,6 +21,38 @@ def __init__(self, session: Optional[requests.Session] = None) -> None:
2121
def client(self) -> requests.Session:
2222
return self._client
2323

24+
@staticmethod
25+
def prepare_send_data(
26+
files: Optional[Dict[str, Any]] = None,
27+
post_data: Optional[Union[Dict[str, Any], bytes]] = None,
28+
raw: bool = False,
29+
) -> Tuple[
30+
Optional[Union[Dict[str, Any], bytes]],
31+
Optional[Union[Dict[str, Any], MultipartEncoder]],
32+
str,
33+
]:
34+
if files:
35+
if post_data is None:
36+
post_data = {}
37+
else:
38+
# booleans does not exists for data (neither for MultipartEncoder):
39+
# cast to string int to avoid: 'bool' object has no attribute 'encode'
40+
if TYPE_CHECKING:
41+
assert isinstance(post_data, dict)
42+
for k, v in post_data.items():
43+
if isinstance(v, bool):
44+
post_data[k] = str(int(v))
45+
post_data["file"] = files.get("file")
46+
post_data["avatar"] = files.get("avatar")
47+
48+
data = MultipartEncoder(post_data)
49+
return (None, data, data.content_type)
50+
51+
if raw and post_data:
52+
return (None, post_data, "application/octet-stream")
53+
54+
return (post_data, None, "application/json")
55+
2456
def http_request(
2557
self,
2658
method: str,

0 commit comments

Comments
 (0)