Skip to content

Commit 9f6ace4

Browse files
serhiyeccles
authored andcommitted
Add Ring buffer to store last 10 response objects
Problem: Currently, response objects are not accessible through the SDK, making certain actions , like checking header data, impossible to do from the user side. Solution: Store the last 10 response objects in a ring buffer and provide a function in archivist to retrieve a user selected amount Signed off: Serhiy: <Serhiy1@live.co.uk>
1 parent 5fe3ffc commit 9f6ace4

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

archivist/archivist.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333

3434
import json
3535
from os.path import isfile as os_path_isfile
36-
from typing import BinaryIO, Dict, Optional
36+
from typing import BinaryIO, Dict, List, Optional
37+
from collections import deque
3738
from requests.models import Response
3839

3940
from flatten_dict import flatten
@@ -93,6 +94,8 @@ class Archivist: # pylint: disable=too-many-instance-attributes
9394
9495
"""
9596

97+
RING_BUFFER_MAX_LEN = 10
98+
9699
def __init__(
97100
self,
98101
url: str,
@@ -121,6 +124,7 @@ def __init__(
121124
raise ArchivistNotFoundError(f"Cert file {cert} does not exist")
122125

123126
self._cert = cert
127+
self._response_ring_buffer = deque(maxlen=self.RING_BUFFER_MAX_LEN)
124128

125129
# keep these in sync with CLIENTS map above
126130
self.assets: _AssetsClient
@@ -191,6 +195,8 @@ def get(
191195
cert=self.cert,
192196
)
193197

198+
self._response_ring_buffer.appendleft(response)
199+
194200
error = _parse_response(response)
195201
if error is not None:
196202
raise error
@@ -227,6 +233,9 @@ def get_file(
227233
cert=self.cert,
228234
stream=True,
229235
)
236+
237+
self._response_ring_buffer.appendleft(response)
238+
230239
error = _parse_response(response)
231240
if error is not None:
232241
raise error
@@ -297,6 +306,8 @@ def post_file(self, path: str, fd: BinaryIO, mtype: str) -> Dict:
297306
cert=self.cert,
298307
)
299308

309+
self._response_ring_buffer.appendleft(response)
310+
300311
error = _parse_response(response)
301312
if error is not None:
302313
raise error
@@ -326,6 +337,8 @@ def delete(
326337
cert=self.cert,
327338
)
328339

340+
self._response_ring_buffer.appendleft(response)
341+
329342
error = _parse_response(response)
330343
if error is not None:
331344
raise error
@@ -363,6 +376,8 @@ def patch(
363376
cert=self.cert,
364377
)
365378

379+
self._response_ring_buffer.appendleft(response)
380+
366381
error = _parse_response(response)
367382
if error is not None:
368383
raise error
@@ -379,12 +394,23 @@ def __list(self, path, args, *, headers=None) -> Response:
379394
verify=self.verify,
380395
cert=self.cert,
381396
)
397+
398+
self._response_ring_buffer.appendleft(response)
399+
382400
error = _parse_response(response)
383401
if error is not None:
384402
raise error
385403

386404
return response
387405

406+
def last_response(self, *, responses: int = 1) -> List[Response]:
407+
"""Returns the requested number of response objects from the response ring buffer
408+
args:
409+
responses (int): Number of responses to be returned in a list
410+
"""
411+
412+
return list(self._response_ring_buffer)[:responses]
413+
388414
@staticmethod
389415
def __query(query: Optional[Dict]):
390416
return query and "&".join(

unittests/testarchivist.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,16 @@ def test_get(self, mock_get):
307307
msg="GET method called incorrectly",
308308
)
309309

310+
@mock.patch("requests.get")
311+
def test_ring_buffer(self, mock_get):
312+
"""
313+
Test That the ring buffer for response objects works as expected
314+
"""
315+
mock_get.return_value = MockResponse(200)
316+
resp = self.arch.get("path/path", "entity/xxxxxxxx")
317+
last_response = self.arch.last_response()
318+
self.assertEqual(last_response, [mock_get.return_value])
319+
310320
@mock.patch("requests.get")
311321
def test_get_with_error(self, mock_get):
312322
"""

0 commit comments

Comments
 (0)