tariochbctools 0.38.1__py2.py3-none-any.whl → 1.0.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tariochbctools/importers/bcge/importer.py +4 -3
- tariochbctools/importers/bitst/importer.py +23 -19
- tariochbctools/importers/blockchain/importer.py +9 -8
- tariochbctools/importers/cembrastatement/importer.py +44 -28
- tariochbctools/importers/general/mailAdapterImporter.py +12 -13
- tariochbctools/importers/general/mt940importer.py +18 -19
- tariochbctools/importers/general/priceLookup.py +6 -6
- tariochbctools/importers/ibkr/importer.py +21 -18
- tariochbctools/importers/neon/importer.py +17 -15
- tariochbctools/importers/netbenefits/importer.py +24 -16
- tariochbctools/importers/nordigen/importer.py +7 -7
- tariochbctools/importers/nordigen/nordigen_config.py +12 -11
- tariochbctools/importers/postfinance/importer.py +20 -17
- tariochbctools/importers/quickfile/importer.py +11 -11
- tariochbctools/importers/raiffeisench/importer.py +3 -7
- tariochbctools/importers/revolut/importer.py +23 -18
- tariochbctools/importers/schedule/importer.py +11 -8
- tariochbctools/importers/swisscard/importer.py +17 -15
- tariochbctools/importers/transferwise/importer.py +15 -14
- tariochbctools/importers/truelayer/importer.py +25 -16
- tariochbctools/importers/viseca/importer.py +24 -16
- tariochbctools/importers/zak/importer.py +51 -44
- tariochbctools/importers/zkb/importer.py +3 -2
- tariochbctools/plugins/prices/ibkr.py +6 -3
- {tariochbctools-0.38.1.dist-info → tariochbctools-1.0.0.dist-info}/METADATA +6 -3
- tariochbctools-1.0.0.dist-info/RECORD +55 -0
- {tariochbctools-0.38.1.dist-info → tariochbctools-1.0.0.dist-info}/WHEEL +1 -1
- tariochbctools-0.38.1.dist-info/RECORD +0 -55
- {tariochbctools-0.38.1.dist-info → tariochbctools-1.0.0.dist-info}/LICENSE.txt +0 -0
- {tariochbctools-0.38.1.dist-info → tariochbctools-1.0.0.dist-info}/entry_points.txt +0 -0
- {tariochbctools-0.38.1.dist-info → tariochbctools-1.0.0.dist-info}/top_level.txt +0 -0
@@ -2,8 +2,10 @@ import base64
|
|
2
2
|
import json
|
3
3
|
from datetime import date, datetime, timezone
|
4
4
|
from os import path
|
5
|
+
from typing import Any
|
5
6
|
from urllib.parse import urlencode
|
6
7
|
|
8
|
+
import beangulp
|
7
9
|
import dateutil.parser
|
8
10
|
import requests
|
9
11
|
import rsa
|
@@ -11,22 +13,21 @@ import urllib3
|
|
11
13
|
import yaml
|
12
14
|
from beancount.core import amount, data
|
13
15
|
from beancount.core.number import D
|
14
|
-
from beancount.ingest import importer
|
15
16
|
from dateutil.relativedelta import relativedelta
|
16
17
|
|
17
18
|
http = urllib3.PoolManager()
|
18
19
|
|
19
20
|
|
20
|
-
class Importer(
|
21
|
+
class Importer(beangulp.Importer):
|
21
22
|
"""An importer for Transferwise using the API."""
|
22
23
|
|
23
|
-
def identify(self,
|
24
|
-
return path.basename(
|
24
|
+
def identify(self, filepath: str) -> bool:
|
25
|
+
return path.basename(filepath).endswith("transferwise.yaml")
|
25
26
|
|
26
|
-
def
|
27
|
+
def account(self, filepath: str) -> data.Account:
|
27
28
|
return ""
|
28
29
|
|
29
|
-
def __init__(self, *args, **kwargs):
|
30
|
+
def __init__(self, *args: Any, **kwargs: Any):
|
30
31
|
if "profileId" in kwargs:
|
31
32
|
self.profileId = kwargs.pop("profileId")
|
32
33
|
if "startDate" in kwargs:
|
@@ -49,10 +50,10 @@ class Importer(importer.ImporterProtocol):
|
|
49
50
|
# MIT license
|
50
51
|
def _get_statement(
|
51
52
|
self,
|
52
|
-
currency,
|
53
|
-
base_url,
|
54
|
-
statement_type="FLAT",
|
55
|
-
):
|
53
|
+
currency: str,
|
54
|
+
base_url: str,
|
55
|
+
statement_type: str = "FLAT",
|
56
|
+
) -> Any:
|
56
57
|
params = urlencode(
|
57
58
|
{
|
58
59
|
"currency": currency,
|
@@ -78,8 +79,8 @@ class Importer(importer.ImporterProtocol):
|
|
78
79
|
"Content-Type": "application/json",
|
79
80
|
}
|
80
81
|
if hasattr(self, "one_time_token"):
|
81
|
-
headers["x-2fa-approval"] = self.one_time_token
|
82
|
-
headers["X-Signature"] = self.signature
|
82
|
+
headers["x-2fa-approval"] = self.one_time_token # type: ignore
|
83
|
+
headers["X-Signature"] = self.signature # type: ignore
|
83
84
|
|
84
85
|
r = http.request("GET", url, headers=headers, retries=False)
|
85
86
|
|
@@ -115,8 +116,8 @@ class Importer(importer.ImporterProtocol):
|
|
115
116
|
|
116
117
|
return signature
|
117
118
|
|
118
|
-
def extract(self,
|
119
|
-
with open(
|
119
|
+
def extract(self, filepath, existing):
|
120
|
+
with open(filepath, "r") as f:
|
120
121
|
config = yaml.safe_load(f)
|
121
122
|
self.api_token = config["token"]
|
122
123
|
baseAccount = config["baseAccount"]
|
@@ -1,13 +1,14 @@
|
|
1
1
|
import logging
|
2
2
|
from datetime import timedelta
|
3
3
|
from os import path
|
4
|
+
from typing import Any
|
4
5
|
|
6
|
+
import beangulp
|
5
7
|
import dateutil.parser
|
6
8
|
import requests
|
7
9
|
import yaml
|
8
10
|
from beancount.core import amount, data
|
9
11
|
from beancount.core.number import D
|
10
|
-
from beancount.ingest import importer
|
11
12
|
|
12
13
|
# https://docs.truelayer.com/#retrieve-account-transactions
|
13
14
|
|
@@ -24,7 +25,7 @@ TX_OPTIONAL_META_ID_FIELDS = (
|
|
24
25
|
)
|
25
26
|
|
26
27
|
|
27
|
-
class Importer(
|
28
|
+
class Importer(beangulp.Importer):
|
28
29
|
"""An importer for Truelayer API (e.g. for Revolut)."""
|
29
30
|
|
30
31
|
def __init__(self):
|
@@ -33,17 +34,17 @@ class Importer(importer.ImporterProtocol):
|
|
33
34
|
self.clientSecret = None
|
34
35
|
self.refreshToken = None
|
35
36
|
self.sandbox = None
|
36
|
-
self.
|
37
|
+
self.existing = None
|
37
38
|
self.domain = "truelayer.com"
|
38
39
|
|
39
|
-
def _configure(self,
|
40
|
-
with open(
|
40
|
+
def _configure(self, filepath: str, existing: data.Entries) -> None:
|
41
|
+
with open(filepath, "r") as f:
|
41
42
|
self.config = yaml.safe_load(f)
|
42
43
|
self.clientId = self.config["client_id"]
|
43
44
|
self.clientSecret = self.config["client_secret"]
|
44
45
|
self.refreshToken = self.config["refresh_token"]
|
45
46
|
self.sandbox = self.clientId.startswith("sandbox")
|
46
|
-
self.
|
47
|
+
self.existing = existing
|
47
48
|
|
48
49
|
if self.sandbox:
|
49
50
|
self.domain = "truelayer-sandbox.com"
|
@@ -51,14 +52,14 @@ class Importer(importer.ImporterProtocol):
|
|
51
52
|
if "account" not in self.config and "accounts" not in self.config:
|
52
53
|
raise KeyError("At least one of `account` or `accounts` must be specified")
|
53
54
|
|
54
|
-
def identify(self,
|
55
|
-
return path.basename(
|
55
|
+
def identify(self, filepath: str) -> bool:
|
56
|
+
return path.basename(filepath).endswith("truelayer.yaml")
|
56
57
|
|
57
|
-
def
|
58
|
+
def account(self, filepath: str) -> data.Account:
|
58
59
|
return ""
|
59
60
|
|
60
|
-
def extract(self,
|
61
|
-
self._configure(
|
61
|
+
def extract(self, filepath: str, existing: data.Entries = None) -> data.Entries:
|
62
|
+
self._configure(filepath, existing)
|
62
63
|
|
63
64
|
r = requests.post(
|
64
65
|
f"https://auth.{self.domain}/connect/token",
|
@@ -81,7 +82,7 @@ class Importer(importer.ImporterProtocol):
|
|
81
82
|
|
82
83
|
return entries
|
83
84
|
|
84
|
-
def _get_account_for_account_id(self, account_id):
|
85
|
+
def _get_account_for_account_id(self, account_id: str) -> data.Account:
|
85
86
|
"""
|
86
87
|
Find a matching account for the account ID.
|
87
88
|
If the user hasn't specified any in the config, return
|
@@ -99,7 +100,9 @@ class Importer(importer.ImporterProtocol):
|
|
99
100
|
|
100
101
|
return self.config["accounts"].get(account_id, None)
|
101
102
|
|
102
|
-
def _extract_endpoint_transactions(
|
103
|
+
def _extract_endpoint_transactions(
|
104
|
+
self, endpoint: str, headers: dict[str, str], invert_sign: bool = False
|
105
|
+
) -> data.Entries:
|
103
106
|
entries = []
|
104
107
|
r = requests.get(
|
105
108
|
f"https://api.{self.domain}/data/v1/{endpoint}", headers=headers
|
@@ -137,7 +140,13 @@ class Importer(importer.ImporterProtocol):
|
|
137
140
|
|
138
141
|
return entries
|
139
142
|
|
140
|
-
def _extract_transaction(
|
143
|
+
def _extract_transaction(
|
144
|
+
self,
|
145
|
+
trx: dict[str, Any],
|
146
|
+
local_account: data.Account,
|
147
|
+
transactions: list[Any],
|
148
|
+
invert_sign: bool,
|
149
|
+
) -> data.Transaction:
|
141
150
|
entries = []
|
142
151
|
metakv = {}
|
143
152
|
|
@@ -187,8 +196,8 @@ class Importer(importer.ImporterProtocol):
|
|
187
196
|
if trx["transaction_id"] == transactions[-1]["transaction_id"]:
|
188
197
|
balDate = trxDate + timedelta(days=1)
|
189
198
|
metakv = {}
|
190
|
-
if self.
|
191
|
-
for exEntry in self.
|
199
|
+
if self.existing is not None:
|
200
|
+
for exEntry in self.existing:
|
192
201
|
if (
|
193
202
|
isinstance(exEntry, data.Balance)
|
194
203
|
and exEntry.date == balDate
|
@@ -1,26 +1,32 @@
|
|
1
1
|
import re
|
2
2
|
from datetime import datetime
|
3
3
|
|
4
|
+
import beangulp
|
4
5
|
import camelot
|
5
6
|
from beancount.core import amount, data
|
6
7
|
from beancount.core.number import D
|
7
|
-
from beancount.ingest import importer
|
8
|
-
from beancount.ingest.importers.mixins import identifier
|
9
8
|
|
10
9
|
|
11
|
-
class Importer(
|
10
|
+
class Importer(beangulp.Importer):
|
12
11
|
"""An importer for Viseca One Card Statement PDF files."""
|
13
12
|
|
14
|
-
def __init__(self,
|
15
|
-
|
16
|
-
self.
|
13
|
+
def __init__(self, filepattern: str, account: data.Account):
|
14
|
+
self._filepattern = filepattern
|
15
|
+
self._account = account
|
17
16
|
self.currency = "CHF"
|
18
17
|
|
19
|
-
def
|
20
|
-
return self.
|
18
|
+
def identify(self, filepath: str) -> bool:
|
19
|
+
return re.search(self._filepattern, filepath) is not None
|
21
20
|
|
22
|
-
def
|
21
|
+
def account(self, filepath: str) -> data.Account:
|
22
|
+
return self._account
|
23
|
+
|
24
|
+
def createEntry(
|
25
|
+
self, filepath: str, date: str, entryAmount: str | None, text: str
|
26
|
+
) -> data.Transaction:
|
23
27
|
amt = None
|
28
|
+
if not entryAmount:
|
29
|
+
entryAmount = ""
|
24
30
|
entryAmount = entryAmount.replace("'", "")
|
25
31
|
if "-" in entryAmount:
|
26
32
|
amt = amount.Amount(D(entryAmount.strip(" -")), "CHF")
|
@@ -29,7 +35,7 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
29
35
|
|
30
36
|
book_date = datetime.strptime(date, "%d.%m.%y").date()
|
31
37
|
|
32
|
-
meta = data.new_metadata(
|
38
|
+
meta = data.new_metadata(filepath, 0)
|
33
39
|
return data.Transaction(
|
34
40
|
meta,
|
35
41
|
book_date,
|
@@ -39,11 +45,11 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
39
45
|
data.EMPTY_SET,
|
40
46
|
data.EMPTY_SET,
|
41
47
|
[
|
42
|
-
data.Posting(self.
|
48
|
+
data.Posting(self._account, amt, None, None, None, None),
|
43
49
|
],
|
44
50
|
)
|
45
51
|
|
46
|
-
def extract(self,
|
52
|
+
def extract(self, filepath: str, existing: data.Entries) -> data.Entries:
|
47
53
|
entries = []
|
48
54
|
|
49
55
|
p = re.compile(r"^\d\d\.\d\d\.\d\d$")
|
@@ -51,7 +57,7 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
51
57
|
columns = ["100,132,400,472,523"]
|
52
58
|
|
53
59
|
firstPageTables = camelot.read_pdf(
|
54
|
-
|
60
|
+
filepath,
|
55
61
|
flavor="stream",
|
56
62
|
pages="1",
|
57
63
|
table_regions=["65,450,585,50"],
|
@@ -59,7 +65,7 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
59
65
|
split_text=True,
|
60
66
|
)
|
61
67
|
otherPageTables = camelot.read_pdf(
|
62
|
-
|
68
|
+
filepath,
|
63
69
|
flavor="stream",
|
64
70
|
pages="2-end",
|
65
71
|
table_regions=["65,650,585,50"],
|
@@ -91,7 +97,9 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
91
97
|
if amountChf:
|
92
98
|
if lastTrxDate:
|
93
99
|
entries.append(
|
94
|
-
self.createEntry(
|
100
|
+
self.createEntry(
|
101
|
+
filepath, lastTrxDate, lastAmount, lastDetails
|
102
|
+
)
|
95
103
|
)
|
96
104
|
|
97
105
|
lastTrxDate = trxDate
|
@@ -102,7 +110,7 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
102
110
|
|
103
111
|
if lastTrxDate:
|
104
112
|
entries.append(
|
105
|
-
self.createEntry(
|
113
|
+
self.createEntry(filepath, lastTrxDate, lastAmount, lastDetails)
|
106
114
|
)
|
107
115
|
|
108
116
|
return entries
|
@@ -1,32 +1,37 @@
|
|
1
1
|
import re
|
2
2
|
from datetime import timedelta
|
3
3
|
|
4
|
+
import beangulp
|
4
5
|
import camelot
|
5
6
|
import pandas as pd
|
6
7
|
from beancount.core import amount, data
|
7
8
|
from beancount.core.number import D
|
8
|
-
from beancount.ingest import importer
|
9
|
-
from beancount.ingest.importers.mixins import identifier
|
10
9
|
from dateutil.parser import parse
|
11
10
|
|
12
11
|
|
13
|
-
class Importer(
|
12
|
+
class Importer(beangulp.Importer):
|
14
13
|
"""An importer for Bank Cler ZAK PDF files files."""
|
15
14
|
|
16
|
-
def __init__(self,
|
17
|
-
|
18
|
-
self.
|
15
|
+
def __init__(self, filepattern: str, account: data.Account):
|
16
|
+
self._filepattern = filepattern
|
17
|
+
self._account = account
|
19
18
|
|
20
|
-
def
|
21
|
-
return self.
|
19
|
+
def account(self, filepath: str) -> data.Account:
|
20
|
+
return self._account
|
22
21
|
|
23
|
-
def
|
22
|
+
def identify(self, filepath: str) -> bool:
|
23
|
+
return re.search(self._filepattern, filepath) is not None
|
24
|
+
|
25
|
+
def createEntry(
|
26
|
+
self, filepath: str, date: str, amt: str, text: str
|
27
|
+
) -> data.Transaction:
|
24
28
|
bookingNrRgexp = re.compile(r"BC Buchungsnr. (?P<bookingRef>\d+)$")
|
25
29
|
m = bookingNrRgexp.search(text)
|
26
|
-
|
27
|
-
|
30
|
+
if m:
|
31
|
+
bookingRef = m.group("bookingRef")
|
32
|
+
text = re.sub(bookingNrRgexp, "", text)
|
28
33
|
|
29
|
-
meta = data.new_metadata(
|
34
|
+
meta = data.new_metadata(filepath, 0, {"zakref": bookingRef})
|
30
35
|
return data.Transaction(
|
31
36
|
meta,
|
32
37
|
parse(date.strip(), dayfirst=True).date(),
|
@@ -37,41 +42,41 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
37
42
|
data.EMPTY_SET,
|
38
43
|
[
|
39
44
|
data.Posting(
|
40
|
-
self.
|
45
|
+
self._account, amount.Amount(D(amt), "CHF"), None, None, None, None
|
41
46
|
),
|
42
47
|
],
|
43
48
|
)
|
44
49
|
|
45
|
-
def createBalanceEntry(self,
|
46
|
-
meta = data.new_metadata(
|
50
|
+
def createBalanceEntry(self, filepath: str, date: str, amt: str) -> data.Balance:
|
51
|
+
meta = data.new_metadata(filepath, 0)
|
47
52
|
return data.Balance(
|
48
53
|
meta,
|
49
54
|
parse(date.strip(), dayfirst=True).date() + timedelta(days=1),
|
50
|
-
self.
|
55
|
+
self._account,
|
51
56
|
amount.Amount(D(amt), "CHF"),
|
52
57
|
None,
|
53
58
|
None,
|
54
59
|
)
|
55
60
|
|
56
|
-
def cleanNumber(self, number):
|
61
|
+
def cleanNumber(self, number: str | data.Decimal) -> data.Decimal:
|
57
62
|
if isinstance(number, str):
|
58
63
|
return D(number.replace("'", ""))
|
59
64
|
else:
|
60
65
|
return number
|
61
66
|
|
62
|
-
def extract(self,
|
67
|
+
def extract(self, filepath: str, existing: data.Entries) -> data.Entries:
|
63
68
|
entries = []
|
64
69
|
|
65
70
|
firstPageTables = camelot.read_pdf(
|
66
|
-
|
71
|
+
filepath, flavor="stream", pages="1", table_regions=["60,450,600,170"]
|
67
72
|
)
|
68
73
|
otherPageTables = camelot.read_pdf(
|
69
|
-
|
74
|
+
filepath, flavor="stream", pages="2-end", table_regions=["60,630,600,170"]
|
70
75
|
)
|
71
76
|
|
72
77
|
tables = [*firstPageTables, *otherPageTables]
|
73
78
|
|
74
|
-
df = None
|
79
|
+
df: pd.DataFrame | None = None
|
75
80
|
for table in tables:
|
76
81
|
cur_df = table.df
|
77
82
|
new_header = cur_df.iloc[0]
|
@@ -87,36 +92,38 @@ class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
|
|
87
92
|
text = ""
|
88
93
|
amount = None
|
89
94
|
saldo = None
|
90
|
-
|
91
|
-
|
92
|
-
if
|
93
|
-
|
95
|
+
if df:
|
96
|
+
for row in df.itertuples():
|
97
|
+
if row.Saldo:
|
98
|
+
if date and amount:
|
99
|
+
entries.append(self.createEntry(filepath, date, amount, text))
|
94
100
|
|
95
|
-
|
96
|
-
|
97
|
-
|
101
|
+
date = None
|
102
|
+
amount = None
|
103
|
+
text = ""
|
98
104
|
|
99
|
-
|
100
|
-
|
105
|
+
if row.Valuta:
|
106
|
+
date = row.Valuta
|
101
107
|
|
102
|
-
|
103
|
-
|
108
|
+
if row.Text:
|
109
|
+
text += " " + row.Text
|
104
110
|
|
105
|
-
|
106
|
-
|
111
|
+
if row.Belastung:
|
112
|
+
amount = -self.cleanNumber(row.Belastung)
|
107
113
|
|
108
|
-
|
109
|
-
|
114
|
+
if row.Gutschrift:
|
115
|
+
amount = self.cleanNumber(row.Gutschrift)
|
110
116
|
|
111
|
-
|
112
|
-
|
117
|
+
if row.Saldo:
|
118
|
+
saldo = self.cleanNumber(row.Saldo)
|
113
119
|
|
114
|
-
|
115
|
-
|
120
|
+
if date and amount:
|
121
|
+
entries.append(self.createEntry(filepath, date, amount, text))
|
116
122
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
123
|
+
dateRegexp = re.compile(r"\d\d\.\d\d\.\d\d\d\d")
|
124
|
+
m = dateRegexp.search(text)
|
125
|
+
if m and saldo:
|
126
|
+
date = m.group()
|
127
|
+
entries.append(self.createBalanceEntry(filepath, date, saldo))
|
121
128
|
|
122
129
|
return entries
|
@@ -1,13 +1,14 @@
|
|
1
1
|
import re
|
2
|
+
from typing import Any
|
2
3
|
|
3
4
|
from tariochbctools.importers.general import mt940importer
|
4
5
|
|
5
6
|
|
6
7
|
class ZkbImporter(mt940importer.Importer):
|
7
|
-
def prepare_payee(self, trxdata):
|
8
|
+
def prepare_payee(self, trxdata: dict[str, Any]) -> str:
|
8
9
|
return ""
|
9
10
|
|
10
|
-
def prepare_narration(self, trxdata):
|
11
|
+
def prepare_narration(self, trxdata: dict[str, Any]) -> str:
|
11
12
|
extra = trxdata["extra_details"]
|
12
13
|
details = trxdata["transaction_details"]
|
13
14
|
|
@@ -1,15 +1,16 @@
|
|
1
1
|
from datetime import datetime
|
2
2
|
from os import environ
|
3
3
|
from time import sleep
|
4
|
+
from typing import Optional
|
4
5
|
|
5
6
|
from beancount.core.number import D
|
6
|
-
from
|
7
|
+
from beanprice import source
|
7
8
|
from dateutil import tz
|
8
9
|
from ibflex import client, parser
|
9
10
|
|
10
11
|
|
11
12
|
class Source(source.Source):
|
12
|
-
def get_latest_price(self, ticker: str):
|
13
|
+
def get_latest_price(self, ticker: str) -> source.SourcePrice | None:
|
13
14
|
token: str = environ["IBKR_TOKEN"]
|
14
15
|
queryId: str = environ["IBKR_QUERY_ID"]
|
15
16
|
|
@@ -36,5 +37,7 @@ class Source(source.Source):
|
|
36
37
|
|
37
38
|
return None
|
38
39
|
|
39
|
-
def get_historical_price(
|
40
|
+
def get_historical_price(
|
41
|
+
self, ticker: str, time: datetime
|
42
|
+
) -> Optional[source.SourcePrice]:
|
40
43
|
return None
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: tariochbctools
|
3
|
-
Version: 0.
|
3
|
+
Version: 1.0.0
|
4
4
|
Summary: Importers, plugins and price fetchers for Beancount
|
5
5
|
Home-page: https://github.com/tarioch/beancounttools/
|
6
6
|
Author: Patrick Ruckstuhl
|
@@ -19,7 +19,10 @@ Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
19
19
|
Classifier: License :: OSI Approved :: MIT License
|
20
20
|
Description-Content-Type: text/x-rst; charset=UTF-8
|
21
21
|
License-File: LICENSE.txt
|
22
|
-
Requires-Dist:
|
22
|
+
Requires-Dist: importlib-metadata; python_version < "3.8"
|
23
|
+
Requires-Dist: beancount>=3
|
24
|
+
Requires-Dist: beangulp
|
25
|
+
Requires-Dist: beanprice
|
23
26
|
Requires-Dist: bitstampclient
|
24
27
|
Requires-Dist: mt-940
|
25
28
|
Requires-Dist: pyyaml
|
@@ -30,7 +33,7 @@ Requires-Dist: opencv-python
|
|
30
33
|
Requires-Dist: blockcypher
|
31
34
|
Requires-Dist: imap-tools
|
32
35
|
Requires-Dist: undictify
|
33
|
-
Requires-Dist:
|
36
|
+
Requires-Dist: rsa
|
34
37
|
Provides-Extra: testing
|
35
38
|
Requires-Dist: pytest; extra == "testing"
|
36
39
|
Requires-Dist: pytest-cov; extra == "testing"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
tariochbctools/__init__.py,sha256=pH5i4Fj1tbXLqLtTVIdoojiplZssQn0nnud8-HXodRE,577
|
2
|
+
tariochbctools/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
+
tariochbctools/importers/bcge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
+
tariochbctools/importers/bcge/importer.py,sha256=bAQpkBLURatdsfSoMQdiha-8QfExAXXvpzAgnFFMwoE,1176
|
5
|
+
tariochbctools/importers/bitst/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
+
tariochbctools/importers/bitst/importer.py,sha256=qEXKpqGJ93ZkvBQSJkSPdAGrsDt6MQBVB9WsW0FOkZU,5312
|
7
|
+
tariochbctools/importers/blockchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
+
tariochbctools/importers/blockchain/importer.py,sha256=U3lJCePs5Gho-FXAfKNMBa4Sd8G-qEdYQ729tm7E1bg,2249
|
9
|
+
tariochbctools/importers/cembrastatement/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
+
tariochbctools/importers/cembrastatement/importer.py,sha256=2vY7bBsVaYoluVO3iGbhcoP2N9eQMYSzjxFgLTCeLT0,3915
|
11
|
+
tariochbctools/importers/general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
+
tariochbctools/importers/general/mailAdapterImporter.py,sha256=BHzO38YkWpJf7eB0VHdSr0VtKNuDn5WAI4Y9Edhhlcg,1771
|
13
|
+
tariochbctools/importers/general/mt940importer.py,sha256=7fErPpBdpLxICX3lGKtAiVwMW8dudarjDcF-ooFC7mA,2071
|
14
|
+
tariochbctools/importers/general/priceLookup.py,sha256=QjwhxOYuEATwtaHnJ9OKl3D6JcnDJQS_5Wo7dQmFDFM,865
|
15
|
+
tariochbctools/importers/ibkr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
|
+
tariochbctools/importers/ibkr/importer.py,sha256=bEnnU59y0c92OvIRKSrxbx1Kjl2FNurONv1eBMzBS6Q,8866
|
17
|
+
tariochbctools/importers/neon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
18
|
+
tariochbctools/importers/neon/importer.py,sha256=kz8IEWXh8Sd8ysfKTQ49-rN5RgeD59pB4OgoA3gHLkY,2565
|
19
|
+
tariochbctools/importers/netbenefits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
|
+
tariochbctools/importers/netbenefits/importer.py,sha256=nzjz12uzi8ozYaOFW5S8U1LPToxk8C0jESL8X6Ex6CY,5904
|
21
|
+
tariochbctools/importers/nordigen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
22
|
+
tariochbctools/importers/nordigen/importer.py,sha256=854yYnsCGGEGb5XhDjZY1BzC9m6y276U-02114M4iqE,3779
|
23
|
+
tariochbctools/importers/nordigen/nordigen_config.py,sha256=cbv7DkGrQ6SzX0L1m25nHi3UH9Oi9tgQGkRmjoZ1QXk,5122
|
24
|
+
tariochbctools/importers/postfinance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
25
|
+
tariochbctools/importers/postfinance/importer.py,sha256=PLBbnswb_tHt8wzd7yCC4UAWHoPn3WcJIXaOMewz6fc,2524
|
26
|
+
tariochbctools/importers/quickfile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
27
|
+
tariochbctools/importers/quickfile/importer.py,sha256=HgS7lSi7egxkj-IWd77MS-vhepYNCRXZwVbeCornkzg,6479
|
28
|
+
tariochbctools/importers/raiffeisench/importer.py,sha256=5r7hHEG0ZtEp-ePlsF4aHapBv9DJgjeVxE1m_G62bLU,912
|
29
|
+
tariochbctools/importers/revolut/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30
|
+
tariochbctools/importers/revolut/importer.py,sha256=5jI91gGIDcP2TMFcauKkA9OWCTqCIl5Phz9n6r9kOeI,3953
|
31
|
+
tariochbctools/importers/schedule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
|
+
tariochbctools/importers/schedule/importer.py,sha256=s5j4nZGifymgxzNRn3FvaCkrDBBVex0tMjPsLIghwCs,1650
|
33
|
+
tariochbctools/importers/swisscard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
34
|
+
tariochbctools/importers/swisscard/importer.py,sha256=84nyAHzz5Y8mHw-zCkoUE0CsaEb8W8C_TbTRHleg_3A,1887
|
35
|
+
tariochbctools/importers/transferwise/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
|
+
tariochbctools/importers/transferwise/importer.py,sha256=qZEIUAQkfszfyY44jyd1OE1XygsTUxpVnSq6MeJ9rOg,6179
|
37
|
+
tariochbctools/importers/truelayer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
|
+
tariochbctools/importers/truelayer/importer.py,sha256=fkASr_cqxkGPf45Eltl4rwKdwoMN0ild3HbCPLk_r1U,7172
|
39
|
+
tariochbctools/importers/viseca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
40
|
+
tariochbctools/importers/viseca/importer.py,sha256=o-zWruMMuSAuwqq4cUQ6cTZI91paBENQShzGK4VdIJg,3348
|
41
|
+
tariochbctools/importers/zak/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
|
+
tariochbctools/importers/zak/importer.py,sha256=SbeE-3ynFefXGQGxUFTlK4AuB_YKWqqgpturUPv8qnA,3961
|
43
|
+
tariochbctools/importers/zkb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
|
+
tariochbctools/importers/zkb/importer.py,sha256=Gm3ql1OHp0dFzJHph1dqyfF4zHNAo00VEiO-WXowtwY,1490
|
45
|
+
tariochbctools/plugins/__init__.py,sha256=DSZtoTVosmExbFmMlHVrZAxKewEILDZlGh_7-uWcc_w,26
|
46
|
+
tariochbctools/plugins/check_portfolio_sum.py,sha256=naJ2j6BFpQhJhT2c-gfjyIdcYe0l_ZzpdlqgwrsIv2g,2340
|
47
|
+
tariochbctools/plugins/generate_base_ccy_prices.py,sha256=Phw314qox3jpNgC5-GcnmyYcLkMkrd8xsWS-wYwdj6o,1236
|
48
|
+
tariochbctools/plugins/prices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
49
|
+
tariochbctools/plugins/prices/ibkr.py,sha256=GYCjnlF-MK-ZFPEr0M6T4iO3Etq0tMmrMlsHGInXUO8,1405
|
50
|
+
tariochbctools-1.0.0.dist-info/LICENSE.txt,sha256=VR2hkz3p9Sw4hSXc7S5iZTOXGeV4h-i8AO_q0zEmtkE,1074
|
51
|
+
tariochbctools-1.0.0.dist-info/METADATA,sha256=7pIZr9bMT5RyVdcswINNH1U2Gm18vNPEu6U57Qmqdnw,2168
|
52
|
+
tariochbctools-1.0.0.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109
|
53
|
+
tariochbctools-1.0.0.dist-info/entry_points.txt,sha256=9xrCCY1wx2zCIsQUOWZelLHDmHw9Oc-ZBAKUIY9lKTA,88
|
54
|
+
tariochbctools-1.0.0.dist-info/top_level.txt,sha256=CiA_NepCI6zDNsaORA55zmpuJFSnTvLESraIL13xiOQ,15
|
55
|
+
tariochbctools-1.0.0.dist-info/RECORD,,
|
@@ -1,55 +0,0 @@
|
|
1
|
-
tariochbctools/__init__.py,sha256=pH5i4Fj1tbXLqLtTVIdoojiplZssQn0nnud8-HXodRE,577
|
2
|
-
tariochbctools/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
tariochbctools/importers/bcge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
-
tariochbctools/importers/bcge/importer.py,sha256=0_OVd-xM4lM5SPvzKwe4bRzkBxx666fVw_hUK9rvcOc,1095
|
5
|
-
tariochbctools/importers/bitst/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
tariochbctools/importers/bitst/importer.py,sha256=qPGN5wy5-G4WDStG32f_OCxynhtyNyLjvXLybhhiRaQ,5105
|
7
|
-
tariochbctools/importers/blockchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
-
tariochbctools/importers/blockchain/importer.py,sha256=1K6J6J3DEOKs1Zw2wDxbUzVluFhZlxxIXwyE48IqRM0,2190
|
9
|
-
tariochbctools/importers/cembrastatement/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
-
tariochbctools/importers/cembrastatement/importer.py,sha256=fqfJxcU1SDiyyV3iDvfvkHXX3FefMmUNMNI5iCDOFis,3403
|
11
|
-
tariochbctools/importers/general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
-
tariochbctools/importers/general/mailAdapterImporter.py,sha256=B6r9ycPY1ZiWFPNnl2-h73OgMZAMaq_QSdURW6gxR3c,1805
|
13
|
-
tariochbctools/importers/general/mt940importer.py,sha256=gLE77YhMaQdHE3nDg344eLh-hSofGKHTW5O_h6kmUdM,2102
|
14
|
-
tariochbctools/importers/general/priceLookup.py,sha256=2nqDcSHC2BMmfSaJtgdmZKNejvTglmAj4oMqOf-SLXg,839
|
15
|
-
tariochbctools/importers/ibkr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
|
-
tariochbctools/importers/ibkr/importer.py,sha256=ie8LjnIpok8bWGGItxfin_aBSyqe5DXpGSdg3kcNID0,8616
|
17
|
-
tariochbctools/importers/neon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
18
|
-
tariochbctools/importers/neon/importer.py,sha256=SNG6podG1PI3gABy6eYfv1-mRnPwRjK-j5_GoNz2-Wc,2547
|
19
|
-
tariochbctools/importers/netbenefits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
|
-
tariochbctools/importers/netbenefits/importer.py,sha256=V1C9t9LU09osxBDOz-V8DL4LxhtnuhLRj6WV_idxrTM,5816
|
21
|
-
tariochbctools/importers/nordigen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
22
|
-
tariochbctools/importers/nordigen/importer.py,sha256=zj2JcDhaP_WXA1H_ZRyqFiN3EqsvY_ZZWLdJiBoijW8,3743
|
23
|
-
tariochbctools/importers/nordigen/nordigen_config.py,sha256=jT4vgEKc35qgXqF8_bRbXLHUrkgsSDKHfhDbEw5OXD4,4903
|
24
|
-
tariochbctools/importers/postfinance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
25
|
-
tariochbctools/importers/postfinance/importer.py,sha256=1oY_9PzUlkJw_gABqHXZ2CaB06xegzNGkc_U3Eoci1M,2452
|
26
|
-
tariochbctools/importers/quickfile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
27
|
-
tariochbctools/importers/quickfile/importer.py,sha256=0HRVl-OXkCq8T5Uz04gGCGlkRXZ3Mp1y8AldW8ezBHg,6544
|
28
|
-
tariochbctools/importers/raiffeisench/importer.py,sha256=L6X0vlAuL8__DmZbs_T-r-A8SH9VH05KLkL7SubFouA,995
|
29
|
-
tariochbctools/importers/revolut/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30
|
-
tariochbctools/importers/revolut/importer.py,sha256=TtGzHl5v_i7IYBNFkdNosIvpBRO6_p5i_7qU2Cml2L0,3885
|
31
|
-
tariochbctools/importers/schedule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
|
-
tariochbctools/importers/schedule/importer.py,sha256=g1q7NwGzwkj25LknOguf3b7iJ0v4JXET01a8N3cWu2U,1526
|
33
|
-
tariochbctools/importers/swisscard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
34
|
-
tariochbctools/importers/swisscard/importer.py,sha256=CTJOJMe_QRPzGPPvkhHe4S0aqzBXbPCrkpcFGqOTrz8,1864
|
35
|
-
tariochbctools/importers/transferwise/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
|
-
tariochbctools/importers/transferwise/importer.py,sha256=czCUtcfOA9XlsP3HKN8DZ7wTDMTllitJXKdr019GJoI,6089
|
37
|
-
tariochbctools/importers/truelayer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
|
-
tariochbctools/importers/truelayer/importer.py,sha256=3bNtN2wKg473whmRVH2JSOIim_0vUFA6omTC3P5EV2A,6938
|
39
|
-
tariochbctools/importers/viseca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
40
|
-
tariochbctools/importers/viseca/importer.py,sha256=hccqRX6sEuRjPcYBV8hQ2zLG1pjeqzAyKd0rDEqM6oc,3123
|
41
|
-
tariochbctools/importers/zak/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
|
-
tariochbctools/importers/zak/importer.py,sha256=9HyFhsavUHLAlO1Pi3eJ7qlNmPsmKzC0oFNf2u3HJkI,3601
|
43
|
-
tariochbctools/importers/zkb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
|
-
tariochbctools/importers/zkb/importer.py,sha256=yrUck3DL2uyuliw0OTBGqBLYl8WBHxgTNnmaG_vA68o,1421
|
45
|
-
tariochbctools/plugins/__init__.py,sha256=DSZtoTVosmExbFmMlHVrZAxKewEILDZlGh_7-uWcc_w,26
|
46
|
-
tariochbctools/plugins/check_portfolio_sum.py,sha256=naJ2j6BFpQhJhT2c-gfjyIdcYe0l_ZzpdlqgwrsIv2g,2340
|
47
|
-
tariochbctools/plugins/generate_base_ccy_prices.py,sha256=Phw314qox3jpNgC5-GcnmyYcLkMkrd8xsWS-wYwdj6o,1236
|
48
|
-
tariochbctools/plugins/prices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
49
|
-
tariochbctools/plugins/prices/ibkr.py,sha256=9OwaZvI55bCj7H80K2iLZVsGLpuCyaoCnyuTS9e1_-c,1294
|
50
|
-
tariochbctools-0.38.1.dist-info/LICENSE.txt,sha256=VR2hkz3p9Sw4hSXc7S5iZTOXGeV4h-i8AO_q0zEmtkE,1074
|
51
|
-
tariochbctools-0.38.1.dist-info/METADATA,sha256=QH4ZUYd9YoyXEbWc2f3in6HLQtlXtf-o2kfSi3iw_a8,2104
|
52
|
-
tariochbctools-0.38.1.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
|
53
|
-
tariochbctools-0.38.1.dist-info/entry_points.txt,sha256=9xrCCY1wx2zCIsQUOWZelLHDmHw9Oc-ZBAKUIY9lKTA,88
|
54
|
-
tariochbctools-0.38.1.dist-info/top_level.txt,sha256=CiA_NepCI6zDNsaORA55zmpuJFSnTvLESraIL13xiOQ,15
|
55
|
-
tariochbctools-0.38.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|