def parse(cls_, file_handle, date_format=None): if isinstance(file_handle, type('')): raise RuntimeError( six.u("parse() takes in a file handle, not a string")) data = file_handle.read() if len(data) == 0: raise QifParserException('Data is empty') qif_obj = Qif() chunks = data.split('\n^\n') last_type = None last_account = None transactions_header = None parsers = { 'category': cls_.parseCategory, 'security': cls_.parseSecurity, 'account': cls_.parseAccount, 'transaction': cls_.parseTransaction, 'investment': cls_.parseInvestment, 'class': cls_.parseClass, 'memorized': cls_.parseMemorizedTransaction } for chunk in chunks: if not chunk: continue first_line = chunk.split('\n')[0] if first_line == '!Option:AutoSwitch' or first_line == '!Clear:AutoSwitch': chunk = '\n'.join(chunk.split('\n')[1:]) first_line = chunk.split('\n')[0] if first_line == '!Type:Cat': last_type = 'category' elif first_line == '!Type:Security': last_type = 'security' elif first_line == '!Account': last_type = 'account' elif first_line in NON_INVST_ACCOUNT_TYPES: last_type = 'transaction' transactions_header = first_line elif first_line == '!Type:Invst': last_type = 'investment' transactions_header = first_line elif first_line == '!Type:Class': last_type = 'class' elif first_line == '!Type:Memorized': last_type = 'memorized' transactions_header = first_line elif chunk.startswith('!'): raise QifParserException('Header not reconized: ' + first_line) # if no header is recognized then # we use the previous one item = parsers[last_type](chunk) if last_type == 'account': qif_obj.add_account(item) last_account = item elif last_type == 'transaction'\ or last_type == 'memorized' or last_type == 'investment': if last_account: last_account.add_transaction(item, header=transactions_header) else: qif_obj.add_transaction(item, header=transactions_header) elif last_type == 'category': qif_obj.add_category(item) elif last_type == 'class': qif_obj.add_class(item) elif last_type == 'security': qif_obj.add_security(item) return qif_obj
def parse(cls_, file_handle, date_format=None): print("I'm In !") if isinstance(file_handle, type('')): raise RuntimeError( six.u("parse() takes in a file handle, not a string")) data = file_handle.read() if len(data) == 0: raise QifParserException('Data is empty') qif_obj = Qif() chunks = qif_obj.get_chunks(data) last_type = None last_account = None transactions_header = None parsers = { 'category': cls_.parseCategory, 'account': cls_.parseAccount, 'transaction': cls_.parseTransaction, 'investment': cls_.parseInvestment, 'class': cls_.parseClass, 'memorized': cls_.parseMemorizedTransaction, 'security': cls_.parseSecurity, 'prices': cls_.parsePrices } print("Got chunks") first_line_idx = 0 for chunk in chunks: if not chunk: continue first_line = chunk.split('\n')[first_line_idx] while first_line in OPTION_TYPES: first_line_idx += 1 first_line = chunk.split('\n')[first_line_idx] if first_line == '!Type:Cat': last_type = 'category' elif first_line == '!Account': last_type = 'account' elif first_line in NON_INVST_ACCOUNT_TYPES: last_type = 'transaction' transactions_header = first_line elif first_line == '!Type:Invst': last_type = 'investment' transactions_header = first_line elif first_line == '!Type:Class': last_type = 'class' elif first_line == '!Type:Memorized': last_type = 'memorized' elif first_line == '!Type:Security': last_type = 'security' elif first_line == '!Type:Prices': last_type = 'prices' elif chunk.startswith('!'): raise QifParserException('Header not reconized') # if no header is recognized then # we use the previous one item = parsers[last_type](chunk) if last_type == 'account': qif_obj.add_account(item) last_account = item elif last_type == 'transaction'\ or last_type == 'memorized' or last_type == 'investment': if last_account: last_account.add_transaction(item, header=transactions_header) else: qif_obj.add_transaction(item, header=transactions_header) elif last_type == 'category': qif_obj.add_category(item) elif last_type == 'class': qif_obj.add_class(item) elif last_type == 'security': qif_obj.add_security(item) elif last_type == 'prices': qif_obj.add_prices(item) return qif_obj