Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions hvpy/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from .facade import * # NOQA
from .version import __version__
2 changes: 2 additions & 0 deletions hvpy/api_groups/jpeg2000/get_jp2_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class getJP2ImageInputParameters(HvpyParameters):
"""
Handles the input parameters of the getJP2Image API.

{Shared}
Attributes
----------
date : datetime.datetime
Expand All @@ -23,6 +24,7 @@ class getJP2ImageInputParameters(HvpyParameters):
References
----------
* `<https://api.helioviewer.org/docs/v2/api/api_groups/jpeg2000.html#getjp2image>`__
{Shared}
"""

date: datetime
Expand Down
43 changes: 8 additions & 35 deletions hvpy/api_groups/jpeg2000/tests/test_get_jp2_image.py
Original file line number Diff line number Diff line change
@@ -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():
Expand Down
29 changes: 29 additions & 0 deletions hvpy/facade.py
Original file line number Diff line number Diff line change
@@ -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)
14 changes: 14 additions & 0 deletions hvpy/utils.py
Original file line number Diff line number Diff line change
@@ -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