From 2ece46534c465e82d8646bc87ac4cf0d4ecf4b22 Mon Sep 17 00:00:00 2001 From: Aaron Zuspan <50475791+aazuspan@users.noreply.github.com> Date: Fri, 29 Nov 2024 14:05:26 -0800 Subject: [PATCH] Compat wrapper for deprecated `read_text` (#38) * Compat wrapper for importlib.resources.read_text * Regression test the full repr and rename tests --- eerepr/repr.py | 28 +- tests/conftest.py | 9 + tests/data/test_full_repr.yml | 286 ++++++++++++++++++ ...yml => test_regression_objects_array_.yml} | 0 ...=> test_regression_objects_band_dict_.yml} | 0 ...> test_regression_objects_classifier_.yml} | 0 ...=> test_regression_objects_clusterer_.yml} | 0 ..._regression_objects_confusion_matrix_.yml} | 0 ...st_regression_objects_constant_image_.yml} | 0 ....yml => test_regression_objects_date_.yml} | 0 ...=> test_regression_objects_daterange_.yml} | 0 ....yml => test_regression_objects_dict_.yml} | 0 ...l => test_regression_objects_feature_.yml} | 0 ...egression_objects_feature_collection_.yml} | 0 ...ml => test_regression_objects_filter_.yml} | 0 ..._regression_objects_image_collection_.yml} | 0 ...ml => test_regression_objects_kernel_.yml} | 0 ...> test_regression_objects_linearring_.yml} | 0 ...> test_regression_objects_linestring_.yml} | 0 ...=> test_regression_objects_long_list_.yml} | 0 ...t_regression_objects_multilinestring_.yml} | 0 ...> test_regression_objects_multipoint_.yml} | 0 ...test_regression_objects_multipolygon_.yml} | 0 ...test_regression_objects_null_feature_.yml} | 0 ...ml => test_regression_objects_number_.yml} | 0 ...test_regression_objects_pixel_custom_.yml} | 0 ...test_regression_objects_pixel_double_.yml} | 0 ... test_regression_objects_pixel_float_.yml} | 0 ... test_regression_objects_pixel_int16_.yml} | 0 ... test_regression_objects_pixel_int32_.yml} | 0 ... test_regression_objects_pixel_int64_.yml} | 0 ...> test_regression_objects_pixel_int8_.yml} | 0 ...test_regression_objects_pixel_uint16_.yml} | 0 ...test_regression_objects_pixel_uint32_.yml} | 0 ... test_regression_objects_pixel_uint8_.yml} | 0 ...yml => test_regression_objects_point_.yml} | 0 ...l => test_regression_objects_polygon_.yml} | 0 ...> test_regression_objects_projection_.yml} | 0 ...l => test_regression_objects_reducer_.yml} | 0 ...> test_regression_objects_short_list_.yml} | 0 ...ml => test_regression_objects_string_.yml} | 0 ...=> test_regression_objects_type_dict_.yml} | 0 ...gression_objects_unbounded_band_dict_.yml} | 0 tests/test_html.py | 10 +- tests/test_reprs.py | 12 +- 45 files changed, 330 insertions(+), 15 deletions(-) create mode 100644 tests/data/test_full_repr.yml rename tests/data/{test_regression_array_.yml => test_regression_objects_array_.yml} (100%) rename tests/data/{test_regression_band_dict_.yml => test_regression_objects_band_dict_.yml} (100%) rename tests/data/{test_regression_classifier_.yml => test_regression_objects_classifier_.yml} (100%) rename tests/data/{test_regression_clusterer_.yml => test_regression_objects_clusterer_.yml} (100%) rename tests/data/{test_regression_confusion_matrix_.yml => test_regression_objects_confusion_matrix_.yml} (100%) rename tests/data/{test_regression_constant_image_.yml => test_regression_objects_constant_image_.yml} (100%) rename tests/data/{test_regression_date_.yml => test_regression_objects_date_.yml} (100%) rename tests/data/{test_regression_daterange_.yml => test_regression_objects_daterange_.yml} (100%) rename tests/data/{test_regression_dict_.yml => test_regression_objects_dict_.yml} (100%) rename tests/data/{test_regression_feature_.yml => test_regression_objects_feature_.yml} (100%) rename tests/data/{test_regression_feature_collection_.yml => test_regression_objects_feature_collection_.yml} (100%) rename tests/data/{test_regression_filter_.yml => test_regression_objects_filter_.yml} (100%) rename tests/data/{test_regression_image_collection_.yml => test_regression_objects_image_collection_.yml} (100%) rename tests/data/{test_regression_kernel_.yml => test_regression_objects_kernel_.yml} (100%) rename tests/data/{test_regression_linearring_.yml => test_regression_objects_linearring_.yml} (100%) rename tests/data/{test_regression_linestring_.yml => test_regression_objects_linestring_.yml} (100%) rename tests/data/{test_regression_long_list_.yml => test_regression_objects_long_list_.yml} (100%) rename tests/data/{test_regression_multilinestring_.yml => test_regression_objects_multilinestring_.yml} (100%) rename tests/data/{test_regression_multipoint_.yml => test_regression_objects_multipoint_.yml} (100%) rename tests/data/{test_regression_multipolygon_.yml => test_regression_objects_multipolygon_.yml} (100%) rename tests/data/{test_regression_null_feature_.yml => test_regression_objects_null_feature_.yml} (100%) rename tests/data/{test_regression_number_.yml => test_regression_objects_number_.yml} (100%) rename tests/data/{test_regression_pixel_custom_.yml => test_regression_objects_pixel_custom_.yml} (100%) rename tests/data/{test_regression_pixel_double_.yml => test_regression_objects_pixel_double_.yml} (100%) rename tests/data/{test_regression_pixel_float_.yml => test_regression_objects_pixel_float_.yml} (100%) rename tests/data/{test_regression_pixel_int16_.yml => test_regression_objects_pixel_int16_.yml} (100%) rename tests/data/{test_regression_pixel_int32_.yml => test_regression_objects_pixel_int32_.yml} (100%) rename tests/data/{test_regression_pixel_int64_.yml => test_regression_objects_pixel_int64_.yml} (100%) rename tests/data/{test_regression_pixel_int8_.yml => test_regression_objects_pixel_int8_.yml} (100%) rename tests/data/{test_regression_pixel_uint16_.yml => test_regression_objects_pixel_uint16_.yml} (100%) rename tests/data/{test_regression_pixel_uint32_.yml => test_regression_objects_pixel_uint32_.yml} (100%) rename tests/data/{test_regression_pixel_uint8_.yml => test_regression_objects_pixel_uint8_.yml} (100%) rename tests/data/{test_regression_point_.yml => test_regression_objects_point_.yml} (100%) rename tests/data/{test_regression_polygon_.yml => test_regression_objects_polygon_.yml} (100%) rename tests/data/{test_regression_projection_.yml => test_regression_objects_projection_.yml} (100%) rename tests/data/{test_regression_reducer_.yml => test_regression_objects_reducer_.yml} (100%) rename tests/data/{test_regression_short_list_.yml => test_regression_objects_short_list_.yml} (100%) rename tests/data/{test_regression_string_.yml => test_regression_objects_string_.yml} (100%) rename tests/data/{test_regression_type_dict_.yml => test_regression_objects_type_dict_.yml} (100%) rename tests/data/{test_regression_unbounded_band_dict_.yml => test_regression_objects_unbounded_band_dict_.yml} (100%) diff --git a/eerepr/repr.py b/eerepr/repr.py index b79ef9a..2c5ec5d 100644 --- a/eerepr/repr.py +++ b/eerepr/repr.py @@ -3,7 +3,6 @@ import uuid from functools import _lru_cache_wrapper, lru_cache from html import escape -from importlib.resources import read_text from typing import Any, Union from warnings import warn @@ -15,21 +14,38 @@ REPR_HTML = "_repr_html_" EEObject = Union[ee.Element, ee.ComputedObject] -# Track which html reprs have been set so we can overwrite them if needed. +# Track which repr methods have been set so we can overwrite them if needed. reprs_set = set() -@lru_cache(maxsize=None) +def _load_file(package: str, resource: str) -> str: + """ + Compatibility wrapper for deprecated `importlib.resources.read_text`. + + Replace with `importlib.resources.files` once support for Python < 3.9 is dropped. + """ + try: + # Python >= 3.9 + from importlib.resources import files + + return files(package).joinpath(resource).read_text() + except ImportError: + from importlib.resources import read_text + + return read_text(package, resource) + + +@lru_cache(maxsize=1) def _load_css() -> str: - return read_text("eerepr.static.css", "style.css") + return _load_file("eerepr.static.css", "style.css") -@lru_cache(maxsize=None) +@lru_cache(maxsize=1) def _load_js() -> str: """Note: JS is only needed because the CSS `:has()` selector isn't well supported yet, preventing a pure CSS solution to the collapsible lists. """ - return read_text("eerepr.static.js", "script.js") + return _load_file("eerepr.static.js", "script.js") def _attach_html_repr(cls: type, repr: Any) -> None: diff --git a/tests/conftest.py b/tests/conftest.py index 8c20839..2007961 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,14 @@ +from pathlib import Path + import ee +import pytest def pytest_sessionstart(session): ee.Initialize() + + +@pytest.fixture(scope="session") +def original_datadir(): + """Set the pytest-regressions directory.""" + return Path(__file__).parent / "data" diff --git a/tests/data/test_full_repr.yml b/tests/data/test_full_repr.yml new file mode 100644 index 0000000..c9b5706 --- /dev/null +++ b/tests/data/test_full_repr.yml @@ -0,0 +1,286 @@ +"
" diff --git a/tests/data/test_regression_array_.yml b/tests/data/test_regression_objects_array_.yml similarity index 100% rename from tests/data/test_regression_array_.yml rename to tests/data/test_regression_objects_array_.yml diff --git a/tests/data/test_regression_band_dict_.yml b/tests/data/test_regression_objects_band_dict_.yml similarity index 100% rename from tests/data/test_regression_band_dict_.yml rename to tests/data/test_regression_objects_band_dict_.yml diff --git a/tests/data/test_regression_classifier_.yml b/tests/data/test_regression_objects_classifier_.yml similarity index 100% rename from tests/data/test_regression_classifier_.yml rename to tests/data/test_regression_objects_classifier_.yml diff --git a/tests/data/test_regression_clusterer_.yml b/tests/data/test_regression_objects_clusterer_.yml similarity index 100% rename from tests/data/test_regression_clusterer_.yml rename to tests/data/test_regression_objects_clusterer_.yml diff --git a/tests/data/test_regression_confusion_matrix_.yml b/tests/data/test_regression_objects_confusion_matrix_.yml similarity index 100% rename from tests/data/test_regression_confusion_matrix_.yml rename to tests/data/test_regression_objects_confusion_matrix_.yml diff --git a/tests/data/test_regression_constant_image_.yml b/tests/data/test_regression_objects_constant_image_.yml similarity index 100% rename from tests/data/test_regression_constant_image_.yml rename to tests/data/test_regression_objects_constant_image_.yml diff --git a/tests/data/test_regression_date_.yml b/tests/data/test_regression_objects_date_.yml similarity index 100% rename from tests/data/test_regression_date_.yml rename to tests/data/test_regression_objects_date_.yml diff --git a/tests/data/test_regression_daterange_.yml b/tests/data/test_regression_objects_daterange_.yml similarity index 100% rename from tests/data/test_regression_daterange_.yml rename to tests/data/test_regression_objects_daterange_.yml diff --git a/tests/data/test_regression_dict_.yml b/tests/data/test_regression_objects_dict_.yml similarity index 100% rename from tests/data/test_regression_dict_.yml rename to tests/data/test_regression_objects_dict_.yml diff --git a/tests/data/test_regression_feature_.yml b/tests/data/test_regression_objects_feature_.yml similarity index 100% rename from tests/data/test_regression_feature_.yml rename to tests/data/test_regression_objects_feature_.yml diff --git a/tests/data/test_regression_feature_collection_.yml b/tests/data/test_regression_objects_feature_collection_.yml similarity index 100% rename from tests/data/test_regression_feature_collection_.yml rename to tests/data/test_regression_objects_feature_collection_.yml diff --git a/tests/data/test_regression_filter_.yml b/tests/data/test_regression_objects_filter_.yml similarity index 100% rename from tests/data/test_regression_filter_.yml rename to tests/data/test_regression_objects_filter_.yml diff --git a/tests/data/test_regression_image_collection_.yml b/tests/data/test_regression_objects_image_collection_.yml similarity index 100% rename from tests/data/test_regression_image_collection_.yml rename to tests/data/test_regression_objects_image_collection_.yml diff --git a/tests/data/test_regression_kernel_.yml b/tests/data/test_regression_objects_kernel_.yml similarity index 100% rename from tests/data/test_regression_kernel_.yml rename to tests/data/test_regression_objects_kernel_.yml diff --git a/tests/data/test_regression_linearring_.yml b/tests/data/test_regression_objects_linearring_.yml similarity index 100% rename from tests/data/test_regression_linearring_.yml rename to tests/data/test_regression_objects_linearring_.yml diff --git a/tests/data/test_regression_linestring_.yml b/tests/data/test_regression_objects_linestring_.yml similarity index 100% rename from tests/data/test_regression_linestring_.yml rename to tests/data/test_regression_objects_linestring_.yml diff --git a/tests/data/test_regression_long_list_.yml b/tests/data/test_regression_objects_long_list_.yml similarity index 100% rename from tests/data/test_regression_long_list_.yml rename to tests/data/test_regression_objects_long_list_.yml diff --git a/tests/data/test_regression_multilinestring_.yml b/tests/data/test_regression_objects_multilinestring_.yml similarity index 100% rename from tests/data/test_regression_multilinestring_.yml rename to tests/data/test_regression_objects_multilinestring_.yml diff --git a/tests/data/test_regression_multipoint_.yml b/tests/data/test_regression_objects_multipoint_.yml similarity index 100% rename from tests/data/test_regression_multipoint_.yml rename to tests/data/test_regression_objects_multipoint_.yml diff --git a/tests/data/test_regression_multipolygon_.yml b/tests/data/test_regression_objects_multipolygon_.yml similarity index 100% rename from tests/data/test_regression_multipolygon_.yml rename to tests/data/test_regression_objects_multipolygon_.yml diff --git a/tests/data/test_regression_null_feature_.yml b/tests/data/test_regression_objects_null_feature_.yml similarity index 100% rename from tests/data/test_regression_null_feature_.yml rename to tests/data/test_regression_objects_null_feature_.yml diff --git a/tests/data/test_regression_number_.yml b/tests/data/test_regression_objects_number_.yml similarity index 100% rename from tests/data/test_regression_number_.yml rename to tests/data/test_regression_objects_number_.yml diff --git a/tests/data/test_regression_pixel_custom_.yml b/tests/data/test_regression_objects_pixel_custom_.yml similarity index 100% rename from tests/data/test_regression_pixel_custom_.yml rename to tests/data/test_regression_objects_pixel_custom_.yml diff --git a/tests/data/test_regression_pixel_double_.yml b/tests/data/test_regression_objects_pixel_double_.yml similarity index 100% rename from tests/data/test_regression_pixel_double_.yml rename to tests/data/test_regression_objects_pixel_double_.yml diff --git a/tests/data/test_regression_pixel_float_.yml b/tests/data/test_regression_objects_pixel_float_.yml similarity index 100% rename from tests/data/test_regression_pixel_float_.yml rename to tests/data/test_regression_objects_pixel_float_.yml diff --git a/tests/data/test_regression_pixel_int16_.yml b/tests/data/test_regression_objects_pixel_int16_.yml similarity index 100% rename from tests/data/test_regression_pixel_int16_.yml rename to tests/data/test_regression_objects_pixel_int16_.yml diff --git a/tests/data/test_regression_pixel_int32_.yml b/tests/data/test_regression_objects_pixel_int32_.yml similarity index 100% rename from tests/data/test_regression_pixel_int32_.yml rename to tests/data/test_regression_objects_pixel_int32_.yml diff --git a/tests/data/test_regression_pixel_int64_.yml b/tests/data/test_regression_objects_pixel_int64_.yml similarity index 100% rename from tests/data/test_regression_pixel_int64_.yml rename to tests/data/test_regression_objects_pixel_int64_.yml diff --git a/tests/data/test_regression_pixel_int8_.yml b/tests/data/test_regression_objects_pixel_int8_.yml similarity index 100% rename from tests/data/test_regression_pixel_int8_.yml rename to tests/data/test_regression_objects_pixel_int8_.yml diff --git a/tests/data/test_regression_pixel_uint16_.yml b/tests/data/test_regression_objects_pixel_uint16_.yml similarity index 100% rename from tests/data/test_regression_pixel_uint16_.yml rename to tests/data/test_regression_objects_pixel_uint16_.yml diff --git a/tests/data/test_regression_pixel_uint32_.yml b/tests/data/test_regression_objects_pixel_uint32_.yml similarity index 100% rename from tests/data/test_regression_pixel_uint32_.yml rename to tests/data/test_regression_objects_pixel_uint32_.yml diff --git a/tests/data/test_regression_pixel_uint8_.yml b/tests/data/test_regression_objects_pixel_uint8_.yml similarity index 100% rename from tests/data/test_regression_pixel_uint8_.yml rename to tests/data/test_regression_objects_pixel_uint8_.yml diff --git a/tests/data/test_regression_point_.yml b/tests/data/test_regression_objects_point_.yml similarity index 100% rename from tests/data/test_regression_point_.yml rename to tests/data/test_regression_objects_point_.yml diff --git a/tests/data/test_regression_polygon_.yml b/tests/data/test_regression_objects_polygon_.yml similarity index 100% rename from tests/data/test_regression_polygon_.yml rename to tests/data/test_regression_objects_polygon_.yml diff --git a/tests/data/test_regression_projection_.yml b/tests/data/test_regression_objects_projection_.yml similarity index 100% rename from tests/data/test_regression_projection_.yml rename to tests/data/test_regression_objects_projection_.yml diff --git a/tests/data/test_regression_reducer_.yml b/tests/data/test_regression_objects_reducer_.yml similarity index 100% rename from tests/data/test_regression_reducer_.yml rename to tests/data/test_regression_objects_reducer_.yml diff --git a/tests/data/test_regression_short_list_.yml b/tests/data/test_regression_objects_short_list_.yml similarity index 100% rename from tests/data/test_regression_short_list_.yml rename to tests/data/test_regression_objects_short_list_.yml diff --git a/tests/data/test_regression_string_.yml b/tests/data/test_regression_objects_string_.yml similarity index 100% rename from tests/data/test_regression_string_.yml rename to tests/data/test_regression_objects_string_.yml diff --git a/tests/data/test_regression_type_dict_.yml b/tests/data/test_regression_objects_type_dict_.yml similarity index 100% rename from tests/data/test_regression_type_dict_.yml rename to tests/data/test_regression_objects_type_dict_.yml diff --git a/tests/data/test_regression_unbounded_band_dict_.yml b/tests/data/test_regression_objects_unbounded_band_dict_.yml similarity index 100% rename from tests/data/test_regression_unbounded_band_dict_.yml rename to tests/data/test_regression_objects_unbounded_band_dict_.yml diff --git a/tests/test_html.py b/tests/test_html.py index f7e671a..c7a52a9 100644 --- a/tests/test_html.py +++ b/tests/test_html.py @@ -1,5 +1,3 @@ -from pathlib import Path - import ee import pytest @@ -90,11 +88,7 @@ def get_test_objects() -> list: } -@pytest.fixture(scope="session") -def original_datadir(): - return Path(__file__).parent / "data" - - @pytest.mark.parametrize("key_val", get_test_objects().items(), ids=lambda kv: kv[0]) -def test_regression(key_val, data_regression): +def test_regression_objects(key_val, data_regression): + """Test the HTML repr of various EE objects.""" data_regression.check(convert_to_html(get_info(key_val[1]))) diff --git a/tests/test_reprs.py b/tests/test_reprs.py index 76cea7e..142f560 100644 --- a/tests/test_reprs.py +++ b/tests/test_reprs.py @@ -2,12 +2,22 @@ import pytest import eerepr # noqa: F401 +from eerepr.repr import _repr_html_ def test_error(): - """Test that an object that raises on getInfo falls abck to the string repr and + """Test that an object that raises on getInfo falls back to the string repr and warns. """ with pytest.warns(UserWarning): rep = ee.Projection("not a real epsg")._repr_html_() assert "Projection object" in rep + + +def test_full_repr(data_regression): + """Regression test the full HTML repr (with CSS and JS) of a nested EE object.""" + from tests.test_html import get_test_objects + + objects = get_test_objects().items() + rendered = _repr_html_(ee.List([obj[1] for obj in objects])) + data_regression.check(rendered)