diff options
| author | John L. Villalovos <john@sodarock.com> | 2023-03-04 18:23:25 -0800 |
|---|---|---|
| committer | Nejc Habjan <hab.nejc@gmail.com> | 2023-03-12 11:11:49 +0100 |
| commit | 90f96acf9e649de9874cec612fc1b49c4a843447 (patch) | |
| tree | 4727076055cfdc9bdee96f9f0ea2a7e7865ac20f | |
| parent | f2b5e4fa375e88d6102a8d023ae2fe8206042545 (diff) | |
| download | gitlab-90f96acf9e649de9874cec612fc1b49c4a843447.tar.gz | |
fix: support int for `parent_id` in `import_group`
This will also fix other use cases where an integer is passed in to
MultipartEncoder.
Added unit tests to show it works.
Closes: #2506
| -rw-r--r-- | gitlab/_backends/requests_backend.py | 12 | ||||
| -rw-r--r-- | gitlab/v4/objects/groups.py | 4 | ||||
| -rw-r--r-- | tests/unit/_backends/test_requests_backend.py | 21 |
3 files changed, 27 insertions, 10 deletions
diff --git a/gitlab/_backends/requests_backend.py b/gitlab/_backends/requests_backend.py index d70cf42..839b69e 100644 --- a/gitlab/_backends/requests_backend.py +++ b/gitlab/_backends/requests_backend.py @@ -70,17 +70,21 @@ class RequestsBackend(protocol.Backend): if post_data is None: post_data = {} else: - # booleans does not exists for data (neither for MultipartEncoder): - # cast to string int to avoid: 'bool' object has no attribute 'encode' + # When creating a `MultipartEncoder` instance with data-types + # which don't have an `encode` method it will cause an error: + # object has no attribute 'encode' + # So convert common non-string types into strings. if TYPE_CHECKING: assert isinstance(post_data, dict) for k, v in post_data.items(): if isinstance(v, bool): - post_data[k] = str(int(v)) + v = int(v) + if isinstance(v, (complex, float, int)): + post_data[k] = str(v) post_data["file"] = files.get("file") post_data["avatar"] = files.get("avatar") - data = MultipartEncoder(post_data) + data = MultipartEncoder(fields=post_data) return SendData(data=data, content_type=data.content_type) if raw and post_data: diff --git a/gitlab/v4/objects/groups.py b/gitlab/v4/objects/groups.py index 0eb516f..4dc4fd1 100644 --- a/gitlab/v4/objects/groups.py +++ b/gitlab/v4/objects/groups.py @@ -378,7 +378,7 @@ class GroupManager(CRUDMixin, RESTManager): file: BinaryIO, path: str, name: str, - parent_id: Optional[str] = None, + parent_id: Optional[Union[int, str]] = None, **kwargs: Any, ) -> Union[Dict[str, Any], requests.Response]: """Import a group from an archive file. @@ -399,7 +399,7 @@ class GroupManager(CRUDMixin, RESTManager): A representation of the import status. """ files = {"file": ("file.tar.gz", file, "application/octet-stream")} - data = {"path": path, "name": name} + data: Dict[str, Any] = {"path": path, "name": name} if parent_id is not None: data["parent_id"] = parent_id diff --git a/tests/unit/_backends/test_requests_backend.py b/tests/unit/_backends/test_requests_backend.py index d83703d..2dd36f8 100644 --- a/tests/unit/_backends/test_requests_backend.py +++ b/tests/unit/_backends/test_requests_backend.py @@ -25,10 +25,21 @@ class TestSendData: class TestRequestsBackend: - def test_prepare_send_data_str_parentid(self) -> None: - file = "12345" - files = {"file": ("file.tar.gz", file, "application/octet-stream")} - post_data = {"parent_id": "12"} + @pytest.mark.parametrize( + "test_data,expected", + [ + (False, "0"), + (True, "1"), + ("12", "12"), + (12, "12"), + (12.0, "12.0"), + (complex(-2, 7), "(-2+7j)"), + ], + ) + def test_prepare_send_data_non_strings(self, test_data, expected) -> None: + assert isinstance(expected, str) + files = {"file": ("file.tar.gz", "12345", "application/octet-stream")} + post_data = {"test_data": test_data} result = requests_backend.RequestsBackend.prepare_send_data( files=files, post_data=post_data, raw=False @@ -36,3 +47,5 @@ class TestRequestsBackend: assert result.json is None assert result.content_type.startswith("multipart/form-data") assert isinstance(result.data, MultipartEncoder) + assert isinstance(result.data.fields["test_data"], str) + assert result.data.fields["test_data"] == expected |
