diff options
author | Nejc Habjan <nejc.habjan@siemens.com> | 2023-02-12 12:30:29 +0100 |
---|---|---|
committer | Nejc Habjan <nejc.habjan@siemens.com> | 2023-03-12 09:39:54 +0100 |
commit | ab089fbf04d8946a4748723dfd3029a943a43b2f (patch) | |
tree | 26a7d0c534abfbeffbe54808ffa3e755db85479e | |
parent | 07d03dc959128e05d21e8dfd79aa8e916ab5b150 (diff) | |
download | gitlab-refactor/response-content-backend.tar.gz |
refactor: move response_content into backend coderefactor/response-content-backend
-rw-r--r-- | gitlab/_backends/protocol.py | 14 | ||||
-rw-r--r-- | gitlab/_backends/requests_backend.py | 30 | ||||
-rw-r--r-- | gitlab/mixins.py | 2 | ||||
-rw-r--r-- | gitlab/utils.py | 37 | ||||
-rw-r--r-- | gitlab/v4/objects/artifacts.py | 4 | ||||
-rw-r--r-- | gitlab/v4/objects/files.py | 2 | ||||
-rw-r--r-- | gitlab/v4/objects/jobs.py | 7 | ||||
-rw-r--r-- | gitlab/v4/objects/packages.py | 3 | ||||
-rw-r--r-- | gitlab/v4/objects/projects.py | 2 | ||||
-rw-r--r-- | gitlab/v4/objects/repositories.py | 4 | ||||
-rw-r--r-- | gitlab/v4/objects/secure_files.py | 3 | ||||
-rw-r--r-- | gitlab/v4/objects/snippets.py | 5 | ||||
-rw-r--r-- | tests/unit/test_backends.py | 23 | ||||
-rw-r--r-- | tests/unit/test_utils.py | 21 |
14 files changed, 88 insertions, 69 deletions
diff --git a/gitlab/_backends/protocol.py b/gitlab/_backends/protocol.py index f89740b..3f8af3d 100644 --- a/gitlab/_backends/protocol.py +++ b/gitlab/_backends/protocol.py @@ -1,6 +1,6 @@ import abc import sys -from typing import Any, Dict, Optional, Union +from typing import Any, Callable, Dict, Iterator, Optional, Union import requests from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore @@ -18,6 +18,18 @@ class BackendResponse(Protocol): class Backend(Protocol): + @staticmethod + @abc.abstractmethod + def response_content( + response: requests.Response, + streamed: bool, + action: Optional[Callable[[bytes], None]], + chunk_size: int, + *, + iterator: bool, + ) -> Optional[Union[bytes, Iterator[Any]]]: + ... + @abc.abstractmethod def http_request( self, diff --git a/gitlab/_backends/requests_backend.py b/gitlab/_backends/requests_backend.py index fd40baa..45592ee 100644 --- a/gitlab/_backends/requests_backend.py +++ b/gitlab/_backends/requests_backend.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Dict, Optional, Tuple, TYPE_CHECKING, Union +from typing import Any, Callable, Dict, Iterator, Optional, Tuple, TYPE_CHECKING, Union import requests from requests.structures import CaseInsensitiveDict @@ -9,6 +9,11 @@ from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore from . import protocol +class _StdoutStream: + def __call__(self, chunk: Any) -> None: + print(chunk) + + class RequestsResponse(protocol.BackendResponse): def __init__(self, response: requests.Response) -> None: self._response: requests.Response = response @@ -77,6 +82,29 @@ class RequestsBackend(protocol.Backend): return (post_data, None, "application/json") + @staticmethod + def response_content( + response: requests.Response, + streamed: bool, + action: Optional[Callable[[bytes], None]], + chunk_size: int, + *, + iterator: bool, + ) -> Optional[Union[bytes, Iterator[Any]]]: + if iterator: + return response.iter_content(chunk_size=chunk_size) + + if streamed is False: + return response.content + + if action is None: + action = _StdoutStream() + + for chunk in response.iter_content(chunk_size=chunk_size): + if chunk: + action(chunk) + return None + def http_request( self, method: str, diff --git a/gitlab/mixins.py b/gitlab/mixins.py index 3d1302f..8534416 100644 --- a/gitlab/mixins.py +++ b/gitlab/mixins.py @@ -637,7 +637,7 @@ class DownloadMixin(_RestObjectBase): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/gitlab/utils.py b/gitlab/utils.py index 9317535..3d40606 100644 --- a/gitlab/utils.py +++ b/gitlab/utils.py @@ -2,39 +2,20 @@ import pathlib import traceback import urllib.parse import warnings -from typing import Any, Callable, Dict, Iterator, Optional, Tuple, Type, Union +from typing import Any, Dict, Iterator, Optional, Tuple, Type, Union -import requests - -from gitlab import types - - -class _StdoutStream: - def __call__(self, chunk: Any) -> None: - print(chunk) +from gitlab import _backends, types def response_content( - response: requests.Response, - streamed: bool, - action: Optional[Callable[[bytes], None]], - chunk_size: int, - *, - iterator: bool, + *args: Any, **kwargs: Any ) -> Optional[Union[bytes, Iterator[Any]]]: - if iterator: - return response.iter_content(chunk_size=chunk_size) - - if streamed is False: - return response.content - - if action is None: - action = _StdoutStream() - - for chunk in response.iter_content(chunk_size=chunk_size): - if chunk: - action(chunk) - return None + warn( + "`utils.response_content()` is deprecated and will be removed in a future" + "version.\nUse the current backend's `response_content()` method instead.", + category=DeprecationWarning, + ) + return _backends.DefaultBackend.response_content(*args, **kwargs) def _transform_types( diff --git a/gitlab/v4/objects/artifacts.py b/gitlab/v4/objects/artifacts.py index f091867..fe07360 100644 --- a/gitlab/v4/objects/artifacts.py +++ b/gitlab/v4/objects/artifacts.py @@ -111,7 +111,7 @@ class ProjectArtifactManager(RESTManager): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) @@ -162,6 +162,6 @@ class ProjectArtifactManager(RESTManager): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/gitlab/v4/objects/files.py b/gitlab/v4/objects/files.py index d81b711..2d95a6d 100644 --- a/gitlab/v4/objects/files.py +++ b/gitlab/v4/objects/files.py @@ -266,7 +266,7 @@ class ProjectFileManager(GetMixin, CreateMixin, UpdateMixin, DeleteMixin, RESTMa ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/gitlab/v4/objects/jobs.py b/gitlab/v4/objects/jobs.py index 952c295..02a4ee4 100644 --- a/gitlab/v4/objects/jobs.py +++ b/gitlab/v4/objects/jobs.py @@ -4,7 +4,6 @@ import requests from gitlab import cli from gitlab import exceptions as exc -from gitlab import utils from gitlab.base import RESTManager, RESTObject from gitlab.mixins import RefreshMixin, RetrieveMixin from gitlab.types import ArrayAttribute @@ -149,7 +148,7 @@ class ProjectJob(RefreshMixin, RESTObject): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) @@ -192,7 +191,7 @@ class ProjectJob(RefreshMixin, RESTObject): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) @@ -233,7 +232,7 @@ class ProjectJob(RefreshMixin, RESTObject): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return_value = utils.response_content( + return_value = self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) if TYPE_CHECKING: diff --git a/gitlab/v4/objects/packages.py b/gitlab/v4/objects/packages.py index 9ae2fd5..93c623f 100644 --- a/gitlab/v4/objects/packages.py +++ b/gitlab/v4/objects/packages.py @@ -11,7 +11,6 @@ import requests from gitlab import cli from gitlab import exceptions as exc -from gitlab import utils from gitlab.base import RESTManager, RESTObject from gitlab.mixins import DeleteMixin, GetMixin, ListMixin, ObjectDeleteMixin @@ -136,7 +135,7 @@ class GenericPackageManager(RESTManager): result = self.gitlab.http_get(path, streamed=streamed, raw=True, **kwargs) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py index 6330cc5..a024a1b 100644 --- a/gitlab/v4/objects/projects.py +++ b/gitlab/v4/objects/projects.py @@ -541,7 +541,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/gitlab/v4/objects/repositories.py b/gitlab/v4/objects/repositories.py index 9c0cd9a..b113dbe 100644 --- a/gitlab/v4/objects/repositories.py +++ b/gitlab/v4/objects/repositories.py @@ -140,7 +140,7 @@ class RepositoryMixin(_RestObjectBase): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) @@ -242,7 +242,7 @@ class RepositoryMixin(_RestObjectBase): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/gitlab/v4/objects/secure_files.py b/gitlab/v4/objects/secure_files.py index a7da5ea..98d0c2a 100644 --- a/gitlab/v4/objects/secure_files.py +++ b/gitlab/v4/objects/secure_files.py @@ -8,7 +8,6 @@ import requests from gitlab import cli from gitlab import exceptions as exc -from gitlab import utils from gitlab.base import RESTManager, RESTObject from gitlab.mixins import NoUpdateMixin, ObjectDeleteMixin from gitlab.types import FileAttribute, RequiredOptional @@ -53,7 +52,7 @@ class ProjectSecureFile(ObjectDeleteMixin, RESTObject): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/gitlab/v4/objects/snippets.py b/gitlab/v4/objects/snippets.py index 648def2..8417ab2 100644 --- a/gitlab/v4/objects/snippets.py +++ b/gitlab/v4/objects/snippets.py @@ -4,7 +4,6 @@ import requests from gitlab import cli from gitlab import exceptions as exc -from gitlab import utils from gitlab.base import RESTManager, RESTObject, RESTObjectList from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin, UserAgentDetailMixin from gitlab.types import RequiredOptional @@ -61,7 +60,7 @@ class Snippet(UserAgentDetailMixin, SaveMixin, ObjectDeleteMixin, RESTObject): ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) @@ -141,7 +140,7 @@ class ProjectSnippet(UserAgentDetailMixin, SaveMixin, ObjectDeleteMixin, RESTObj ) if TYPE_CHECKING: assert isinstance(result, requests.Response) - return utils.response_content( + return self.manager.gitlab._backend.response_content( result, streamed, action, chunk_size, iterator=iterator ) diff --git a/tests/unit/test_backends.py b/tests/unit/test_backends.py new file mode 100644 index 0000000..a70e4ef --- /dev/null +++ b/tests/unit/test_backends.py @@ -0,0 +1,23 @@ +import requests +import responses + +from gitlab import _backends + + +@responses.activate +def test_streamed_response_content_with_requests(capsys): + responses.add( + method="GET", + url="https://example.com", + status=200, + body="test", + content_type="application/octet-stream", + ) + + resp = requests.get("https://example.com", stream=True) + _backends.RequestsBackend.response_content( + resp, streamed=True, action=None, chunk_size=1024, iterator=False + ) + + captured = capsys.readouterr() + assert "test" in captured.out diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 7f75f55..faf2592 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -2,31 +2,10 @@ import json import warnings import pytest -import requests -import responses from gitlab import types, utils -@responses.activate -def test_response_content(capsys): - responses.add( - method="GET", - url="https://example.com", - status=200, - body="test", - content_type="application/octet-stream", - ) - - resp = requests.get("https://example.com", stream=True) - utils.response_content( - resp, streamed=True, action=None, chunk_size=1024, iterator=False - ) - - captured = capsys.readouterr() - assert "test" in captured.out - - class TestEncodedId: def test_init_str(self): obj = utils.EncodedId("Hello") |