From 8e859503f621ae003ecd4883807007570932c9e4 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Tue, 29 Sep 2020 19:10:00 +0300 Subject: [PATCH] Don't raise error for batch requests with no items --- trains/backend_api/session/callresult.py | 26 ++++++++++++++++++++---- trains/backend_api/session/response.py | 2 +- trains/backend_api/session/session.py | 16 +++++++-------- trains/version.py | 2 +- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/trains/backend_api/session/callresult.py b/trains/backend_api/session/callresult.py index 834f166e..e4d6977e 100644 --- a/trains/backend_api/session/callresult.py +++ b/trains/backend_api/session/callresult.py @@ -51,17 +51,35 @@ class CallResult(object): else: self.__response_data = None + @classmethod + def _make_raw_response(cls, request_cls=None, service=None, action=None, status_code=200, text=None): + service = service or (request_cls._service if request_cls else 'unknown') + action = action or (request_cls._action if request_cls else 'unknown') + return cls(request_cls=request_cls, meta=ResponseMeta.from_raw_data( + status_code=status_code, text=text, endpoint='%(service)s.%(action)s' % locals())) + @classmethod def from_result(cls, res, request_cls=None, logger=None, service=None, action=None, session=None): """ From requests result """ response_cls = get_response_cls(request_cls) + + if res is None: + return cls._make_raw_response( + request_cls=request_cls, + service=service, + action=action + ) + try: data = res.json() except ValueError: - service = service or (request_cls._service if request_cls else 'unknown') - action = action or (request_cls._action if request_cls else 'unknown') - return cls(request_cls=request_cls, meta=ResponseMeta.from_raw_data( - status_code=res.status_code, text=res.text, endpoint='%(service)s.%(action)s' % locals())) + return cls._make_raw_response( + request_cls=request_cls, + service=service, + action=action, + status_code=res.status_code, + text=res.text + ) if 'meta' not in data: raise ValueError('Missing meta section in response payload') try: diff --git a/trains/backend_api/session/response.py b/trains/backend_api/session/response.py index 9025354a..b4b7d513 100644 --- a/trains/backend_api/session/response.py +++ b/trains/backend_api/session/response.py @@ -30,7 +30,7 @@ class ResponseMeta(jsonmodels.models.Base): return self._is_valid @classmethod - def from_raw_data(cls, status_code, text, endpoint=None): + def from_raw_data(cls, status_code, text="", endpoint=None): return cls(is_valid=False, result_code=status_code, result_subcode=0, result_msg=text, endpoint=_ResponseEndpoint(name=(endpoint or 'unknown'))) diff --git a/trains/backend_api/session/session.py b/trains/backend_api/session/session.py index 3167372b..0317c2c6 100644 --- a/trains/backend_api/session/session.py +++ b/trains/backend_api/session/session.py @@ -341,9 +341,8 @@ class Session(TokenManager): raise ValueError("Expecting list, tuple or generator in 'data' or 'json'") if not data and not json: - raise ValueError( - "Missing data (data or json), batch requests are meaningless without it." - ) + # Missing data (data or json), batch requests are meaningless without it. + return None headers = headers.copy() if headers else {} headers["Content-Type"] = "application/json-lines" @@ -439,11 +438,12 @@ class Session(TokenManager): headers=headers, ) # TODO: handle multiple results in this case - try: - res = next(r for r in res if r.status_code != 200) - except StopIteration: - # all are 200 - res = res[0] + if res is not None: + try: + res = next(r for r in res if r.status_code != 200) + except StopIteration: + # all are 200 + res = res[0] else: res = self.send_request( service=req_obj._service, diff --git a/trains/version.py b/trains/version.py index 8a637f75..87439a97 100644 --- a/trains/version.py +++ b/trains/version.py @@ -1 +1 @@ -__version__ = '0.16.2rc1' +__version__ = '0.16.2rc2'