Add JSON and JSONL output formats.
This commit is contained in:
parent
7a9d3d3e8f
commit
46ebdfe074
3 changed files with 62 additions and 3 deletions
|
@ -34,6 +34,8 @@ pipx install pricehist
|
||||||
|
|
||||||
- **`beancount`**: [Beancount](http://furius.ca/beancount/)
|
- **`beancount`**: [Beancount](http://furius.ca/beancount/)
|
||||||
- **`csv`**: [Comma-separated values](https://en.wikipedia.org/wiki/Comma-separated_values)
|
- **`csv`**: [Comma-separated values](https://en.wikipedia.org/wiki/Comma-separated_values)
|
||||||
|
- **`json`**: [JSON](https://en.wikipedia.org/wiki/JSON)
|
||||||
|
- **`jsonl`**: [JSON lines](https://en.wikipedia.org/wiki/JSON_streaming)
|
||||||
- **`gnucash-sql`**: [GnuCash](https://www.gnucash.org/) SQL
|
- **`gnucash-sql`**: [GnuCash](https://www.gnucash.org/) SQL
|
||||||
- **`ledger`**: [Ledger](https://www.ledger-cli.org/) and [hledger](https://hledger.org/)
|
- **`ledger`**: [Ledger](https://www.ledger-cli.org/) and [hledger](https://hledger.org/)
|
||||||
|
|
||||||
|
@ -91,7 +93,7 @@ pricehist fetch -h
|
||||||
```
|
```
|
||||||
```
|
```
|
||||||
usage: pricehist fetch SOURCE PAIR [-h] [-vvv] [-t TYPE] [-s DATE | -sx DATE] [-e DATE | -ex DATE]
|
usage: pricehist fetch SOURCE PAIR [-h] [-vvv] [-t TYPE] [-s DATE | -sx DATE] [-e DATE | -ex DATE]
|
||||||
[-o beancount|csv|gnucash-sql|ledger] [--invert] [--quantize INT]
|
[-o beancount|csv|json|jsonl|gnucash-sql|ledger] [--invert] [--quantize INT]
|
||||||
[--fmt-base SYM] [--fmt-quote SYM] [--fmt-time TIME] [--fmt-decimal CHAR] [--fmt-thousands CHAR]
|
[--fmt-base SYM] [--fmt-quote SYM] [--fmt-time TIME] [--fmt-decimal CHAR] [--fmt-thousands CHAR]
|
||||||
[--fmt-symbol rightspace|right|leftspace|left] [--fmt-datesep CHAR] [--fmt-csvdelim CHAR]
|
[--fmt-symbol rightspace|right|leftspace|left] [--fmt-datesep CHAR] [--fmt-csvdelim CHAR]
|
||||||
|
|
||||||
|
@ -122,8 +124,8 @@ optional arguments:
|
||||||
|
|
||||||
### Choose and customize the output format
|
### Choose and customize the output format
|
||||||
|
|
||||||
As the output format you can choose one of `beancount`, `csv`, `ledger` or
|
As the output format you can choose one of `beancount`, `csv`, `json`, `jsonl`,
|
||||||
`gnucash-sql`.
|
`ledger` or `gnucash-sql`.
|
||||||
|
|
||||||
```
|
```
|
||||||
pricehist fetch ecb EUR/AUD -s 2021-01-04 -e 2021-01-08 -o ledger
|
pricehist fetch ecb EUR/AUD -s 2021-01-04 -e 2021-01-08 -o ledger
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from .beancount import Beancount
|
from .beancount import Beancount
|
||||||
from .csv import CSV
|
from .csv import CSV
|
||||||
from .gnucashsql import GnuCashSQL
|
from .gnucashsql import GnuCashSQL
|
||||||
|
from .json import JSON
|
||||||
from .ledger import Ledger
|
from .ledger import Ledger
|
||||||
|
|
||||||
default = "csv"
|
default = "csv"
|
||||||
|
@ -8,6 +9,8 @@ default = "csv"
|
||||||
by_type = {
|
by_type = {
|
||||||
"beancount": Beancount(),
|
"beancount": Beancount(),
|
||||||
"csv": CSV(),
|
"csv": CSV(),
|
||||||
|
"json": JSON(),
|
||||||
|
"jsonl": JSON(jsonl=True),
|
||||||
"gnucash-sql": GnuCashSQL(),
|
"gnucash-sql": GnuCashSQL(),
|
||||||
"ledger": Ledger(),
|
"ledger": Ledger(),
|
||||||
}
|
}
|
||||||
|
|
54
src/pricehist/outputs/json.py
Normal file
54
src/pricehist/outputs/json.py
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
"""
|
||||||
|
JSON output
|
||||||
|
|
||||||
|
Date, number and base/quote formatting options will be respected.
|
||||||
|
|
||||||
|
Classes:
|
||||||
|
|
||||||
|
JSON
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import io
|
||||||
|
import json
|
||||||
|
|
||||||
|
from pricehist.format import Format
|
||||||
|
|
||||||
|
from .baseoutput import BaseOutput
|
||||||
|
|
||||||
|
|
||||||
|
class JSON(BaseOutput):
|
||||||
|
def __init__(self, jsonl=False):
|
||||||
|
self.jsonl = jsonl
|
||||||
|
|
||||||
|
def format(self, series, source, fmt=Format()):
|
||||||
|
data = []
|
||||||
|
output = io.StringIO()
|
||||||
|
|
||||||
|
base = fmt.base or series.base
|
||||||
|
quote = fmt.quote or series.quote
|
||||||
|
|
||||||
|
for price in series.prices:
|
||||||
|
date = fmt.format_date(price.date)
|
||||||
|
amount = fmt.format_num(price.amount)
|
||||||
|
|
||||||
|
data.append(
|
||||||
|
{
|
||||||
|
"date": date,
|
||||||
|
"base": base,
|
||||||
|
"quote": quote,
|
||||||
|
"amount": amount,
|
||||||
|
"source": source.id(),
|
||||||
|
"type": series.type,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.jsonl:
|
||||||
|
for row in data:
|
||||||
|
json.dump(row, output)
|
||||||
|
output.write("\n")
|
||||||
|
else:
|
||||||
|
json.dump(data, output, indent=2)
|
||||||
|
output.write("\n")
|
||||||
|
|
||||||
|
return output.getvalue()
|
Loading…
Add table
Reference in a new issue