Add JSON and JSONL output formats.

This commit is contained in:
Chris Berkhout 2022-04-04 13:40:04 +02:00
parent 7a9d3d3e8f
commit 46ebdfe074
3 changed files with 62 additions and 3 deletions

View file

@ -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

View file

@ -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(),
} }

View 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()