def parse(cls, token_list, parent, allowed, ctx): ''' Parse section from token list @param token_list: a token list to be used @type token_list: L{SpecTokenList} @param parent: parent section or None @type parent: L{SpecSection} @param allowed: allowed sections within the section @type allowed: list of L{SpecSection} @param ctx: parsing context @type ctx: L{SpecModelParser} @return: parsed section @rtype: L{SpecSection} ''' ret = SpecExpressionParser.obj(parent) tokens = SpecTokenList() # let's assume, that the very first token is a part of an expression if str(token_list.touch()) == '!': tokens.token_list_append(token_list.get()) tokens.token_list_append(token_list.get()) else: tokens.token_list_append(token_list.get()) while True: tkn = token_list.touch() if str(tkn) == '>=' or str(tkn) == '<=' \ or str(tkn) == '<' or str(tkn) == '>' \ or str(tkn) == '!=' or str(tkn) == '==' \ or str(tkn) == '&&' or str(tkn) == '||' or str(tkn) == '!': tokens.token_list_append(token_list.get()) if token_list.touch().is_eof(): raise SpecBadToken("Unexpected EOF, expected expression termination") tokens.token_list_append(token_list.get()) continue else: break ret.set_tokens(tokens) return ret
def parse_entry(cls, token_list, parent, ctx): ''' Parse a changelog entry @param token_list: a token list to be used @type token_list: L{SpecTokenList} @param parent: parent section or None @type parent: L{SpecSection} @param ctx: parsing context @type ctx: L{SpecModelParser} @return: parsed section @rtype: L{SpecSection} ''' def parse_date(date): s = str(date[0]) + ' ' + str(date[1]) + ' ' + str(date[2]) + ' ' + str(date[3]) return datetime.datetime.strptime(s, '%a %b %d %Y') def changelog_entry_beginning_callback(obj, token_list): # changelog message can consist of keyword like: # - Add missing Requires: golang(github.com/gorilla/mux) to devel tkn = token_list.touch() if tkn.same_line(token_list[token_list.get_pointer() - 1]): return False # is there some section? res = obj.section_beginning_callback(obj, token_list) if res: return True # or is there another changelog entry? return str(token_list.touch()) == '*' entry = SpecChangelogParser.obj.SpecStChangelogEntry(parent) star = token_list.get() if str(star) != '*': token_list.unget() raise SpecBadToken("Expected token '*', got '%s'" % star) entry.set_star(star) date = SpecTokenList() for _ in xrange(0, 4): date.token_list_append(token_list.get()) entry.set_date(date) date_parsed = parse_date(date) entry.set_date_parsed(date_parsed) user = SpecTokenList() while not str(token_list.touch()).startswith('<'): user.token_list_append(token_list.get()) entry.set_user(user) user_email = token_list.get() entry.set_user_email(user_email) # version delim is optional here, if not stated, let's skip it if str(token_list.touch()) == '-': entry.set_version_delim(token_list.get()) version = token_list.get() entry.set_version(version) entry.set_message(token_list.get_while_not( functools.partial(changelog_entry_beginning_callback, ctx) ) ) return entry