Source code for cdms2.CDML

"""
CDML Document Type Definition
This defines the CDML language
"""

# DTD constants
Cdata = 1
Id = 2
Idref = 3
Entity = 4
Entities = 5
Nmtoken = 6
Nmtokens = 7
Notation = 8

Required = 1
Implied = 2
Fixed = 3

# Data types

CdUByte = "UByte"
CdUShort = "UShort"
CdUInt = "UInt"
CdULong = "ULong"
CdUInt64 = "UInt64"
CdULongLong = "ULongLong"

CdByte = "Byte"
CdShort = "Short"
CdInt = "Int"
CdLong = "Long"
CdInt64 = "Int64"
CdLongLong = "LongLong"


CdChar = "Char"
CdFloat = "Float"
CdDouble = "Double"
CdString = "String"
CdFromObject = "FromObject"             # Datatype is same as parent object
CdAny = "Any"                           # Unspecified datatype

CdScalar = "Scalar"
CdArray = "Array"

# Note: at some point, this should be created dynamically
# from the XML DTD file. For now, it is built statically.


[docs]class CDML: cache = {} extraCache = {} def __init__(self, uri=None): self.dtd = self.cache.get(uri) self.extra = self.extraCache.get(uri) if not self.dtd: self.dtd = self.buildDTD(uri) self.cache[uri] = self.dtd self.extra = self.buildExtra(uri) self.extraCache[uri] = self.extra
[docs] def buildDTD(self, uri): dtd = {} dtd['attr'] = { 'name': (Cdata, Required), 'datatype': (("Char", "Byte", "Short", "Int", "Long", "Int64", "Float", "Double", "String"), Required), } dtd['axis'] = { 'id': (Id, Required), 'associate': (Idref, Implied), 'axis': (("X", "Y", "Z", "T"), Implied), 'bounds': (Idref, Implied), 'calendar': (Cdata, Implied), 'comment': (Cdata, Implied), 'component': (Cdata, Implied), 'compress': (Cdata, Implied), 'datatype': (("Char", "Byte", "Short", "Int", "Long", "Int64", "Float", "Double", "String"), Required), 'expand': (Idref, Implied), 'interval': (Cdata, Implied), 'isvar': (("true", "false"), "true"), 'length': (Cdata, Required), 'long_name': (Cdata, Implied), 'modulo': (Cdata, Implied), 'name_in_file': (Cdata, Implied), 'partition': (Cdata, Implied), 'partition_length': (Cdata, Implied), 'positive': (("up", "down"), Implied), 'spacing': (("uniform", "variable", "disjoint"), Implied), 'topology': (("linear", "circular"), Implied), 'weights': (Idref, Implied), 'units': (Cdata, Required), } dtd['component'] = { 'name': (Idref, Required), } dtd['dataset'] = { 'id': (Id, Required), 'Conventions': (Cdata, Required), 'appendices': (Cdata, Implied), 'calendar': (Cdata, Implied), 'cdms_filemap': (Cdata, Implied), 'comment': (Cdata, Implied), 'directory': (Cdata, Implied), 'frequency': (Cdata, Implied), 'history': (Cdata, Implied), 'institution': (Cdata, Implied), 'production': (Cdata, Implied), 'project': (Cdata, Implied), 'template': (Cdata, Implied), } dtd['doclink'] = { 'id': (Id, Implied), 'xml:link': (Cdata, (Fixed, "simple")), 'href': (Cdata, Required), 'role': (Cdata, Implied), 'title': (Cdata, Implied), 'show': (("embed", "replace", "new"), "replace"), 'actuate': (("auto", "user"), Implied), 'behavior': (Cdata, Implied), 'content-role': (Cdata, Implied), 'content-title': (Cdata, Implied), 'inline': (("true", "false"), "true"), } dtd['domain'] = {} dtd['domElem'] = { 'name': (Idref, Required), 'length': (Cdata, Implied), 'partition_length': (Cdata, Implied), 'start': (Cdata, Implied), } dtd['rectGrid'] = { 'id': (Id, Required), 'type': (("gaussian", "uniform", "equalarea", "unknown"), "unknown"), 'latitude': (Idref, Required), 'longitude': (Idref, Required), 'mask': (Idref, Implied), 'order': (("xy", "yx"), "yx"), } dtd['linear'] = { 'delta': (Cdata, Required), 'length': (Cdata, Required), 'start': (Cdata, Required), } dtd['variable'] = { 'id': (Id, Required), 'add_offset': (Cdata, Implied), 'associate': (Cdata, Implied), 'axis': (Cdata, Implied), 'comments': (Cdata, Implied), 'datatype': (("Char", "Byte", "Short", "Int", "Long", "Int64", "Float", "Double", "String"), Required), 'grid_name': (Cdata, Implied), 'grid_type': (Cdata, Implied), 'long_name': (Cdata, Implied), 'missing_value': (Cdata, Implied), 'name_in_file': (Cdata, Implied), 'scale_factor': (Cdata, Implied), 'subgrid': (Cdata, Implied), 'template': (Cdata, Implied), 'units': (Cdata, Implied), 'valid_max': (Cdata, Implied), 'valid_min': (Cdata, Implied), 'valid_range': (Cdata, Implied), } dtd['xlink'] = { 'id': (Id, Implied), 'xml:link': (Cdata, (Fixed, "simple")), 'href': (Cdata, Required), 'role': (Cdata, Implied), 'title': (Cdata, Implied), 'show': (("embed", "replace", "new"), "embed"), 'actuate': (("auto", "user"), Implied), 'behavior': (Cdata, Implied), 'content-role': (("dataset", "axis", "grid", "variable", "object"), "object"), 'content-title': (Cdata, Implied), 'inline': (("true", "false"), "true"), } return dtd
# Extra datatype information not included in the formal DTD.
[docs] def buildExtra(self, uri): extra = {} extra['attr'] = { 'name': (CdScalar, CdString), 'datatype': (CdScalar, CdString), } extra['axis'] = { 'id': (CdScalar, CdString), 'associate': (CdScalar, CdString), 'axis': (CdScalar, CdString), 'bounds': (CdArray, CdFromObject), 'calendar': (CdScalar, CdString), 'comment': (CdScalar, CdString), 'component': (CdScalar, CdString), 'compress': (CdScalar, CdString), 'datatype': (CdScalar, CdString), 'expand': (CdScalar, CdString), 'interval': (CdScalar, CdFromObject), 'isvar': (CdScalar, CdString), 'length': (CdScalar, CdInt), 'long_name': (CdScalar, CdString), 'modulo': (CdScalar, CdAny), 'name_in_file': (CdScalar, CdString), 'partition': (CdArray, CdInt), 'partition_length': (CdScalar, CdInt), 'positive': (CdScalar, CdString), 'spacing': (CdScalar, CdFromObject), 'topology': (CdScalar, CdString), 'weights': (CdArray, CdDouble), 'units': (CdScalar, CdString), } extra['component'] = { 'name': (CdScalar, CdString), } extra['dataset'] = { 'id': (CdScalar, CdString), 'Conventions': (CdScalar, CdString), 'appendices': (CdScalar, CdString), 'calendar': (CdScalar, CdString), 'cdms_filemap': (CdScalar, CdString), 'comment': (CdScalar, CdString), 'directory': (CdScalar, CdString), 'frequency': (CdScalar, CdString), 'history': (CdScalar, CdString), 'institution': (CdScalar, CdString), 'production': (CdScalar, CdString), 'project': (CdScalar, CdString), 'template': (CdScalar, CdString), } extra['doclink'] = { 'id': (CdScalar, CdString), 'xml:link': (CdScalar, CdString), 'href': (CdScalar, CdString), 'role': (CdScalar, CdString), 'title': (CdScalar, CdString), 'show': (CdScalar, CdString), 'actuate': (CdScalar, CdString), 'behavior': (CdScalar, CdString), 'content-role': (CdScalar, CdString), 'content-title': (CdScalar, CdString), 'inline': (CdScalar, CdString), } extra['domain'] = {} extra['domElem'] = { 'name': (CdScalar, CdString), 'length': (CdScalar, CdInt), 'partition_length': (CdScalar, CdInt), 'start': (CdScalar, CdInt), } extra['rectGrid'] = { 'id': (CdScalar, CdString), 'type': (CdScalar, CdString), 'latitude': (CdScalar, CdString), 'longitude': (CdScalar, CdString), 'mask': (CdScalar, CdString), 'order': (CdScalar, CdString), } extra['linear'] = { 'delta': (CdScalar, CdFromObject), 'length': (CdScalar, CdInt), 'start': (CdScalar, CdInt), } extra['variable'] = { 'id': (CdScalar, CdString), 'add_offset': (CdScalar, CdDouble), 'associate': (CdScalar, CdString), 'axis': (CdScalar, CdString), 'comments': (CdScalar, CdString), 'datatype': (CdScalar, CdString), 'grid_name': (CdScalar, CdString), 'grid_type': (CdScalar, CdString), 'long_name': (CdScalar, CdString), 'missing_value': (CdScalar, CdFromObject), 'name_in_file': (CdScalar, CdString), 'scale_factor': (CdScalar, CdDouble), 'subgrid': (CdScalar, CdString), 'template': (CdScalar, CdString), 'units': (CdScalar, CdString), 'valid_max': (CdScalar, CdFromObject), 'valid_min': (CdScalar, CdFromObject), 'valid_range': (CdArray, CdFromObject), } extra['xlink'] = { 'id': (CdScalar, CdString), 'xml:link': (CdScalar, CdString), 'href': (CdScalar, CdString), 'role': (CdScalar, CdString), 'title': (CdScalar, CdString), 'show': (CdScalar, CdString), 'actuate': (CdScalar, CdString), 'behavior': (CdScalar, CdString), 'content-role': (CdScalar, CdString), 'content-title': (CdScalar, CdString), 'inline': (CdScalar, CdString), } return extra
if __name__ == '__main__': cdml = CDML() print(cdml.extra) cdml2 = CDML() print(cdml2.extra)