Skip to content

Commit

Permalink
fix issue ltn returns leap year (#441)
Browse files Browse the repository at this point in the history
* fix issue ltn returns leap year

* change function isleap year
  • Loading branch information
danangmassandy authored Feb 19, 2025
1 parent bdc4457 commit 95bb768
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 2 deletions.
11 changes: 10 additions & 1 deletion django_project/core/tests/test_date.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
from core.utils.date import (
find_max_min_epoch_dates,
split_epochs_by_year,
split_epochs_by_year_month
split_epochs_by_year_month,
closest_leap_year
)


Expand Down Expand Up @@ -265,3 +266,11 @@ def test_same_start_and_end(self):
split_epochs_by_year_month(int(start_epoch), int(start_epoch)),
expected
)

def test_closest_leap_year(self):
"""Test closest_leap_year."""
self.assertEqual(closest_leap_year(2023), 2020)
self.assertEqual(closest_leap_year(2020), 2020)
self.assertEqual(closest_leap_year(2019), 2016)
self.assertEqual(closest_leap_year(2001), 2000)
self.assertEqual(closest_leap_year(1999), 1996)
13 changes: 13 additions & 0 deletions django_project/core/utils/date.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"""

from datetime import datetime, timezone
import calendar


def find_max_min_epoch_dates(min_epoch, max_epoch, epoch):
Expand Down Expand Up @@ -118,3 +119,15 @@ def split_epochs_by_year_month(start_epoch, end_epoch):
current_month += 1

return results


def closest_leap_year(year):
"""Find the closest past leap year to the given year."""
if calendar.isleap(year):
return year

lower = year - 1
while True:
if calendar.isleap(lower):
return lower
lower -= 1
6 changes: 5 additions & 1 deletion django_project/gap/providers/tio.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
BaseDatasetReader
)
from gap.utils.zarr import BaseZarrReader
from core.utils.date import closest_leap_year

logger = logging.getLogger(__name__)
PROVIDER_NAME = 'Tomorrow.io'
Expand Down Expand Up @@ -434,7 +435,10 @@ def _get_result_datetime(self, interval: dict) -> datetime:
dt_str = interval.get('startTime')
if self._is_ltn_request():
dt_str = interval.get('startDate')
dt_str = f'{self.start_date.year}-{dt_str}'
year = self.start_date.year
if dt_str == '02-29':
year = closest_leap_year(year)
dt_str = f'{year}-{dt_str}'
return datetime.strptime(
dt_str, '%Y-%m-%d').replace(tzinfo=pytz.utc)
return datetime.fromisoformat(dt_str)
Expand Down
24 changes: 24 additions & 0 deletions django_project/gap/tests/providers/test_tio.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,30 @@ def test_read_ltn_data(self, mock_request, mock_env):
self.reader._read_ltn_data(self.start_date, self.end_date)
self.assertEqual(len(self.reader.results), 0)
self.assertEqual(len(self.reader.errors), 1)
# test LTN returns 02-29
mock_response = {
'data': {
'timelines': [{
'intervals': [
{
'startDate': '02-29',
'values': {
'rainAccumulationSum': 2.0
}
}
]
}]
}
}
mock_request.post(
'https://api.tomorrow.io/v4/historical/'
'normals?apikey=dummy_api_key',
json=mock_response, status_code=200
)

self.reader._read_ltn_data(self.start_date, self.end_date)
# skip the result since requested year is not leap year
self.assertEqual(len(self.reader.results), 0)

@patch.object(TomorrowIODatasetReader, 'read_historical_data')
@patch.object(TomorrowIODatasetReader, 'read_forecast_data')
Expand Down

0 comments on commit 95bb768

Please sign in to comment.