def test_ecsv_mixins_ascii_read_class(): """Ensure that ascii.read(ecsv_file) returns the correct class (QTable if any Quantity subclasses, Table otherwise). """ # Make a table with every mixin type except Quantities t = QTable({ name: col for name, col in mixin_cols.items() if not isinstance(col.info, QuantityInfo) }) out = StringIO() t.write(out, format="ascii.ecsv") t2 = ascii.read(out.getvalue(), format='ecsv') assert type(t2) is Table # Add a single quantity column t['lon'] = mixin_cols['lon'] out = StringIO() t.write(out, format="ascii.ecsv") t2 = ascii.read(out.getvalue(), format='ecsv') assert type(t2) is QTable
from astropy.units.format.fits import UnitScaleError from astropy.utils.data import get_pkg_data_filename from astropy.utils.exceptions import (AstropyUserWarning, AstropyDeprecationWarning) from astropy.utils.misc import _NOT_OVERWRITING_MSG_MATCH from astropy.time import Time from astropy.units.quantity import QuantityInfo from astropy.io.tests.mixin_columns import mixin_cols, compare_attrs, serialized_names # FITS does not preserve precision, in_subfmt, and out_subfmt. time_attrs = ['value', 'shape', 'format', 'scale', 'location'] compare_attrs = { name: (time_attrs if isinstance(col, Time) else compare_attrs[name]) for name, col in mixin_cols.items() } # FITS does not support multi-element location, array with object dtype, # or logarithmic quantities. unsupported_cols = { name: col for name, col in mixin_cols.items() if (isinstance(col, Time) and col.location.shape != () or isinstance(col, np.ndarray) and col.dtype.kind == 'O' or isinstance(col, u.LogQuantity)) } mixin_cols = { name: col for name, col in mixin_cols.items() if name not in unsupported_cols }
"""Take a col with length=2 and make it N-d by repeating elements. For the special case of ndim==1 just return the original. The output has shape [3] * ndim. By using 3 we can be sure that repeating the two input elements gives an output that is sufficiently unique for the multidim tests. """ if ndim > 1: import itertools idxs = [idx for idx, _ in zip(itertools.cycle([0, 1]), range(3**ndim))] col = col[idxs].reshape([3] * ndim) return col @pytest.mark.parametrize('name_col', list(mixin_cols.items())) @pytest.mark.parametrize('table_cls', (Table, QTable)) @pytest.mark.parametrize('ndim', (1, 2, 3)) def test_ecsv_mixins_per_column(table_cls, name_col, ndim): """Test write/read one col at a time and do detailed validation. This tests every input column type as 1-d, 2-d and 3-d. """ name, col = name_col c = make_multidim(np.array([1.0, 2.0]), ndim) col = make_multidim(col, ndim) t = table_cls([c, col, c], names=['c1', name, 'c2']) t[name].info.description = 'description' out = StringIO() t.write(out, format="ascii.ecsv")