Yet another question about class property.
Jim Qiu
bluefisher80 at gmail.com
Wed May 20 04:20:04 EDT 2009
Hi everyone,
Following is the code i am reading, i don't see anywhere the declaration of
Message.root object,
Where is it from?
#bots-modules
import bots.botslib as botslib
import bots.node as node
from bots.botsconfig import *
class Message(object):
''' abstract class; represents a edi message.
is subclassed as outmessage or inmessage object.
'''
def __init__(self):
self.recordnumber=0 #segment counter. Is not used for
UNT of SE record; some editypes want sequential recordnumbering
@staticmethod
def display(records):
'''for debugging lexed records.'''
for record in records:
t = 0
for veld in record:
if t==0:
print '%s (Record-id)'%(veld[VALUE])
else:
if veld[SFIELD]:
print ' %s (sub)'%(veld[VALUE])
else:
print ' %s (veld)'%(veld[VALUE])
t += 1
def get(self,*mpaths):
''' query tree (self.root) with mpath; get value (string); get None
if not found.'''
if self.root.record is None:
raise botslib.MpathRootError('get("%s"): "root" of incoming
message is empty; either split messages or use inn.getloop'%(str(mpaths)))
return self.root.get(*mpaths)
def getnozero(self,*mpaths):
''' like get, returns None is value is zero (0) or not numeric.
Is sometimes usefull in mapping.'''
if self.root.record is None:
raise botslib.MpathRootError('get("%s"): "root" of incoming
message is empty; either split messages or use inn.getloop'%(str(mpaths)))
return self.root.getnozero(*mpaths)
def getindicator(self,ind,*mpaths):
''' like get, returns None is value is zero (0) or not numeric.
Is sometimes usefull in mapping.'''
if self.root.record is None:
raise botslib.MpathRootError('get("%s"): "root" of incoming
message is empty; either split messages or use inn.getloop'%(str(mpaths)))
return self.root.getindicator(ind,*mpaths)
def getcount(self):
''' count number of nodes in self.root. Number of nodes is number of
records.'''
return self.root.getcount()
def getcountoccurrences(self,*mpaths):
''' count number of nodes in self.root. Number of nodes is number of
records.'''
count = 0
for value in self.getloop(*mpaths):
count += 1
return count
def getcountsum(self,*mpaths):
''' return the sum for all values found in mpath. Eg total number of
ordered quantities.'''
if self.root.record is None:
raise botslib.MpathRootError('get("%s"): "root" of incoming
message is empty; either split messages or use inn.getloop'%(str(mpaths)))
return self.root.getcountsum(*mpaths)
def getloop(self,*mpaths):
''' query tree with mpath; generates all the nodes. Is typically
used as: for record in inn.get(mpath):
'''
if self.root.record: #self.root is a real root
for terug in self.root.getloop(*mpaths): #search recursive for
rest of mpaths
yield terug
else: #self.root is dummy root
for childnode in self.root.children:
for terug in childnode.getloop(*mpaths): #search recursive
for rest of mpaths
yield terug
def put(self,*mpaths):
if self.root.record is None and self.root.children:
raise botslib.MpathRootError('put("%s"): "root" of outgoing
message is empty; use out.putloop'%(str(mpaths)))
return self.root.put(*mpaths)
def putloop(self,*mpaths):
if not self.root.record: #no input yet, and start with a
putloop(): dummy root
if len(mpaths) == 1:
self.root.append(node.Node(mpaths[0]))
return self.root.children[-1]
else: #TODO: what if self.root.record is None and len(mpaths) >
1?
raise botslib.MpathRootError('putloop("%s"): mpath too
long???'%(str(mpaths)))
return self.root.putloop(*mpaths)
def sort(self,*mpaths):
if self.root.record is None:
raise botslib.MpathRootError('get("%s"): "root" of message is
empty; either split messages or use inn.getloop'%(str(mpaths)))
self.root.sort(*mpaths)
def normalisetree(self,node):
''' The node tree is check, sorted, fields are formated etc.
Always use this method before writing output.
'''
#~ node.display()
#~ print 'normalisetree'
self._checktree(node,self.defmessage.structure[0])
self._canonicaltree(node,self.defmessage.structure[0])
def _checktree(self,tree,structure):
''' checks tree with table:
- all records should be in table at the right place in
hierarchy
- for each record, all fields should be in grammar
This function checks the root of grammar-structure with root of
node tree
'''
if tree.record['BOTSID'] == structure[ID]:
#check tree recursively with structure
self._checktreecore(tree,structure)
else:
raise botslib.MessageError('(Root)record %s of %s not in table
%s'%(tree.record['BOTSID'],tree.record,self.defmessage.grammarname))
def _checktreecore(self,node,structure):
''' recursive
'''
deletelist=[]
self._checkfields(node.record,structure)
if node.children and not LEVEL in structure:
if self.ta_info['checkunknownentities']:
raise botslib.MessageError('Record "%s" in message has
children, but structure of grammar "%s" not. Found gg
"%s".'%(node.record['BOTSID'],self.defmessage.grammarname,node.children[0].record['BOTSID']))
node.children=[]
return
for childnode in node.children: #for every node:
for structure_record in structure[LEVEL]: #search in
grammar-records
if childnode.record['BOTSID'] == structure_record[ID]: #if
found right structure_record
#check children recursive
self._checktreecore(childnode,structure_record)
break #check next mpathnode
else: #checked all structure_record in grammar, but nothing
found
if self.ta_info['checkunknownentities']:
raise botslib.MessageError('Record "%s" in message not
in structure of grammar "%s". Whole record:
"%s".'%(childnode.record['BOTSID'],self.defmessage.grammarname,childnode.record))
deletelist.append(childnode)
for child in deletelist:
node.children.remove(child)
def _checkfields(self,record,structure_record):
''' checks for every field in record if field exists in
structure_record (from grammar).
'''
deletelist=[]
for field in record.keys(): #all fields in record should
exist in structure_record
for grammarfield in structure_record[FIELDS]:
if grammarfield[ISFIELD]: #if field (no composite)
if field == grammarfield[ID]:
break
else: #if composite
for grammarsubfield in grammarfield[SUBFIELDS]: #loop
subfields
if field == grammarsubfield[ID]:
break
else:
continue
break
else:
if self.ta_info['checkunknownentities']:
raise botslib.MessageError('Field "%s" does not exist in
record: %s'%(field,structure_record[MPATH]))
#~ raise botslib.MessageError('Field "%s" does not exist
in record: %s'%(field,structure_record[ID])) #alt voor MPATH
#~ raise botslib.MessageError('Field "%s" does not exist
in record: %s'%(field,structure_record[FIELDS])) #folder, text is too long
deletelist.append(field)
for field in deletelist:
del record[field]
def _canonicaltree(self,node,structure,headerrecordnumber=0):
''' For nodes: check min and max occurence; sort the nodes conform
grammar
For fields: check M/C; format the fields.
'''
sortednodelist = []
self._canonicalfields(node.record,structure,headerrecordnumber)
#write the fields
if LEVEL in structure:
for structure_record in structure[LEVEL]: #for structure_record
of this level in grammar
count = 0 #count number of
occurences of record
for childnode in node.children: #for every node
in mpathtree; SPEED: delete nodes from list when found
if childnode.record['BOTSID'] != structure_record[ID]:
#if it is not the right NODE":
continue
count += 1
self._canonicaltree(childnode,structure_record,self.recordnumber)
#use rest of index in deeper level
sortednodelist.append(childnode)
if structure_record[MIN] > count:
raise botslib.MessageError('Record "%s": mandatory but
not present.'%(structure_record[MPATH]))
if structure_record[MAX] < count:
raise botslib.MessageError('Record "%s": occures to
often (%s times).'%(structure_record[MPATH],count))
node.children=sortednodelist
if hasattr(self,'do_queries'):
self.do_queries(node,structure)
def
_canonicalfields(self,noderecord,structure_record,headerrecordnumber):
''' For fields: check M/C; format the fields. Field are not sorted
here (a dict can not be sorted)
'''
#~ print noderecord
for grammarfield in structure_record[FIELDS]:
if grammarfield[ISFIELD]: #if field (no composite)
value = noderecord.get(grammarfield[ID],'')
#~ print 'check field',grammarfield,value
if not value:
if grammarfield[MANDATORY] == 'M':
raise botslib.MessageError('Record "%s": mandatory
field "%s" not filled.'%(structure_record[MPATH],grammarfield[ID]))
elif not grammarfield[MINLENGTH]: #if minlength=0
continue
noderecord[grammarfield[ID]] =
self._formatfield(value,grammarfield,structure_record)
else: #if composite
compositefilled = False
for grammarsubfield in grammarfield[SUBFIELDS]: #loop
subfields to see if one of them is there
if noderecord.get(grammarsubfield[ID],''):
compositefilled = True
if not compositefilled:
if grammarfield[MANDATORY]=='M':
raise botslib.MessageError('Record "%s": mandatory
composite "%s" not filled.'%(structure_record[MPATH],grammarfield[ID]))
continue
for grammarsubfield in grammarfield[SUBFIELDS]: #loop
subfields
value = noderecord.get(grammarsubfield[ID],'')
#~ print 'check subfield',grammarsubfield,value
if not value:
if grammarsubfield[MANDATORY]=='M':
#~ print 'Record "%s": mandatory subfield "%s"
not filled: "%s".'%(structure_record[MPATH],grammarsubfield[ID],noderecord)
raise botslib.MessageError('Record "%s":
mandatory subfield "%s" not filled:
"%s".'%(structure_record[MPATH],grammarsubfield[ID],noderecord))
else:
continue
noderecord[grammarsubfield[ID]] =
self._formatfield(value,grammarsubfield,structure_record)
#~ print 'fill',grammarfield[ID]
Thanks in advance.
Jim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20090520/163902e8/attachment.html>
More information about the Python-list
mailing list