From c1b92270354c764861da0f7782348e9cd0725d76 Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Mon, 12 Sep 2022 13:28:44 +0200 Subject: [PATCH] fixed statefulness issue with os.environ in tests --- .../transformer/transformers/response.py | 39 ++++++++++++------- test/unit_tests/response_transformer_test.py | 27 +++++++------ 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/image_prediction/transformer/transformers/response.py b/image_prediction/transformer/transformers/response.py index a304603..91244c9 100644 --- a/image_prediction/transformer/transformers/response.py +++ b/image_prediction/transformer/transformers/response.py @@ -20,34 +20,42 @@ class ResponseTransformer(Transformer): return build_image_info(data) -def get_class_specific_min_image_to_page_quotient(label): - return get_class_specific_quotient("REL_IMAGE_SIZE", label, "min", CONFIG.filters.image_to_page_quotient.min) +def get_class_specific_min_image_to_page_quotient(label, table=None): + return get_class_specific_value( + "REL_IMAGE_SIZE", label, "min", CONFIG.filters.image_to_page_quotient.min, table=table + ) -def get_class_specific_max_image_to_page_quotient(label): - return get_class_specific_quotient("REL_IMAGE_SIZE", label, "max", CONFIG.filters.image_to_page_quotient.max) +def get_class_specific_max_image_to_page_quotient(label, table=None): + return get_class_specific_value( + "REL_IMAGE_SIZE", label, "max", CONFIG.filters.image_to_page_quotient.max, table=table + ) -def get_class_specific_min_image_width_to_height_quotient(label): - return get_class_specific_quotient("IMAGE_FORMAT", label, "min", CONFIG.filters.image_width_to_height_quotient.min) +def get_class_specific_min_image_width_to_height_quotient(label, table=None): + return get_class_specific_value( + "IMAGE_FORMAT", label, "min", CONFIG.filters.image_width_to_height_quotient.min, table=table + ) -def get_class_specific_max_image_width_to_height_quotient(label): - return get_class_specific_quotient("IMAGE_FORMAT", label, "max", CONFIG.filters.image_width_to_height_quotient.max) +def get_class_specific_max_image_width_to_height_quotient(label, table=None): + return get_class_specific_value( + "IMAGE_FORMAT", label, "max", CONFIG.filters.image_width_to_height_quotient.max, table=table + ) -def get_class_specific_min_classification_confidence(label): - return get_class_specific_quotient("CONFIDENCE", label, "min", CONFIG.filters.min_confidence) +def get_class_specific_min_classification_confidence(label, table=None): + return get_class_specific_value("CONFIDENCE", label, "min", CONFIG.filters.min_confidence, table=table) -def get_class_specific_quotient(prefix, label, bound, fallback_value): +def get_class_specific_value(prefix, label, bound, fallback_value, table=None): def fallback(): logger.warning(f"Failed to resolve {bound} {prefix.lower().replace('_', '-')} value for class '{label}'.") return fallback_value assert bound in ["min", "max"] - threshold_map = parse_env_var(prefix) or {} + threshold_map = parse_env_var(prefix, table=table) or {} return threshold_map.get(label, {}).get(bound) or fallback() @@ -121,15 +129,16 @@ def build_image_info(data: dict) -> dict: @lru_cache(maxsize=None) -def parse_env_var(prefix): - head, tail = juxt(first, compose(list, rest))(filter(prefix, os.environ)) +def parse_env_var(prefix, table=None): + table = table or os.environ + head, tail = juxt(first, compose(list, rest))(filter(prefix, table)) if not head: logger.warning(f"Found no environment variable with prefix '{prefix}'.") elif tail: logger.warning(f"Found multiple candidates for environment variable with prefix '{prefix}'.") else: try: - return parse_env_var_value(os.environ[head]) + return parse_env_var_value(table[head]) except ParsingError as err: logger.warning(err) diff --git a/test/unit_tests/response_transformer_test.py b/test/unit_tests/response_transformer_test.py index fde12b8..ac8d822 100644 --- a/test/unit_tests/response_transformer_test.py +++ b/test/unit_tests/response_transformer_test.py @@ -1,7 +1,7 @@ import json -import os import pytest +from frozendict import frozendict from image_prediction.transformer.transformers.response import ( get_class_specific_min_image_to_page_quotient, @@ -19,19 +19,18 @@ def label(): @pytest.fixture def page_quotient_threshold_map(label): - # TODO: suboptimal, as actual environment is used - os.environ["REL_IMAGE_SIZE_MAP"] = json.dumps({label: {"min": 0.1, "max": 0.2}}) - os.environ["IMAGE_FORMAT_MAP"] = json.dumps({label: {"min": 0.5, "max": 0.4}}) - os.environ["CONFIDENCE"] = json.dumps({label: {"min": 0.8}}) - yield - for env_var in ("REL_IMAGE_SIZE_MAP", "IMAGE_FORMAT_MAP", "CONFIDENCE"): - os.environ.pop(env_var) + return frozendict( + { + "REL_IMAGE_SIZE_MAP": json.dumps({label: {"min": 0.1, "max": 0.2}}), + "IMAGE_FORMAT_MAP": json.dumps({label: {"min": 0.5, "max": 0.4}}), + "CONFIDENCE": json.dumps({label: {"min": 0.8}}), + } + ) -# FIXME: Runs correctly in isolation, but fails when other tests are run before def test_read_environment_vars_for_thresholds(page_quotient_threshold_map, label): - assert get_class_specific_min_image_to_page_quotient(label) == 0.1 - assert get_class_specific_max_image_to_page_quotient(label) == 0.2 - assert get_class_specific_min_image_width_to_height_quotient(label) == 0.5 - assert get_class_specific_max_image_width_to_height_quotient(label) == 0.4 - assert get_class_specific_min_classification_confidence(label) == 0.8 + assert get_class_specific_min_image_to_page_quotient(label, table=page_quotient_threshold_map) == 0.1 + assert get_class_specific_max_image_to_page_quotient(label, table=page_quotient_threshold_map) == 0.2 + assert get_class_specific_min_image_width_to_height_quotient(label, table=page_quotient_threshold_map) == 0.5 + assert get_class_specific_max_image_width_to_height_quotient(label, table=page_quotient_threshold_map) == 0.4 + assert get_class_specific_min_classification_confidence(label, table=page_quotient_threshold_map) == 0.8