"""
Association Pools
"""
from collections import UserDict
from astropy.io.ascii import convert_numpy
from astropy.table import Row, Table
__all__ = ['AssociationPool']
DEFAULT_DELIMITER = '|'
DEFAULT_FORMAT = 'ascii'
[docs]
class AssociationPool(Table):
"""Association Pool
An ``AssociationPool`` is essentially an astropy Table with the
following default behaviors:
- ASCII tables with a default delimiter of `|`
- All values are read in as strings
"""
def __init__(self, *args, **kwargs):
super(AssociationPool, self).__init__(*args, **kwargs)
self.meta['pool_file'] = self.meta.get('pool_file', 'in-memory')
[docs]
@classmethod
def read(
cls,
filename,
delimiter=DEFAULT_DELIMITER,
format=DEFAULT_FORMAT,
**kwargs
):
"""Read in a Pool file
Parameters
----------
filename : str
File path to read in as a table.
delimiter : str
Character used to delineate columns.
format : str
The format of the input file.
Returns
-------
AssociationPool
The ``AssociationPool`` representation of the file.
"""
table = super(AssociationPool, cls).read(
filename, delimiter=delimiter,
format=format,
converters=convert_to_str, **kwargs
)
# If anything has been masked, just fill
table = table.filled('null')
# Lowercase the column names
# Note: Cannot do in-place because modifying the
# list while iterating.
columns = [column for name, column in table.columns.items()]
for c in columns:
c.name = c.name.lower()
table.meta['pool_file'] = filename
return table
[docs]
def write(self, *args, **kwargs):
"""Write the pool to a file.
Parameters
----------
output : str, file-like
The output file or file-like object.
delimiter : str
The string to use to delineate columns.
Default is '|'.
format : str
The format the file should be written in.
Default is 'ascii'.
args, kwargs : obj
Other parameters that ``astropy.io.ascii.write`` can accept.
"""
delimiter = kwargs.pop('delimiter', DEFAULT_DELIMITER)
format = kwargs.pop('format', DEFAULT_FORMAT)
try:
super(AssociationPool, self).write(
*args, delimiter=delimiter, format=format, **kwargs
)
except TypeError:
# Most likely caused by the actual `write` called
# does not handle `delimiter`. `jsviewer` is one
# such format.
# So, try again without a delimiter.
super(AssociationPool, self).write(
*args, format=format, **kwargs
)
class PoolRow(UserDict):
"""A row from an AssociationPool
Class to create a copy of an AssociationPool row without copying
all of the astropy.Table.Row private attributes.
"""
def __init__(self, init=None):
dict_init = dict(init)
super().__init__(dict_init)
try:
self.meta = init.meta
except AttributeError:
self.meta = dict()
def _convert_to_str():
func, type_ = convert_numpy(str)
def convert_func(vals):
"""Lowercase the conversion"""
results = func(vals)
results = [result.lower() for result in results]
return results
return [(convert_func, type_)]
convert_to_str = {'*': _convert_to_str()}