Merge in RR/pyinfra from 2.0.0-input-output-file-pattern-for-download-strategy to 2.0.0
Squashed commit of the following:
commit c7ce79ebbeace6a8cb7925ed69eda2d7cd2a4783
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Fri Jun 24 12:35:29 2022 +0200
refactor
commit 80f04e544962760adb2dc60c9dd03ccca22167d6
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Fri Jun 24 11:06:10 2022 +0200
refactoring of component factory, callback and client-pipeline getter
commit 6c024e1a789e1d55f0739c6846e5c02e8b7c943d
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 20:04:10 2022 +0200
operations section in config cleaned up; added upload formatter
commit c85800aefc224967cea591c1ec4cf1aaa3ac8215
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 19:22:51 2022 +0200
refactoring; removed obsolete config entries and code
commit 4be125952d82dc868935c8c73ad87fd8f0bd1d6c
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 19:14:47 2022 +0200
removed obsolete code
commit ac69a5c8e3f1e2fd7e828a17eeab97984f4f9746
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 18:58:41 2022 +0200
refactoring: rm dl strat module
commit efd36d0fc4f8f36d267bfa9d35415811fe723ccc
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 18:33:51 2022 +0200
refactoring: multi dl strat -> downloader, rm single dl strat
commit afffdeb993500a6abdb6fe85a549e3d6e97e9ee7
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 16:39:22 2022 +0200
operations section in config cleaned up
commit 671129af3e343490e0fb277a2b0329aa3027fd73
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Thu Jun 23 16:09:16 2022 +0200
rename prometheus metric name to include service name
commit 932a3e314b382315492aecab95b1f02f2916f8a6
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 14:43:23 2022 +0200
cleaned up file descr mngr
commit 79350b4ce71fcd095ed6a5e1d3a598ea246fae53
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 12:26:15 2022 +0200
refactoring WIP: moving response stratgey logic into storage strategy (needs to be refactored as well, later) and file descr mngr. Here the moved code needs to be cleaned up.
commit 7e48c66f0c378b25a433a4034eefdc8a0957e775
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 12:00:48 2022 +0200
refactoring; removed operation / response folder from output path
commit 8e6cbdaf23c48f6eeb52512b7f382d5727e206d6
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 11:08:37 2022 +0200
refactoring; added operation -> file pattern mapping to file descr mngr (mainly for self-documentaton purposes)
commit 2c80d7cec0cc171e099e5b13aadd2ae0f9bf4f02
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 10:59:57 2022 +0200
refactoring: introduced input- and output-file specific methods to file descr mngr
commit ecced37150eaac3008cc1b01b235e5f7135e504b
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 10:43:26 2022 +0200
refactoring
commit 3828341e98861ff8d63035ee983309ad5064bb30
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Thu Jun 23 10:42:46 2022 +0200
refactoring
commit 9a7c412523d467af40feb6924823ca89e28aadfe
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Wed Jun 22 17:04:54 2022 +0200
add prometheus metric name for default operation
commit d207b2e274ba53b2a21a18c367bb130fb05ee1cd
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Wed Jun 22 17:02:55 2022 +0200
Merge config
commit d3fdf36b12d8def18810454765e731599b833bfc
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date: Wed Jun 22 17:01:12 2022 +0200
added fixmes / todos
commit f49d0b9cb7764473ef9d127bc5d88525a4a16a23
Author: Julius Unverfehrt <julius.unverfehrt@iqser.com>
Date: Wed Jun 22 16:28:25 2022 +0200
update script
... and 47 more commits
166 lines
4.1 KiB
Python
166 lines
4.1 KiB
Python
from functools import partial
|
|
from itertools import starmap, repeat
|
|
|
|
import numpy as np
|
|
import pytest
|
|
from PIL import Image
|
|
from funcy import lmap, compose, flatten, lflatten, omit, second, first, lzip
|
|
|
|
from pyinfra.server.dispatcher.dispatcher import Nothing
|
|
from pyinfra.server.normalization import normalize_item
|
|
from pyinfra.server.packing import pack, unpack
|
|
from pyinfra.utils.func import star, lift, lstarlift
|
|
from test.utils.image import image_to_bytes
|
|
from test.utils.pdf import pdf_stream
|
|
|
|
|
|
@pytest.fixture
|
|
def input_data_items(unencoded_input_data, input_data_encoder):
|
|
return input_data_encoder(unencoded_input_data)
|
|
|
|
|
|
@pytest.fixture
|
|
def unencoded_input_data(item_type, unencoded_strings, unencoded_images, unencoded_pdfs):
|
|
if item_type == "string":
|
|
return unencoded_strings
|
|
elif item_type == "image":
|
|
return unencoded_images
|
|
elif item_type == "pdf":
|
|
return unencoded_pdfs
|
|
else:
|
|
raise ValueError(f"Unknown item type {item_type}")
|
|
|
|
|
|
@pytest.fixture
|
|
def input_data_encoder(item_type):
|
|
if item_type == "string":
|
|
return strings_to_bytes
|
|
elif item_type == "image":
|
|
return images_to_bytes
|
|
elif item_type == "pdf":
|
|
return pdfs_to_bytes
|
|
else:
|
|
raise ValueError(f"Unknown item type {item_type}")
|
|
|
|
|
|
@pytest.fixture
|
|
def unencoded_pdfs(n_items, unencoded_pdf):
|
|
return [unencoded_pdf] * n_items
|
|
|
|
|
|
def pdfs_to_bytes(unencoded_pdfs):
|
|
return [pdf_stream(pdf) for pdf in unencoded_pdfs]
|
|
|
|
|
|
@pytest.fixture
|
|
def target_data_items(input_data_items, core_operation, metadata):
|
|
|
|
if core_operation is Nothing:
|
|
return Nothing
|
|
|
|
op = compose(normalize_item, core_operation)
|
|
expected = lflatten(starmap(op, zip(input_data_items, metadata)))
|
|
return expected
|
|
|
|
|
|
@pytest.fixture
|
|
def unencoded_strings(n_items):
|
|
return [f"content{i}" for i in range(n_items)]
|
|
|
|
|
|
def strings_to_bytes(strings):
|
|
return [bytes(s, encoding="utf8") for s in strings]
|
|
|
|
|
|
@pytest.fixture
|
|
def targets(data_message_pairs, input_data_items, operation, metadata, server_side_test, queue_message_metadata):
|
|
"""TODO: this has become super wonky"""
|
|
metadata = [{**m1, **m2} for m1, m2 in zip(lmap(second, data_message_pairs), metadata)]
|
|
|
|
if operation is Nothing:
|
|
return Nothing
|
|
|
|
op = compose(lift(star(pack)), normalize_item, operation)
|
|
|
|
try:
|
|
response_data, response_metadata = zip(*map(unpack, flatten(starmap(op, zip(input_data_items, metadata)))))
|
|
|
|
queue_message_keys = ["id"] * (not server_side_test) + [
|
|
*first(queue_message_metadata).keys()
|
|
]
|
|
response_metadata = lmap(partial(omit, keys=queue_message_keys), response_metadata)
|
|
expected = lzip(response_data, response_metadata)
|
|
|
|
except ValueError:
|
|
expected = []
|
|
|
|
return expected
|
|
|
|
|
|
@pytest.fixture
|
|
def endpoint(url, operation_name):
|
|
return f"{url}/{operation_name}"
|
|
|
|
|
|
@pytest.fixture(params=["rest", "basic"])
|
|
def client_pipeline_type(request):
|
|
return request.param
|
|
|
|
|
|
@pytest.fixture(params=[1, 0, 5])
|
|
def n_items(request):
|
|
return request.param
|
|
|
|
|
|
@pytest.fixture(params=[0, 100])
|
|
def n_pages(request):
|
|
return request.param
|
|
|
|
|
|
@pytest.fixture(params=[1, 5])
|
|
def buffer_size(request):
|
|
return request.param
|
|
|
|
|
|
def array_to_image(array) -> Image.Image:
|
|
return Image.fromarray(np.uint8(array * 255), mode="RGB")
|
|
|
|
|
|
def input_batch(n_items):
|
|
return np.random.random_sample(size=(n_items, 3, 30, 30))
|
|
|
|
|
|
@pytest.fixture
|
|
def unencoded_images(n_items):
|
|
return lmap(array_to_image, input_batch(n_items))
|
|
|
|
|
|
def images_to_bytes(images):
|
|
return lmap(image_to_bytes, images)
|
|
|
|
|
|
@pytest.fixture
|
|
def metadata(n_items, many_to_n):
|
|
"""storage metadata
|
|
TODO: rename
|
|
"""
|
|
return list(repeat({"key": "value"}, times=n_items))
|
|
|
|
|
|
@pytest.fixture
|
|
def queue_message_metadata(n_items, operation_name):
|
|
def metadata(i):
|
|
return {
|
|
"dossierId": "folder",
|
|
"fileId": f"file{i}",
|
|
"pages": [0, 2, 3],
|
|
"operation": operation_name,
|
|
}
|
|
|
|
return lmap(metadata, range(n_items))
|
|
|
|
|
|
@pytest.fixture
|
|
def packages(input_data_items, metadata):
|
|
return lstarlift(pack)(zip(input_data_items, metadata))
|