A base class for building prompt-based beancount importers
Project description
Prompt Importer
This package provides a PromptImporter base class to build other beancount importers with.
The functionality PromptImporter provides is to prompt the user to input recipient accounts
for each transaction while keeping a list of common accounts for easy access.
For example:
02/05/2022: Online payment from CHK 1234, 100.00
What should the recipient account be? ('x' to not extract a transaction)
1. Expenses:Groceries 2. Expenses:Restaurants 3. Assets:Checking
>>
It also provides functionality to store regexes with which to automatically identify recipient accounts in the future.
Usage
Events
To create class that derives from PromptImporter you must first define a subclass of prompt_importer.Event.
Events represent single transactions from whatever type of file you are importing.
For example, if you are importing a csv file, you may have one event per row.
The subclass should implement the following methods:
get_field(self, field: str) -> str
Each event may have different fields associated with it. This method should return the value of a field given an associated field name.
get_id(self) -> str
This should return the globally unique id associated with an event.
display(self) -> str
This is how the event will be displayed to the user before the prompt.
get_transaction(self, filename: str, index: int, recipient_account: str) -> data.Transaction
This should return a transaction associated with an event. To help build the transaction, it takes the file the event was sourced from, its index within the file, and the account that should be the "recipient" of the transaction.
Note that the data.Transaction type refers to the data from beancount.core.
Importers
Once you have defined an event you can create a subclass of PromptImporter.
To do so, you must implement the typical methods associated with the beancountimporter.ImporterProtocol class.
Important: the value the method name(self) returns should not contain characters not allowed in SQLite table names, such as periods.
The importer should also implement the following method:
get_events(self, f) -> list[Event]
Given a beancount file this should return a list of events for the importer to process.
Example
The following is an example of an event importer for Bank of America credit card reports. The implementation of the typical beancount importer methods (identify, file, etc.) are omitted as they are not the focus.
import csv
from prompt_importer.importer import PromptImporter, Event
from beancount.core import amount, data, flags
from beancount.core.number import D
from dateutil.parser import parse
class BofaCCEvent(Event):
def __init__(self, row):
self.data = {
"Posted Date": row["Posted Date"],
"Amount": row["Amount"],
"Payee": row["Payee"],
"Reference Number": row["Reference Number"],
}
def get_field(self, field: str) -> str:
return self.data[field]
def get_id(self) -> str:
return f"{self.data['Reference Number']}"
def display(self) -> str:
return (
f"{self.data['Posted Date']}: {self.data['Payee']}, {self.data['Amount']}"
)
def get_transaction(
self, filename: str, index: int, recipient_account: str
) -> data.Transaction:
return data.Transaction(
meta=data.new_metadata(filename, index),
date=parse(self.data["Posted Date"]),
flag=flags.FLAG_OKAY,
payee=self.data["Payee"],
narration="",
tags=set(),
links=set(),
postings=[
data.Posting(
"Liabilities:BofaCreditCard",
amount.Amount(D(self.data["Amount"]), "USD"),
None,
None,
None,
None,
),
data.Posting(recipient_account, None, None, None, None, None),
],
)
class BofaCCImporter(PromptImporter):
def __init__(self, db_file):
super().__init__(db_file)
def name(self):
return "BofaCCImporter"
def get_events(self, f) -> list[Event]:
with open(f.name) as infile:
return [BofaCCEvent(row) for row in csv.DictReader(infile)]
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prompt_importer-0.1.2.tar.gz.
File metadata
- Download URL: prompt_importer-0.1.2.tar.gz
- Upload date:
- Size: 17.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.10.4 Darwin/20.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ddfd810ada82d0d02ac3db5db1bc765533b90801fa993d5a4846bc93b612af8
|
|
| MD5 |
a39a3e52fb5a55a589c65308991a4ab7
|
|
| BLAKE2b-256 |
485695159f8382f748f694ce3e67dfe0672681ebb9c9bd7ee51e5eb34ad7f7fa
|
File details
Details for the file prompt_importer-0.1.2-py3-none-any.whl.
File metadata
- Download URL: prompt_importer-0.1.2-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.10.4 Darwin/20.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
afbe92353dbdee0d4c1be69fc2784147b2edd2b4e0b688bf627985a72c10bd04
|
|
| MD5 |
e8f2087a4cfa8072538e3cef594dcfc2
|
|
| BLAKE2b-256 |
1d1a08364fd20269826fb1409eef47d382a97e7a0016d4704ce7dbbd4c2e01e4
|