83 lines
2.4 KiB
Python
83 lines
2.4 KiB
Python
import asyncio
|
|
import argparse
|
|
|
|
import tomllib
|
|
|
|
from base.rules import DummyRuleInterface, JSONRuleInterface, RuleSet
|
|
from converters.wise_converter import WiseConverter
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
'converter',
|
|
help="Which converter to use. Available converters: 'wise'"
|
|
)
|
|
parser.add_argument(
|
|
'--config',
|
|
dest='config',
|
|
help="Ingest configuration file. Should be a toml file with a section for the selected converter."
|
|
)
|
|
parser.add_argument(
|
|
'--ingest',
|
|
dest='ingest',
|
|
help="File to ingest (must be in the correct format for the selected converter)"
|
|
)
|
|
parser.add_argument(
|
|
'-o', '--output',
|
|
dest='output',
|
|
default=None,
|
|
help="Path to output file to append processed transactions. If not given will use stdout."
|
|
)
|
|
parser.add_argument(
|
|
'--rules',
|
|
dest='rules',
|
|
default=None,
|
|
help="Path to JSON file with parsing rules. If not given, will use in-memory ruleset, with no saving."
|
|
)
|
|
|
|
|
|
|
|
async def main():
|
|
args = parser.parse_args()
|
|
converter = args.converter
|
|
ingest_file = args.ingest
|
|
out_path = args.output
|
|
rule_path = args.rules
|
|
config_path = args.config
|
|
|
|
# Create converter config
|
|
# TODO: Will need to move to tomlkit or other write-capable library
|
|
with open(config_path, "rb") as f:
|
|
root_config = tomllib.load(f)
|
|
|
|
# TODO: converter factory
|
|
converter_cls = WiseConverter
|
|
converter_config = converter_cls.config_type.from_dict(root_config[converter_cls.config_field])
|
|
converter = converter_cls(converter_config)
|
|
|
|
# TODO: rule interface factory
|
|
# Also dummy plug when no rules given
|
|
if rule_path:
|
|
rule_interface = JSONRuleInterface(converter_cls.qual_name(), path=rule_path)
|
|
else:
|
|
rule_interface = DummyRuleInterface(converter_cls.qual_name())
|
|
ruleset = await RuleSet.load_from(rule_interface)
|
|
|
|
print("Finished configuration. Loading records")
|
|
records = converter.ingest_file(ingest_file)
|
|
print(f"Loaded {len(records)} records.")
|
|
partials = [converter.convert(record, ruleset) for record in records]
|
|
print(f"Converted {len(partials)} partial transactions.")
|
|
for partial in partials:
|
|
print(repr(partial))
|
|
for record, partial in zip(records, partials):
|
|
print('\n'.join(record.display_table()))
|
|
print(repr(partial))
|
|
print('-'*10)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
asyncio.run(main())
|