diff --git a/src/configuration/__init__.py b/src/configuration/__init__.py index d48bf3ac11ab3c7bebd53e584f90218dc7715f78..4b461174af6a62f05364ebdff45141cd8ccc05c8 100644 --- a/src/configuration/__init__.py +++ b/src/configuration/__init__.py @@ -1,2 +1,2 @@ - +"""Collection of configuration functions, paths and classes.""" from .path_config import ROOT_PATH, prepare_host, set_experiment_name, set_bootstrap_path, check_path_and_create \ No newline at end of file diff --git a/src/configuration/join_settings.py b/src/configuration/join_settings.py index a7ee92311e23fccf96fd634199d52117b3450390..22d8b813d6b01c300e37c9d8a0dd4eb343cc87df 100644 --- a/src/configuration/join_settings.py +++ b/src/configuration/join_settings.py @@ -1,10 +1,24 @@ -def join_settings(sampling="daily"): +"""Settings to access not public join data.""" +from typing import Tuple, Dict + + +def join_settings(sampling="daily") -> Tuple[str, Dict]: + """ + Set url for join and required headers. + + Headers information is not required for daily resolution. For hourly data "Authorization": "<yourtoken>" is required + to retrieve any data at all. + + :param sampling: temporal resolution to access. Hourly data requires authorisation. + + :return: Service url and optional headers + """ if sampling == "daily": # pragma: no branch TOAR_SERVICE_URL = 'https://join.fz-juelich.de/services/rest/surfacedata/' headers = {} elif sampling == "hourly": TOAR_SERVICE_URL = 'https://join.fz-juelich.de/services/rest/surfacedata/' - headers = {} + headers = {"Authorization": "Token 12345"} else: raise NameError(f"Given sampling {sampling} is not supported, choose from either daily or hourly sampling.") return TOAR_SERVICE_URL, headers diff --git a/src/configuration/path_config.py b/src/configuration/path_config.py index 6b838472011edef1b9d52a4ffb9e2cb57aba9f68..6fdbbd2930596d57e953d3f6994face595357c25 100644 --- a/src/configuration/path_config.py +++ b/src/configuration/path_config.py @@ -1,12 +1,25 @@ +"""Functions related to path and os name setting.""" import logging import os import re import socket +from typing import Tuple ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) -def prepare_host(create_new=True, sampling="daily"): +def prepare_host(create_new=True, sampling="daily") -> str: + """ + Set up host path. + + Warning: This functions can only handle known hosts. For the moment, please add your hostname hardcoded here. For + future, this will be replace by a more flexible configuration file setup. + + :param create_new: Create new path if enabled + :param sampling: sampling rate to separate data physically by temporal resolution + + :return: full path of data + """ hostname = socket.gethostname() runner_regex = re.compile(r"runner-.*-project-2411-concurrent-\d+") try: @@ -41,12 +54,25 @@ def prepare_host(create_new=True, sampling="daily"): return path -def set_experiment_name(experiment_date=None, experiment_path=None, sampling=None): - if experiment_date is None: +def set_experiment_name(experiment_name=None, experiment_path=None, sampling=None) -> Tuple[str, str]: + """ + Set name of experiment and its path. + + * Experiment name is set to `TestExperiment` if not provided in kwargs. If a name is given, this string is expanded + by suffix `_network`. Experiment name is always expanded by `_<sampling>` as ending suffix if sampling is given. + * Experiment path is set to `ROOT_PATH/<exp_name>` if not provided or otherwise use `<experiment_path>/<exp_name>` + + :param experiment_name: custom experiment name + :param experiment_path: custom experiment path + :param sampling: sampling rate as string to add to experiment name + + :return: experiment name and full experiment path + """ + if experiment_name is None: experiment_name = "TestExperiment" else: - experiment_name = f"{experiment_date}_network" - if sampling == "hourly": + experiment_name = f"{experiment_name}_network" + if sampling is not None: experiment_name += f"_{sampling}" if experiment_path is None: experiment_path = os.path.abspath(os.path.join(ROOT_PATH, experiment_name)) @@ -55,14 +81,30 @@ def set_experiment_name(experiment_date=None, experiment_path=None, sampling=Non return experiment_name, experiment_path -def set_bootstrap_path(bootstrap_path, data_path, sampling): +def set_bootstrap_path(bootstrap_path: str, data_path: str, sampling: str) -> str: + """ + Set path for bootstrap input data. + + Either use given bootstrap_path or create additional folder in same directory like data path. + + :param bootstrap_path: custom path to store bootstrap data + :param data_path: path of data for default bootstrap path + :param sampling: sampling rate to add, if path is set to default + + :return: full bootstrap path + """ if bootstrap_path is None: bootstrap_path = os.path.join(data_path, "..", f"bootstrap_{sampling}") check_path_and_create(bootstrap_path) - return bootstrap_path + return os.path.abspath(bootstrap_path) + +def check_path_and_create(path: str) -> None: + """ + Check a given path and create if not existing. -def check_path_and_create(path): + :param path: path to check and create + """ try: os.makedirs(path) logging.debug(f"Created path: {path}") diff --git a/src/helpers/helpers.py b/src/helpers/helpers.py index a6023bd83f27cd7a47bdaa68c43d67e6f29ce2bb..968ee5385f5a44cdbbce5653a864875011874150 100644 --- a/src/helpers/helpers.py +++ b/src/helpers/helpers.py @@ -29,6 +29,7 @@ def dict_to_xarray(d: Dict, coordinate_name: str) -> xr.DataArray: :param d: dictionary with 2D-xarrays :param coordinate_name: name of the new created axis (2D -> 3D) + :return: combined xarray """ xarray = None @@ -51,6 +52,7 @@ def float_round(number: float, decimals: int = 0, round_type: Callable = math.ce :param decimals: numbers of decimals of the rounding operations (default 0 -> round to next integer value) :param round_type: the actual rounding operation. Can be any callable function like math.ceil, math.floor or python built-in round operation. + :return: rounded number with desired precision """ multiplier = 10. ** decimals