From 6381ab6d88be9adc2b29c9b17ee11dad06a7b687 Mon Sep 17 00:00:00 2001 From: Sahil Jhawar Date: Fri, 7 Nov 2025 12:29:29 +0100 Subject: [PATCH 1/3] fix types as per pyright --- .pre-commit-config.yaml | 9 ++ pyproject.toml | 3 + requirements.txt | 2 +- ruff.toml | 2 + swvo/io/RBMDataSet/RBMDataSet.py | 16 +-- swvo/io/RBMDataSet/RBMNcDataSet.py | 7 +- .../bin_and_interpolate_to_model_grid.py | 11 +- swvo/io/RBMDataSet/interp_functions.py | 10 +- swvo/io/RBMDataSet/utils.py | 2 +- swvo/io/decorators.py | 135 ------------------ swvo/io/dst/wdc.py | 2 +- swvo/io/f10_7/swpc.py | 2 +- swvo/io/hp/ensemble.py | 4 +- swvo/io/hp/gfz.py | 4 +- swvo/io/kp/ensemble.py | 4 +- swvo/io/kp/niemegk.py | 2 +- swvo/io/kp/omni.py | 2 +- swvo/io/kp/swpc.py | 6 +- swvo/io/omni/omni_high_res.py | 2 +- swvo/io/omni/omni_low_res.py | 2 +- swvo/io/plasmasphere/read_plasmasphere.py | 2 - .../read_plasmasphere_combined_inputs.py | 4 +- swvo/io/solar_wind/ace.py | 2 +- swvo/io/solar_wind/dscovr.py | 2 +- swvo/io/solar_wind/swift.py | 4 +- swvo/io/utils.py | 11 +- swvo/py.typed | 0 27 files changed, 64 insertions(+), 188 deletions(-) delete mode 100644 swvo/io/decorators.py create mode 100644 swvo/py.typed diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d7dcc61..53ee6ee 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,3 +8,12 @@ repos: args: [--fix] # Run the formatter. - id: ruff-format + + - repo: local + hooks: + - id: pyright-verifytypes + name: pyright verifytypes + entry: bash -c 'pip install . >/dev/null && pyright --verifytypes swvo --ignoreexternal' + language: system + types: [python] + pass_filenames: false diff --git a/pyproject.toml b/pyproject.toml index 6f95cc5..c610dc1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,9 @@ Tracker = "https://github.com/GFZ/SWVO/issues" [tool.setuptools.packages.find] include = ["swvo*"] +[tool.setuptools.package-data] +"swvo" = ["py.typed"] + [tool.coverage.run] source = ["swvo"] diff --git a/requirements.txt b/requirements.txt index 568140a..1233b06 100755 --- a/requirements.txt +++ b/requirements.txt @@ -16,4 +16,4 @@ tqdm pytest-mock netcdf4 icecream - +pyright \ No newline at end of file diff --git a/ruff.toml b/ruff.toml index 92e3c9f..d1f4858 100644 --- a/ruff.toml +++ b/ruff.toml @@ -79,3 +79,5 @@ docstring-code-format = false # This only has an effect when the `docstring-code-format` setting is # enabled. docstring-code-line-length = "dynamic" + + diff --git a/swvo/io/RBMDataSet/RBMDataSet.py b/swvo/io/RBMDataSet/RBMDataSet.py index acb3856..18e11bb 100644 --- a/swvo/io/RBMDataSet/RBMDataSet.py +++ b/swvo/io/RBMDataSet/RBMDataSet.py @@ -182,16 +182,16 @@ def __init__( self._file_loading_mode = True self._enable_dict_loading = enable_dict_loading - def __repr__(self): + def __repr__(self) -> str: return f"{self.__class__.__name__}({self._satellite}, {self._instrument}, {self._mfm})" - def __str__(self): + def __str__(self) -> str: return self.__repr__() - def __dir__(self): + def __dir__(self) -> list[str]: return list(super().__dir__()) + [var.var_name for var in VariableEnum] - def __getattr__(self, name: str): + def __getattr__(self, name: str) -> NDArray[np.float64]: # Avoid recursion for internal attributes if name.startswith("_"): raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") @@ -303,7 +303,7 @@ def update_from_dict(self, source_dict: dict[str, VariableLiteral]) -> RBMDataSe raise VariableNotFoundError(msg) return self - def get_var(self, var: VariableEnum): + def get_var(self, var: VariableEnum) -> NDArray[np.float64]: return getattr(self, var.var_name) def _create_date_list(self) -> list[dt.datetime]: @@ -349,15 +349,15 @@ def get_satellite_name(self) -> str: def get_satellite_and_instrument_name(self) -> str: return self._satellite.sat_name + "_" + self._instrument.instrument_name - def set_file_path_stem(self, file_path_stem: Path): + def set_file_path_stem(self, file_path_stem: Path) -> RBMDataSet: self._file_path_stem = file_path_stem return self - def set_file_name_stem(self, file_name_stem: Path): + def set_file_name_stem(self, file_name_stem: Path) -> RBMDataSet: self._file_path_stem = file_name_stem return self - def set_file_cadence(self, file_cadence: FileCadenceEnum): + def set_file_cadence(self, file_cadence: FileCadenceEnum) -> RBMDataSet: self._file_cadence = file_cadence self._date_of_files = self._create_date_list() return self diff --git a/swvo/io/RBMDataSet/RBMNcDataSet.py b/swvo/io/RBMDataSet/RBMNcDataSet.py index c6b28db..f3aa22c 100644 --- a/swvo/io/RBMDataSet/RBMNcDataSet.py +++ b/swvo/io/RBMDataSet/RBMNcDataSet.py @@ -13,15 +13,18 @@ from numpy.typing import NDArray from swvo.io.RBMDataSet import ( + RBMDataSet, +) +from swvo.io.RBMDataSet.custom_enums import ( FolderTypeEnum, InstrumentLike, + MfmEnumLiteral, MfmLike, - RBMDataSet, SatelliteLike, Variable, VariableEnum, + VariableLiteral, ) -from swvo.io.RBMDataSet.custom_enums import MfmEnumLiteral, VariableLiteral from swvo.io.RBMDataSet.utils import join_var diff --git a/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py b/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py index 2a1f041..30fd50a 100644 --- a/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py +++ b/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py @@ -10,7 +10,7 @@ from functools import partial from multiprocessing import Pool from pathlib import Path -from typing import TYPE_CHECKING, Literal +from typing import Literal import numpy as np from icecream import ic @@ -18,12 +18,11 @@ from numpy.typing import NDArray from tqdm import tqdm -if TYPE_CHECKING: - from swvo.io.RBMDataSet import RBMDataSet, RBMDataSetElPaso +from swvo.io.RBMDataSet.RBMDataSet import RBMDataSet def bin_and_interpolate_to_model_grid( - self: RBMDataSet | RBMDataSetElPaso, + self: RBMDataSet, sim_time: list[datetime], grid_R: NDArray[np.float64], grid_mu_V: NDArray[np.float64], @@ -383,7 +382,7 @@ def plot_debug_figures_plasmasphere( grid_P: NDArray[np.float64] | None, grid_R: NDArray[np.float64], debug_plot_settings: DebugPlotSettings, -): +) -> None: print("\tPlot debug features...") dt = sim_time[1] - sim_time[0] @@ -462,7 +461,7 @@ def plot_debug_figures( grid_K: NDArray[np.float64], mu_or_V: Literal["Mu", "V"], debug_plot_settings: DebugPlotSettings, -): +) -> None: print("\tPlot debug features...") dt = sim_time[1] - sim_time[0] diff --git a/swvo/io/RBMDataSet/interp_functions.py b/swvo/io/RBMDataSet/interp_functions.py index b6359a1..ac0cf85 100644 --- a/swvo/io/RBMDataSet/interp_functions.py +++ b/swvo/io/RBMDataSet/interp_functions.py @@ -10,14 +10,12 @@ from enum import Enum from functools import partial from multiprocessing import Pool -from typing import TYPE_CHECKING import numpy as np from numpy.typing import NDArray from tqdm import tqdm -if TYPE_CHECKING: - from swvo.io.RBMDataSet import RBMDataSet +from swvo.io.RBMDataSet.RBMDataSet import RBMDataSet class TargetType(Enum): @@ -222,13 +220,13 @@ def _interp_psd_parallel( def interp_psd( - self, + self: RBMDataSet, target_K: list[float], target_type: TargetType, target_mu: list[float] = None, target_V: list[float] = None, - n_threads=10, -): + n_threads: int=10, +) -> NDArray[np.float64]: if not isinstance(target_K, Iterable): target_K = [target_K] diff --git a/swvo/io/RBMDataSet/utils.py b/swvo/io/RBMDataSet/utils.py index d1c108d..33faee7 100644 --- a/swvo/io/RBMDataSet/utils.py +++ b/swvo/io/RBMDataSet/utils.py @@ -102,7 +102,7 @@ def python2matlab(datenum: datetime) -> float: return mdn.toordinal() + round(frac, 6) -def matlab2python(datenum: float | Iterable) -> Iterable[datetime] | datetime: +def matlab2python(datenum: float | Iterable[float]) -> Iterable[datetime] | datetime: """Convert MATLAB datenum to Python datetime.""" warnings.filterwarnings("ignore", message="Discarding nonzero nanoseconds in conversion") diff --git a/swvo/io/decorators.py b/swvo/io/decorators.py deleted file mode 100644 index 1d5d155..0000000 --- a/swvo/io/decorators.py +++ /dev/null @@ -1,135 +0,0 @@ -# SPDX-FileCopyrightText: 2025 GFZ Helmholtz Centre for Geosciences -# -# SPDX-License-Identifier: Apache-2.0 - -import inspect -from functools import wraps - - -def add_time_docs(action=None): - """ - A decorator to add start_time and end_time parameters to the docstring. - It will add them at the beginning of the Parameters section. - """ - - def decorator(func): - @wraps(func) - def wrapper(*args, **kwargs): - return func(*args, **kwargs) - - params = inspect.signature(func).parameters - original_doc = func.__doc__ or "" - - if "Parameters" in original_doc: - pre_params = original_doc[: original_doc.find("Parameters")] - - new_params = "Parameters\n" - new_params += " ----------\n" - - if "start_time" in params: - if action: - new_params += f" start_time : datetime\n Start time for data {action}.\n" - else: - new_params += " start_time : datetime\n" - if "end_time" in params: - if action: - new_params += f" end_time : datetime\n End time for data {action}.\n" - else: - new_params += " end_time : datetime\n" - - param_start = original_doc.find("Parameters\n ----------\n") + len( - "Parameters\n ----------\n" - ) - param_end = original_doc.find("\n\nReturns") if "\n\nReturns" in original_doc else len(original_doc) - existing_params = original_doc[param_start:param_end].strip() - - new_params += " " - new_params += existing_params - - if "Returns" in original_doc: - returns_section = original_doc[original_doc.find("\n\nReturns") :] - new_doc = f"{pre_params}{new_params}{returns_section}" - else: - new_doc = f"{pre_params}{new_params}" - - else: - # No Parameters section, add it before Returns - pre_params = original_doc[: original_doc.find("Returns")] - new_doc = f"{pre_params}Parameters\n ----------\n" - - if "start_time" in params: - if action: - new_doc += f" start_time : datetime\n Start time for data {action}.\n" - else: - new_doc += " start_time : datetime\n" - if "end_time" in params: - if action: - new_doc += f" end_time : datetime\n End time for data {action}.\n" - else: - new_doc += " end_time : datetime\n" - new_doc += "\n " - new_doc += original_doc[original_doc.find("Returns") :] - - wrapper.__doc__ = new_doc - wrapper.__annotations__ = func.__annotations__ - return wrapper - - return decorator - - -def add_attributes_to_class_docstring(cls): - """ - Automatically adds attributes to the class docstring, - including inherited attributes for derived classes. - """ - # Traverse through the class and its bases - attributes = {} - for base in cls.__mro__: # Method Resolution Order - attributes.update( - {attr: value for attr, value in vars(base).items() if not attr.startswith("__") and not callable(value)} - ) - - if not attributes: - return cls - - # Update the docstring - doc = cls.__doc__ or "" - doc += "\n Attributes\n ----------\n" - - for attr, value in attributes.items(): - doc += f" {attr} : {type(value).__name__} = {value}\n" - - cls.__doc__ = doc - - return cls - - -def add_methods_to_class_docstring(cls): - """ - Automatically adds methods to the class docstring, - including inherited methods for derived classes. - """ - # Traverse through the class and its bases - methods = {} - for base in cls.__mro__: # Method Resolution Order - methods.update( - { - attr: value - for attr, value in vars(base).items() - if not (attr.startswith("__") or attr.startswith("_")) and callable(value) - } - ) - - if not methods: - return cls - - # Update the docstring - doc = cls.__doc__ or "" - doc += "\n Methods\n -------\n" - - for method_name in methods: - doc += f" {method_name}\n" - - cls.__doc__ = doc - - return cls diff --git a/swvo/io/dst/wdc.py b/swvo/io/dst/wdc.py index 6e32bbd..a07bb0b 100644 --- a/swvo/io/dst/wdc.py +++ b/swvo/io/dst/wdc.py @@ -53,7 +53,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"WDC Dst data directory: {self.data_dir}") diff --git a/swvo/io/f10_7/swpc.py b/swvo/io/f10_7/swpc.py index 3ee4420..c5f5533 100644 --- a/swvo/io/f10_7/swpc.py +++ b/swvo/io/f10_7/swpc.py @@ -55,7 +55,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: raise ValueError(msg) data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"SWPC F10.7 data directory: {self.data_dir}") diff --git a/swvo/io/hp/ensemble.py b/swvo/io/hp/ensemble.py index d51612b..3fb4e65 100755 --- a/swvo/io/hp/ensemble.py +++ b/swvo/io/hp/ensemble.py @@ -56,7 +56,7 @@ def __init__(self, index: str, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) logging.info(f"{self.index.upper()} Ensemble data directory: {self.data_dir}") @@ -64,7 +64,7 @@ def __init__(self, index: str, data_dir: Optional[Path] = None) -> None: msg = f"Data directory {self.data_dir} does not exist! Impossible to retrive data!" raise FileNotFoundError(msg) - self.index_number = index[2:] + self.index_number: int = index[2:] def read(self, start_time: datetime, end_time: datetime) -> list[pd.DataFrame]: """ diff --git a/swvo/io/hp/gfz.py b/swvo/io/hp/gfz.py index 377e210..815ac52 100755 --- a/swvo/io/hp/gfz.py +++ b/swvo/io/hp/gfz.py @@ -56,9 +56,9 @@ def __init__(self, index: str, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) - self.index_number = index[2:] + self.index_number: int = index[2:] logging.info(f"{self.index.upper()} GFZ data directory: {self.data_dir}") diff --git a/swvo/io/kp/ensemble.py b/swvo/io/kp/ensemble.py index 872cac0..d66288c 100755 --- a/swvo/io/kp/ensemble.py +++ b/swvo/io/kp/ensemble.py @@ -49,14 +49,14 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) logging.info(f"Kp Ensemble data directory: {self.data_dir}") if not self.data_dir.exists(): raise FileNotFoundError(f"Data directory {self.data_dir} does not exist! Impossible to retrive data!") - def read(self, start_time: datetime, end_time: datetime) -> list: + def read(self, start_time: datetime, end_time: datetime) -> list[pd.DataFrame]: """Read Kp ensemble data for the requested period. Parameters diff --git a/swvo/io/kp/niemegk.py b/swvo/io/kp/niemegk.py index 731030b..bc11425 100755 --- a/swvo/io/kp/niemegk.py +++ b/swvo/io/kp/niemegk.py @@ -55,7 +55,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"Kp Niemegk data directory: {self.data_dir}") diff --git a/swvo/io/kp/omni.py b/swvo/io/kp/omni.py index c5169a8..9a95475 100755 --- a/swvo/io/kp/omni.py +++ b/swvo/io/kp/omni.py @@ -34,7 +34,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: """ super().__init__(data_dir=data_dir) - def read(self, start_time: datetime, end_time: datetime, *, download: bool = False) -> pd.DataFrame: + def read(self, start_time: datetime, end_time: datetime, download: bool = False) -> pd.DataFrame: """ Extract Kp data from OMNI Low Resolution files. diff --git a/swvo/io/kp/swpc.py b/swvo/io/kp/swpc.py index aa5a947..4e4699b 100755 --- a/swvo/io/kp/swpc.py +++ b/swvo/io/kp/swpc.py @@ -57,12 +57,12 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"Kp SWPC data directory: {self.data_dir}") - def download_and_process(self, target_date: datetime, reprocess_files: bool = False): + def download_and_process(self, target_date: datetime, reprocess_files: bool = False) -> None: """ Download and process SWPC Kp data file. @@ -107,7 +107,7 @@ def download_and_process(self, target_date: datetime, reprocess_files: bool = Fa finally: rmtree(temporary_dir) - def read(self, start_time: datetime, end_time: datetime = None, download: bool = False) -> pd.DataFrame: + def read(self, start_time: datetime, end_time: Optional[datetime] = None, download: bool = False) -> pd.DataFrame: """ Read Kp data for the specified time range. diff --git a/swvo/io/omni/omni_high_res.py b/swvo/io/omni/omni_high_res.py index af836a7..357a87a 100644 --- a/swvo/io/omni/omni_high_res.py +++ b/swvo/io/omni/omni_high_res.py @@ -52,7 +52,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"OMNI high resolution data directory: {self.data_dir}") diff --git a/swvo/io/omni/omni_low_res.py b/swvo/io/omni/omni_low_res.py index 2dc0db2..9ac4b3f 100755 --- a/swvo/io/omni/omni_low_res.py +++ b/swvo/io/omni/omni_low_res.py @@ -110,7 +110,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"OMNI Low Res data directory: {self.data_dir}") diff --git a/swvo/io/plasmasphere/read_plasmasphere.py b/swvo/io/plasmasphere/read_plasmasphere.py index 6699616..f85aff1 100644 --- a/swvo/io/plasmasphere/read_plasmasphere.py +++ b/swvo/io/plasmasphere/read_plasmasphere.py @@ -28,8 +28,6 @@ class PlasmaspherePredictionReader: def __init__(self, folder: str): self.data_folder = folder self._check_data_folder() - self.file = None - self.requested_date = None def _check_data_folder(self) -> None: """Checks if the data folder exists. diff --git a/swvo/io/plasmasphere/read_plasmasphere_combined_inputs.py b/swvo/io/plasmasphere/read_plasmasphere_combined_inputs.py index b733987..55420c0 100644 --- a/swvo/io/plasmasphere/read_plasmasphere_combined_inputs.py +++ b/swvo/io/plasmasphere/read_plasmasphere_combined_inputs.py @@ -25,11 +25,9 @@ class PlasmasphereCombinedInputsReader: If the source of data requested is not among the available ones. """ - def __init__(self, folder): + def __init__(self, folder: str): self.data_folder = folder self._check_data_folder() - self.file = None - self.requested_date = None def _check_data_folder(self) -> None: """Checks if the data folder exists. diff --git a/swvo/io/solar_wind/ace.py b/swvo/io/solar_wind/ace.py index 53f1dd7..30b022f 100644 --- a/swvo/io/solar_wind/ace.py +++ b/swvo/io/solar_wind/ace.py @@ -62,7 +62,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"ACE data directory: {self.data_dir}") diff --git a/swvo/io/solar_wind/dscovr.py b/swvo/io/solar_wind/dscovr.py index e383062..83b32ed 100644 --- a/swvo/io/solar_wind/dscovr.py +++ b/swvo/io/solar_wind/dscovr.py @@ -60,7 +60,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) logging.info(f"DSCOVR data directory: {self.data_dir}") diff --git a/swvo/io/solar_wind/swift.py b/swvo/io/solar_wind/swift.py index f02343e..ce9db4a 100644 --- a/swvo/io/solar_wind/swift.py +++ b/swvo/io/solar_wind/swift.py @@ -56,7 +56,7 @@ def __init__(self, data_dir: Optional[Path] = None) -> None: data_dir = os.environ.get(self.ENV_VAR_NAME) - self.data_dir = Path(data_dir) + self.data_dir: Path = Path(data_dir) logging.info(f"SWIFT ensemble data directory: {self.data_dir}") @@ -69,7 +69,7 @@ def read( end_time: Optional[datetime] = None, propagation: bool = False, truncate: bool = True, - ) -> list: + ) -> list[pd.DataFrame]: # It does not make sense to read SWIFT ensemble files from different dates """ diff --git a/swvo/io/utils.py b/swvo/io/utils.py index ace1299..1f61eaf 100644 --- a/swvo/io/utils.py +++ b/swvo/io/utils.py @@ -7,6 +7,7 @@ import numpy as np import pandas as pd +from git import Optional from scipy.ndimage import gaussian_filter1d @@ -108,8 +109,8 @@ def construct_updated_data_frame( def datenum( date_input: datetime | int, - month: int = None, - year: int = None, + month: Optional[int] = None, + year: Optional[int] = None, hour: int = 0, minute: int = 0, seconds: int = 0, @@ -124,11 +125,11 @@ def datenum( The month of the date. Required if date_input is an integer. year : int, optional The year of the date. Required if date_input is an integer. - hour : int, optional + hour : int The hour of the date, by default 0 - minute : int, optional + minute : int The minute of the date, by default 0 - seconds : int, optional + seconds : int The seconds of the date, by default 0 Returns diff --git a/swvo/py.typed b/swvo/py.typed new file mode 100644 index 0000000..e69de29 From 3056f60ff9d7d01ec0c0bfcf86e3b77d377cc17a Mon Sep 17 00:00:00 2001 From: Sahil Jhawar Date: Fri, 7 Nov 2025 12:32:46 +0100 Subject: [PATCH 2/3] fix RBMDS import --- swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py | 2 +- swvo/io/RBMDataSet/interp_functions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py b/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py index 30fd50a..932ce54 100644 --- a/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py +++ b/swvo/io/RBMDataSet/bin_and_interpolate_to_model_grid.py @@ -18,7 +18,7 @@ from numpy.typing import NDArray from tqdm import tqdm -from swvo.io.RBMDataSet.RBMDataSet import RBMDataSet +from swvo.io.RBMDataSet import RBMDataSet def bin_and_interpolate_to_model_grid( diff --git a/swvo/io/RBMDataSet/interp_functions.py b/swvo/io/RBMDataSet/interp_functions.py index ac0cf85..ebeace5 100644 --- a/swvo/io/RBMDataSet/interp_functions.py +++ b/swvo/io/RBMDataSet/interp_functions.py @@ -15,7 +15,7 @@ from numpy.typing import NDArray from tqdm import tqdm -from swvo.io.RBMDataSet.RBMDataSet import RBMDataSet +from swvo.io.RBMDataSet import RBMDataSet class TargetType(Enum): From baa9576c85e443fe255280917a97b894da1905c3 Mon Sep 17 00:00:00 2001 From: Sahil Jhawar Date: Fri, 7 Nov 2025 12:57:39 +0100 Subject: [PATCH 3/3] remove import git --- swvo/io/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swvo/io/utils.py b/swvo/io/utils.py index 1f61eaf..f3290d1 100644 --- a/swvo/io/utils.py +++ b/swvo/io/utils.py @@ -4,10 +4,10 @@ import logging from datetime import datetime, timezone +from typing import Optional import numpy as np import pandas as pd -from git import Optional from scipy.ndimage import gaussian_filter1d