diff --git a/hvpy/__init__.py b/hvpy/__init__.py index 58f3ace..04fec18 100644 --- a/hvpy/__init__.py +++ b/hvpy/__init__.py @@ -1 +1,2 @@ +from .facade import * # NOQA from .version import __version__ diff --git a/hvpy/api_groups/jpeg2000/get_jp2_image.py b/hvpy/api_groups/jpeg2000/get_jp2_image.py index da7e210..8e43b6f 100644 --- a/hvpy/api_groups/jpeg2000/get_jp2_image.py +++ b/hvpy/api_groups/jpeg2000/get_jp2_image.py @@ -9,6 +9,7 @@ class getJP2ImageInputParameters(HvpyParameters): """ Handles the input parameters of the getJP2Image API. + {Shared} Attributes ---------- date : datetime.datetime @@ -23,6 +24,7 @@ class getJP2ImageInputParameters(HvpyParameters): References ---------- * ``__ + {Shared} """ date: datetime diff --git a/hvpy/api_groups/jpeg2000/tests/test_get_jp2_image.py b/hvpy/api_groups/jpeg2000/tests/test_get_jp2_image.py index 602c63e..a17fbb1 100644 --- a/hvpy/api_groups/jpeg2000/tests/test_get_jp2_image.py +++ b/hvpy/api_groups/jpeg2000/tests/test_get_jp2_image.py @@ -1,69 +1,42 @@ from datetime import datetime import pytest -from pydantic import ValidationError +from hvpy import getJP2Image from hvpy.api_groups.jpeg2000.get_jp2_image import getJP2ImageInputParameters -from hvpy.core import execute_api_call def test_str_response(): - date_obj = datetime(2022, 1, 1, 23, 59, 59) - params = {"date": date_obj, "sourceId": 14, "jpip": True, "json": False} - params = getJP2ImageInputParameters(**params) - response = execute_api_call(input_parameters=params) + response = getJP2Image(date=datetime(2022, 1, 1, 23, 59, 59), sourceId=14, jpip=True, json=False) assert isinstance(response, str) assert response.startswith("jpip://") def test_json_response(): - date_obj = datetime(2022, 1, 1, 23, 59, 59) - params = {"date": date_obj, "sourceId": 14, "jpip": True, "json": True} - params = getJP2ImageInputParameters(**params) - response = execute_api_call(input_parameters=params) + response = getJP2Image(date=datetime(2022, 1, 1, 23, 59, 59), sourceId=14, jpip=True, json=True) assert isinstance(response, dict) assert "uri" in response assert response["uri"].startswith("jpip://") def test_raw_response(): - date_obj = datetime(2022, 1, 1, 23, 59, 59) - params = {"date": date_obj, "sourceId": 14, "jpip": False, "json": False} - params = getJP2ImageInputParameters(**params) - response = execute_api_call(input_parameters=params) + response = getJP2Image(date=datetime(2022, 1, 1, 23, 59, 59), sourceId=14, jpip=False, json=False) assert isinstance(response, bytes) def test_raw_response_with_json(): - date_obj = datetime(2022, 1, 1, 23, 59, 59) - params = {"date": date_obj, "sourceId": 14, "jpip": False, "json": True} - params = getJP2ImageInputParameters(**params) - response = execute_api_call(input_parameters=params) + response = getJP2Image(date=datetime(2022, 1, 1, 23, 59, 59), sourceId=14, jpip=False, json=True) assert isinstance(response, bytes) def test_default_response(): - date_obj = datetime(2022, 1, 1, 23, 59, 59) - params = {"date": date_obj, "sourceId": 14} - params = getJP2ImageInputParameters(**params) - response = execute_api_call(input_parameters=params) + response = getJP2Image(date=datetime(2022, 1, 1, 23, 59, 59), sourceId=14) assert isinstance(response, bytes) def test_error_handling(): - params = {"sourceId": 14, "jpip": True, "json": True} - with pytest.raises(ValidationError, match="getJP2ImageInputParameters\ndate\n field required"): - getJP2ImageInputParameters(**params) - - -def test_unknown_parameters(): - date_obj = datetime(2022, 1, 1, 23, 59, 59) - params = {"date": date_obj, "sourceId": 14, "jpip": True, "json": True, "should_reject_this": True} - params = getJP2ImageInputParameters(**params) - response = execute_api_call(input_parameters=params) - assert isinstance(response, dict) - assert "uri" in response - assert response["uri"].startswith("jpip://") + with pytest.raises(TypeError, match="missing 1 required positional argument: 'date'"): + getJP2Image(sourceId=14, jpip=True, json=True) def test_url_property(): diff --git a/hvpy/facade.py b/hvpy/facade.py new file mode 100644 index 0000000..d668b83 --- /dev/null +++ b/hvpy/facade.py @@ -0,0 +1,29 @@ +from typing import Any, Dict, Union +from datetime import datetime + +from hvpy.core import execute_api_call +from hvpy.parameters import * +from hvpy.utils import add_shared_docstring + +__all__ = ["getJP2Image"] + + +@add_shared_docstring(getJP2ImageInputParameters) +def getJP2Image( + date: datetime, + sourceId: int, + jpip: bool = False, + json: bool = False, +) -> Union[bytes, str, Dict[str, Any]]: + """ + Retrieve a JP2000 image from the helioviewer.org API. + + {Insert} + Examples + -------- + >>> from hvpy import getJP2Image + >>> getJP2Image(date=datetime(2019,1,1), sourceId=1, jpip=True) + 'jpip://helioviewer.org:8090/EIT/2013/08/07/195/2013_08_07__01_13_50_146__SOHO_EIT_EIT_195.jp2' + """ + params = getJP2ImageInputParameters(date=date, sourceId=sourceId, jpip=jpip, json=json) + return execute_api_call(input_parameters=params) diff --git a/hvpy/utils.py b/hvpy/utils.py new file mode 100644 index 0000000..4c8f64c --- /dev/null +++ b/hvpy/utils.py @@ -0,0 +1,14 @@ +from typing import Any, Callable + +__all__ = ["add_shared_docstring"] + + +def add_shared_docstring(input_class) -> Callable[[Any], Any]: + def decorator(func): + if "{Shared}" in input_class.__doc__: + split_doc = input_class.__doc__.split("{Shared}") + func.__doc__ = func.__doc__.replace("{Insert}", split_doc[1]) + input_class.__doc__ = input_class.__doc__.replace("{Shared}", "") + return func + + return decorator