Files
courses/2025_Research_Software_Engineering_2/workflow/scripts/checks.py
T
2025-07-30 15:57:48 +02:00

177 lines
3.5 KiB
Python

"""
Basic input validation checks.
Functions to check for :
- non-empty variables,
- existing file or directory paths
- correct command-line argument count
- two CRS's if they are equal
- dataframe valid and not empty
- if GeoDataFrame is valid and not empty
- if variable is member of a list
"""
import os
import sys
from pathlib import Path
import pandas as pd
import geopandas as gpd
def check_empty(variable):
"""
Checks if variable is not empty.
Arguments:
variable: variable to check.
Returns:
None
Raises:
ValueError: If the variable is empty.
"""
if not variable:
raise ValueError("Variable is empty")
def check_path(path):
"""
Checks if path exists.
Arguments:
path (str): path to check.
Returns:
None
Raises:
FileNotFoundError: If the path does not exist.
"""
if not os.path.exists(path):
raise FileNotFoundError(f"Invalid path: {path}")
def check_dir(path):
"""
Checks if directory exists.
Arguments:
path (str): path to check.
Returns:
None
Raises:
FileNotFoundError: If the directory's parent path does not exist.
"""
if not Path(path).parent.exists():
raise FileNotFoundError(f"Invalid directory path: {path}")
def check_args(num_arg, output):
"""
Checks sys arguments length against expected.
Args:
num_arg (int): expected number of arguments.
output (str): string to be printed in case of check failure.
Returns:
None
Raises:
RuntimeError: If the number of arguments does not match `num_arg`.
"""
if len(sys.argv) != num_arg:
raise RuntimeError(output)
def check_crs(crs1, crs2):
"""
Checks two CRS's if they are equal.
Arguments:
crs1: first CRS.
crs2: second CRS.
Returns:
None
Raises:
ValueError: If CRS's are not equal.
"""
if crs1 != crs2:
raise ValueError("CRS missmatch.")
def check_df(df):
"""
Checks if DataFrame is valid and not empty.
Arguments:
df: DataFrame to check.
Returns:
None
Raises:
TypeError: If not a DataFrame
ValueError: If DataFrame is empty
ValueError: If all values in the DataFrame are NaN
"""
if not isinstance(df, pd.DataFrame):
raise TypeError("Not a DataFrame.")
if df.empty:
raise ValueError("DataFrame is empty.")
if df.isna().all().all():
raise ValueError("DataFrame contains only NaN values.")
def check_gdf(gdf):
"""
Checks if GeoDataFrame is valid and not empty.
Arguments:
gdf: GeoDataFrame to check.
Returns:
None
Raises:
TypeError: if not an GeoDataFrame
ValueError: If GeoDataFrame is empty
ValueError: If includes empty geometries
"""
if not isinstance(gdf, gpd.GeoDataFrame):
raise TypeError("Not a GeoDataFrame.")
if gdf.empty:
raise ValueError("GeoDataFrame is empty.")
if gdf.geometry.isna().all():
raise ValueError("GeoDataFrame includes empty geometries.")
def check_member(variable, members):
"""
Check if variable is member of a list.
Arguments:
variable: to check
members (list): to check against.
Returns:
None
Raises:
ValueError: If variable is not member of allowed varibales.
"""
if variable not in members:
raise ValueError(f"Invalid value: {
variable}. Must be one of: {members}")