diff --git a/py/desiutil/annotate.py b/py/desiutil/annotate.py index a201402..2e377a6 100644 --- a/py/desiutil/annotate.py +++ b/py/desiutil/annotate.py @@ -11,6 +11,7 @@ import os import sys from argparse import ArgumentParser +from warnings import warn import yaml from astropy.io import fits from astropy.table import Table, QTable @@ -19,6 +20,12 @@ from .log import get_logger, DEBUG +class FITSUnitWarning(UserWarning): + """Warnings related to invalid FITS units. + """ + pass + + def find_column_name(columns, prefix=('unit', )): """Find the column that contains unit descriptions, or comments. @@ -95,11 +102,10 @@ def validate_unit(unit, error=False): Raises ------ :exc:`ValueError` - If `error` is set and the unit can't be parsed. + If `error` is set and `unit` can't be parsed. """ if unit is None: return None - log = get_logger() acceptable_units = ('maggie', 'maggy', 'mgy', 'electron/Angstrom', 'log(Angstrom)') @@ -112,10 +118,9 @@ def validate_unit(unit, error=False): return bad_unit else: if error: - log.critical(str(e)) raise else: - log.warning(str(e)) + warn(m, FITSUnitWarning) return None diff --git a/py/desiutil/test/test_annotate.py b/py/desiutil/test/test_annotate.py index c562a2d..0b478dd 100644 --- a/py/desiutil/test/test_annotate.py +++ b/py/desiutil/test/test_annotate.py @@ -10,7 +10,7 @@ import numpy as np from astropy.io import fits from astropy.table import Table, QTable -from ..annotate import (annotate_fits, annotate_table, find_column_name, +from ..annotate import (FITSUnitWarning, annotate_fits, annotate_table, find_column_name, find_key_name, validate_unit, load_csv_units, load_yml_units, _options) @@ -97,8 +97,7 @@ def test_find_key_name(self): k = find_key_name({'RA': 'deg', 'DEC': 'deg', 'COLUMN': None}, prefix=('comment', 'description')) self.assertEqual(e.exception.args[0], "No key matching 'comment' found!") - @patch('desiutil.annotate.get_logger') - def test_validate_unit(self, mock_log): + def test_validate_unit(self): """Test function to validate units. """ m = "'ergs' did not parse as fits unit: At col 0, Unit 'ergs' not supported by the FITS standard. Did you mean erg?" @@ -109,9 +108,13 @@ def test_validate_unit(self, mock_log): self.assertIsNone(c) c = validate_unit('erg') self.assertIsNone(c) - c = validate_unit('ergs', error=False) + with self.assertWarns(FITSUnitWarning) as w: + c = validate_unit('ergs', error=False) + self.assertEqual(str(w.warning), m + l) self.assertIsNone(c) - c = validate_unit('1/deg^2') + with self.assertWarns(FITSUnitWarning) as w: + c = validate_unit('1/deg^2') + self.assertEqual(str(w.warning), d + l) self.assertIsNone(c) c = validate_unit('nanomaggies', error=True) self.assertEqual(c, "'nanomaggies'") @@ -121,8 +124,6 @@ def test_validate_unit(self, mock_log): with self.assertRaises(ValueError) as e: c = validate_unit('1/nanomaggy^2', error=True) self.assertEqual(str(e.exception), f + l) - mock_log().warning.assert_has_calls([call(m + l), call(d + l)]) - mock_log().critical.assert_has_calls([call(m + l), call(f + l)]) @patch('desiutil.annotate.get_logger') def test_load_csv_units(self, mock_log):