Source code for pysurfex.util
"""Misc."""
import collections
import logging
import os
import toml
[docs]def merge_toml_env(old_env, mods):
"""Merge."""
return deep_update(old_env, mods)
[docs]def merge_toml_env_from_files(toml_files):
"""Merge."""
merged_env = {}
for toml_file in toml_files:
if os.path.exists(toml_file):
with open(toml_file, mode="r", encoding="utf-8") as file_handler:
modification = toml.load(file_handler)
merged_env = merge_toml_env(merged_env, modification)
else:
print("WARNING: File not found " + toml_file)
return merged_env
[docs]def deep_update(source, overrides):
"""Update a nested dictionary or similar mapping.
Modify ``source`` in place.
Args:
source(dict): Source data
overrides(dict): Delta data to override
Returns:
source(dict): Updated dict
"""
for key, value in overrides.items():
if isinstance(value, collections.abc.Mapping) and value:
returned = deep_update(source.get(key, {}), value)
source[key] = returned
else:
override = overrides[key]
source[key] = override
return source
[docs]def remove_existing_file(f_in, f_out):
"""Remove existing file.
Args:
f_in (_type_): _description_
f_out (_type_): _description_
Raises:
FileNotFoundError: _description_
IsADirectoryError: _description_
"""
if f_in is None:
raise FileNotFoundError("Input file not set")
# If files are not the same file
if os.path.abspath(f_in) != os.path.abspath(f_out):
if os.path.isdir(f_out):
raise IsADirectoryError(
f_out + " is a directory! Please remove it if desired"
)
if os.path.islink(f_out):
os.unlink(f_out)
if os.path.isfile(f_out):
os.remove(f_out)
# files have the same path. Remove if it is a symlink
else:
if os.path.islink(f_out):
os.unlink(f_out)
[docs]def parse_filepattern(file_pattern, basetime, validtime):
"""Parse the file pattern.
Args:
file_pattern (str): File pattern.
basetime (datetime.datetime): Base time.
validtime (datetime.datetime): Valid time.
Returns:
str: File name
"""
if basetime is None or validtime is None:
return file_pattern
logging.debug(
"file_pattern=%s basetime=%s validtime=%s", file_pattern, basetime, validtime
)
file_name = str(file_pattern)
year = basetime.strftime("%Y")
year2 = basetime.strftime("%y")
month = basetime.strftime("%m")
day = basetime.strftime("%d")
hour = basetime.strftime("%H")
mins = basetime.strftime("%M")
d_t = validtime - basetime
ll_d = f"{int(d_t.seconds / 3600):d}"
ll_2 = f"{int(d_t.seconds / 3600):02d}"
ll_3 = f"{int(d_t.seconds / 3600):03d}"
ll_4 = f"{int(d_t.seconds / 3600):04d}"
file_name = file_name.replace("@YYYY@", year)
file_name = file_name.replace("@YY@", year2)
file_name = file_name.replace("@MM@", month)
file_name = file_name.replace("@DD@", day)
file_name = file_name.replace("@HH@", hour)
file_name = file_name.replace("@mm@", mins)
file_name = file_name.replace("@L@", ll_d)
file_name = file_name.replace("@LL@", ll_2)
file_name = file_name.replace("@LLL@", ll_3)
file_name = file_name.replace("@LLLL@", ll_4)
return file_name