added compression / decompression; jsons put on storage rather than only result data

This commit is contained in:
Matthias Bisping 2022-03-11 11:43:27 +01:00
parent 66a27d26d3
commit b4b060ac0e
2 changed files with 27 additions and 11 deletions

View File

@ -1,3 +1,4 @@
import gzip
import json
import pytest
@ -12,7 +13,7 @@ def visitor(storage, analysis_callback, response_strategy):
@pytest.fixture()
def body():
return {"dossierId": "folder", "fileId": "file", "targetFileExtension": "in", "responseFileExtension": "out"}
return {"dossierId": "folder", "fileId": "file", "targetFileExtension": "in.gz", "responseFileExtension": "out.gz"}
@pytest.mark.parametrize("client_name", ["mock", "azure", "s3"], scope="session")
@ -21,13 +22,13 @@ class TestVisitor:
def test_given_a_input_queue_message_callback_pulls_the_data_from_storage(self, visitor, body, storage, bucket_name):
storage.clear_bucket(bucket_name)
storage.put_object(**get_object_descriptor(body), data=b"content")
storage.put_object(**get_object_descriptor(body), data=gzip.compress(b"content"))
data_received = visitor.load_data(body)
assert b"content" == data_received
def test_visitor_pulls_and_processes_data(self, visitor, body, storage, bucket_name):
storage.clear_bucket(bucket_name)
storage.put_object(**get_object_descriptor(body), data="2".encode())
storage.put_object(**get_object_descriptor(body), data=gzip.compress("2".encode()))
response_body = visitor.load_and_process(body)
assert response_body["data"] == "22"
@ -37,7 +38,7 @@ class TestVisitor:
visitor.response_strategy.storage = storage
storage.clear_bucket(bucket_name)
storage.put_object(**get_object_descriptor(body), data="2".encode())
storage.put_object(**get_object_descriptor(body), data=gzip.compress("2".encode()))
response_body = visitor(body)
assert "data" not in response_body
assert json.loads(storage.get_object(**get_response_object_descriptor(body))) == "22"
assert json.loads(gzip.decompress(storage.get_object(**get_response_object_descriptor(body))))["data"] == "22"

View File

@ -1,9 +1,12 @@
import abc
import gzip
import json
import logging
from operator import itemgetter
from typing import Callable
from pyinfra.config import CONFIG
from pyinfra.exceptions import DataLoadingFailure
from pyinfra.storage.storage import Storage
@ -44,7 +47,10 @@ class ResponseStrategy(abc.ABC):
class StorageStrategy(ResponseStrategy):
def handle_response(self, body):
self.storage.put_object(**get_response_object_descriptor(body), data=json.dumps(body.pop("data")).encode())
self.storage.put_object(
**get_response_object_descriptor(body), data=gzip.compress(json.dumps(body).encode())
)
body.pop("data")
return body
@ -63,7 +69,20 @@ class QueueVisitor:
self.response_strategy.storage = self.storage
def load_data(self, body):
return self.storage.get_object(**get_object_descriptor(body))
def download():
logging.debug(f"Downloading {object_descriptor}...")
data = self.storage.get_object(**object_descriptor)
logging.debug(f"Downloaded {object_descriptor}.")
return data
object_descriptor = get_object_descriptor(body)
try:
return gzip.decompress(download())
except Exception as err:
logging.warning(f"Loading data from storage failed for {object_descriptor}.")
raise DataLoadingFailure() from err
def process_data(self, data):
return self.callback(data)
@ -76,7 +95,3 @@ class QueueVisitor:
def __call__(self, body):
result_body = self.load_and_process(body)
return self.response_strategy(result_body)
# TODO: 1) add compression / decompression to visitor
# 2) correct keys and values for storage response