def parse_schema_from_rows(self, rows): shema = [] column_names = [] for row in rows: item = {'name': row[0], 'type': row[1], 'comment': row[-1]} if item['name'] in column_names: raise ParseSchemaError('%s column has the same name' % item['name']) column_names.append(item['name']) keyword = reg_keyword(item['comment']) ctype = reg_cmd(item['type']) if not keyword: keyword = item['type'] cmd = reg_cmd(keyword) if keyword else ctype rets = reg_args(keyword) if cmd == 'enum' or cmd == 'order_enum': if len(rets) == 0: raise EnumMustNotEmptyError # 如果enum类型只有一个值,则产生固定值 # 如果enum类型只有一个值,且以file://开头,则读取文件 if len(rets) == 1 and rets[0].startswith(ENUM_FILE): rets = read_file_lines(rets[0][len(ENUM_FILE):]) if ctype in INT_TYPES: args = [int(ret) for ret in rets] elif ctype in FLOAT_TYPES: args = [float(ret) for ret in rets] else: args = rets elif cmd in INT_TYPES: args = [int(ret) for ret in rets] args.append(True) if 'unsigned' in keyword else args.append( False) elif cmd == 'op': args = [ process_op_args(rets[0], 'columns'), ] else: try: args = [int(ret) for ret in rets] except: args = rets item['cmd'] = cmd item['ctype'] = ctype item['args'] = args shema.append(item) return shema
def test_reg_keyword(): assert 'name' == reg_keyword("wer[:name]234e") assert 'age(1,10)' == reg_keyword("wer[:age(1,10)]234e")