Source code for pycropml.unitparser
""" Units.
"""
from __future__ import absolute_import
from __future__ import print_function
from pycropml.units import cyml_reg
from copy import copy
import xml.etree.ElementTree as xml
import six
from pycropml.pparse import Parser
from path import Path
import os
[docs]
class UnitDefinition(object):
"""
"""
def __init__(self, kwds):
self._attributes = kwds
for k, v in six.iteritems(kwds):
self.__setattr__(k,v)
def __repr__(self):
return str(self._attributes)
[docs]
class UnitList(UnitDefinition):
""" Formal description of a Model Unit. """
def __init__(self, kwds):
UnitDefinition.__init__(self, kwds)
self.unitvs=[]
def __repr__(self):
return 'Units'
[docs]
class UnitV(object):
""" Units.
"""
def __init__(self,symbol, value, offset,factor, prefixable=None, tex_repr=None):
self.symbol = symbol
self.value = value
self.offset = offset
self.factor=factor
self.prefixable=prefixable
self.tex_repr = tex_repr
[docs]
class UnitParser(Parser):
""" Read an XML file and transform it in our object model.
"""
[docs]
def parse(self, crop2mldir):
self.unitvs = []
self.crop2ml_dir = crop2mldir
xmlrep = Path(os.path.join(self.crop2ml_dir,'crop2ml'))
self.algorep = Path(os.path.join(self.crop2ml_dir,'crop2ml'))
f = xmlrep.glob('VarUnit*.xml')[0]
try:
# Current proxy node for managing properties
doc = xml.parse(f)
root = doc.getroot()
self.dispatch(root)
except Exception as e:
print(("%s is NOT in CropML Format ! %s" % (f, e)))
return self.unitvs
[docs]
def dispatch(self, elt):
#try:
return self.__getattribute__(elt.tag)(elt)
#except Exception, e:
# print e
#raise Exception("Unvalid element %s" % elt.tag)
[docs]
def UnitList(self, elts):
""" (UnitV)
"""
#print('Unit')
kwds = elts.attrib
self._unit = UnitList(kwds)
self.unitvs.append(self._unit)
for elt in list(elts):
self.dispatch(elt)
[docs]
def UnitV(self, elt):
""" Input
"""
#print('Input: ')
symbol=elt.attrib["symbol"]
value=elt.attrib["value"]
offset=elt.attrib["offset"]
factor=elt.attrib["factor"]
prefixable=elt.attrib["prefixable"]
tex_repr=elt.attrib["tex_repr"]
_unit = UnitV(symbol, value, offset, factor,prefixable, tex_repr)
self._unit.unitvs.append(_unit)
[docs]
def parser(crop2mldir):
"""
Parse a set of Units xml files contained in crop2ml directory
This function returns units as python object.
Parameters:
- Crop2mldir : package directory
Returns Units object of the Crop2ML Model.
"""
parser = UnitParser()
res = parser.parse(crop2mldir)[0]
#Runtime error if unit already exists in the registry
from . import units
for unit in res.unitvs:
if unit.value not in cyml_reg:
units.unit_object.define_unit(unit.symbol, (eval(unit.factor), unit.value), registry=cyml_reg)
return res