Source code for xrtpy.util.filters
"""
Utility functions for validating and standardizing Hinode/XRT filter names.
"""
[docs]
def solve_filter_name(name):
"""
Standardizes an XRT filter name to match expected format.
Parameters
----------
name : str
The filter name provided by the user. Can include hyphens, underscores, or inconsistent casing.
Returns
-------
str
A standardized filter name with correct capitalization and formatting.
Raises
------
TypeError
If the provided name is not a string.
Examples
--------
>>> solve_filter_name("al_poly")
'Al-Poly'
>>> solve_filter_name("be_thin/al_mesh")
'Be-Thin/Al-Mesh'
"""
if not isinstance(name, str):
raise TypeError("name must be a string")
name = name.replace("_", "-")
parts = name.split("/")
# new_parts = [part.capitalize() for part in parts]
new_parts = [part.title() for part in parts]
return "/".join(new_parts)
[docs]
def validate_and_format_filters(filters):
"""
Validates and formats XRT filter names. Ensures no duplicates.
Parameters
----------
filters : str or list of str
One or more filter names provided by the user.
Returns
-------
list of str
A list of unique, standardized filter names.
Raises
------
TypeError
If input is not a string or list of strings.
ValueError
If duplicate filters are found after formatting.
Examples
--------
>>> validate_and_format_filters("al_poly")
['Al-Poly']
>>> validate_and_format_filters(["be_thin", "be_thin"]) # doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
ValueError: Duplicate filters detected: ['Be-Thin', 'Be-Thin']
"""
if isinstance(filters, str):
filters = [filters]
elif not isinstance(filters, list):
raise TypeError("Input must be a string or list of strings.")
if not all(isinstance(f, str) for f in filters):
raise TypeError("All filter names must be strings.")
formatted = [solve_filter_name(f) for f in filters]
if len(set(formatted)) != len(formatted):
raise ValueError(f"Duplicate filters detected: {formatted}")
return formatted