Source code for gavo.grammars.cdfgrammar

"""
A grammar wrapping spacepy to parse files in the Common Data Format (CDF),
http://cdf.gsfc.nasa.gov.
"""

#c Copyright 2008-2023, the GAVO project <gavo@ari.uni-heidelberg.de>
#c
#c This program is free software, covered by the GNU GPL.  See the
#c COPYING file in the source distribution.


from gavo import base
from gavo.grammars.common import Grammar, RowIterator, MapKeys


[docs]class CDFHeaderIterator(RowIterator): """an iterator for headers of CDF files. """ def _iterRows(self): try: from spacepy import pycdf except ImportError: raise base.ui.logOldExc( base.ReportableError("cdfHeaderGrammar needs the external" " spacepy package. You can obtain it from" " http://spacepy.lanl.gov.")) cdfStruct = pycdf.CDF(self.sourceToken) res = {} for key, value in cdfStruct.attrs.items(): if self.grammar.autoAtomize and value.max_idx()==0: res[key] = value[0] else: res[key] = value[:] yield res
[docs]class CDFHeaderGrammar(Grammar): """A grammar that returns the header dictionary of a CDF file (global attributes). This grammar yields a single dictionary per file, which corresponds to the global attributes. The values in this dictionary may have complex structure; in particular, sequences are returned as lists. To use this grammar, additional software is required that (by 2014) is not packaged for Debian. See https://pythonhosted.org/SpacePy/install.html for installation instructions. Note that you must install the CDF library itself as described further down on that page; the default installation instructions do not install the library in a public place, so if you use these, you'll have to set CDF_LIB to the right value, too, before running dachs imp. """ name_ = "cdfHeaderGrammar" _mapKeys = base.StructAttribute("mapKeys", childFactory=MapKeys, default=None, copyable=True, description="Prescription for how to" " map labels keys to grammar dictionary keys") _autoAtomize = base.BooleanAttribute("autoAtomize", default=False, copyable=True, description="Unpack 1-element" " lists to their first value.") rowIterator = CDFHeaderIterator
[docs] def onElementComplete(self): if self.mapKeys is None: self.mapKeys = base.makeStruct(MapKeys) super().onElementComplete()