Skip to content
Open
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
10 changes: 8 additions & 2 deletions pysus/online_data/SINAN.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
from functools import lru_cache
from pathlib import Path
from typing import Union

import pandas as pd
from pysus.ftp import CACHEPATH
from pysus.ftp.databases.sinan import SINAN

sinan = SINAN().load()

@lru_cache(maxsize=1)
def _get_sinan() -> SINAN:
return SINAN().load()


def list_diseases() -> dict:
"""List available diseases on SINAN"""
return sinan.diseases
return _get_sinan().diseases


def get_available_years(disease_code: str) -> list:
Expand All @@ -21,6 +25,7 @@ def get_available_years(disease_code: str) -> list:
:return:
A list of DBC files from a specific disease found in the FTP Server.
"""
sinan = _get_sinan()
files = sinan.get_files(dis_code=disease_code)
return sorted(list(set(sinan.describe(f)["year"] for f in files)))

Expand All @@ -37,6 +42,7 @@ def download(
:param data_path: The directory where the file will be downloaded to.
:return: list of downloaded files.
"""
sinan = _get_sinan()
files = sinan.get_files(dis_code=diseases, year=years)
return sinan.download(files, local_dir=data_path)

Expand Down
45 changes: 45 additions & 0 deletions pysus/tests/test_sinan_online_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import importlib
import sys
import unittest
from unittest.mock import Mock, patch


class TestSINANOnlineDataImport(unittest.TestCase):
MODULE = "pysus.online_data.SINAN"

def tearDown(self):
sys.modules.pop(self.MODULE, None)

def test_import_does_not_connect_to_ftp(self):
sys.modules.pop(self.MODULE, None)

with patch(
"pysus.ftp.databases.sinan.SINAN.load",
side_effect=AssertionError("load() should not run on import"),
):
module = importlib.import_module(self.MODULE)

self.assertTrue(hasattr(module, "_get_sinan"))

def test_sinan_connection_is_loaded_lazily_and_cached(self):
sys.modules.pop(self.MODULE, None)
fake_sinan = Mock()
fake_sinan.diseases = {"DENG": "Dengue"}
fake_sinan.get_files.return_value = ["f1", "f2"]
fake_sinan.describe.side_effect = [
{"year": "2024"},
{"year": "2023"},
]

with patch(
"pysus.ftp.databases.sinan.SINAN.load", return_value=fake_sinan
) as mock_load:
module = importlib.import_module(self.MODULE)

self.assertEqual(module.list_diseases(), {"DENG": "Dengue"})
self.assertEqual(module.get_available_years("DENG"), ["2023", "2024"])
mock_load.assert_called_once()


if __name__ == "__main__":
unittest.main()