def p_add_stmt(p): '''add_stmt : ADD adjectives name description''' # assignment_clause''' # eg "add pphys hw 'ch3:1,2,8,9' due friday" n = len(p.slice) type = '' # this has been subsumed in adjectives... adjectives = p[2] # list of objects, or empty list name = p[3] # string description = p[4] # string or None # assignments = p[5] # list of Set cmds? or empty list # cmd = Commands.Add(abby, type, name, description, adjectives, clauses) cmd = Commands.Add(abby, type, name, description, adjectives) p[0] = cmd log.debug('p_add_stmt: %s', p[0])
def Parse(self, stream): """ Iterator that returns command objects that it builds from the tokens returned by the given stream object. This is used by Import. """ import csv # python library print 'stream:', stream formattype = stream.formattype # eg ascii, human, asciiNoCR #, this bombs with "TypeError: argument 1 must be an iterator" # reader = csv.reader(stream) reader = csv.reader(stream.file, delimiter=stream.fielddelim) # first line should be field names # read first row and parse into fields (ie property names) #, note: this is different from self.propnames... consolidate somehow... propnames = reader.next() #, make sure they are lowercase # actually, want them to be capitalized ## for propname in propnames: ## propnames[ = propname.lower() # propnames = [propname.lower() for propname in propnames] # propnames = [Objects.GetInternalName(propname) for propname in propnames] propnames = [ Objects.GetExternalName(propname) for propname in propnames ] print 'propnames:', propnames #, get propobjs and proptypes props = [] for propname in propnames: #, this is liable to bomb if user gives bad propnames... prop = self.abby.Get(exactname=propname) props.append(prop) import Commands # get rows of property value lists from the stream, one by one for row in reader: # eg row=['neomem','project',''] print 'row:', row # get a dict of propnames and propvalues # basically stitch the two lists together... ## obj = Objects.Obj() ## for propname, propvalue in zip(propnames, row): ## obj.SetValue(propname, propvalue) ## self.abby._AddToIndex(obj) # this may raise an exception #, easier way to do this? # build a composite Clause object # clauses = Commands.Clauses() setcmds = Data.List() #? # for propname, propvalue in zip(propnames, row): for prop, propvalue in zip(props, row): # save name for later... # if propname=='Name': if prop.name == 'Name': name = propvalue # string value #dict[propname] = propvalue # wrap the propvalue string in a Data object # data = Data.Wrap(propvalue, formattype) #propvalue = Data.Factory(proptype, propvalue, formattype) # clause = Commands.Clause(propname, '=', data) # clause = Commands.Clause(prop, '=', data) #. set commands are not so appropriate here because they require an Object # to be applied to - clauses did not! setcmd = Commands.Set(obj, prop, propvalue) setcmds.append(setcmd) # must pass unique name here! # cmd = Commands.Add(self.abby, name=name, clauses=clauses) cmd = Commands.Add(self.abby, name=name, setcmds=setcmds) yield cmd # stop the ride... return