From a91309678c123f2cb0daec6038c9bbff3bf49eef Mon Sep 17 00:00:00 2001 From: Chris Berkhout Date: Thu, 27 May 2021 13:32:48 +0200 Subject: [PATCH] Add abstract base classes for sources and outputs. --- src/pricehist/outputs/baseoutput.py | 7 ++++++ src/pricehist/outputs/beancount.py | 4 +++- src/pricehist/outputs/csv.py | 4 +++- src/pricehist/outputs/gnucashsql.py | 4 +++- src/pricehist/outputs/ledger.py | 4 +++- src/pricehist/sources/basesource.py | 34 +++++++++++++++++++++++++++++ src/pricehist/sources/coindesk.py | 4 +++- 7 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 src/pricehist/outputs/baseoutput.py create mode 100644 src/pricehist/sources/basesource.py diff --git a/src/pricehist/outputs/baseoutput.py b/src/pricehist/outputs/baseoutput.py new file mode 100644 index 0000000..33cb195 --- /dev/null +++ b/src/pricehist/outputs/baseoutput.py @@ -0,0 +1,7 @@ +from abc import ABC, abstractmethod + + +class BaseOutput(ABC): + @abstractmethod + def format(self) -> str: + pass diff --git a/src/pricehist/outputs/beancount.py b/src/pricehist/outputs/beancount.py index e378a4f..2fbcf45 100644 --- a/src/pricehist/outputs/beancount.py +++ b/src/pricehist/outputs/beancount.py @@ -1,7 +1,9 @@ from pricehist.format import Format +from .baseoutput import BaseOutput -class Beancount: + +class Beancount(BaseOutput): def format(self, series, source=None, fmt=Format()): lines = [] for price in series.prices: diff --git a/src/pricehist/outputs/csv.py b/src/pricehist/outputs/csv.py index 5f27615..272bd8e 100644 --- a/src/pricehist/outputs/csv.py +++ b/src/pricehist/outputs/csv.py @@ -1,7 +1,9 @@ from pricehist.format import Format +from .baseoutput import BaseOutput -class CSV: + +class CSV(BaseOutput): def format(self, series, source=None, fmt=Format()): lines = ["date,base,quote,amount,source,type"] for price in series.prices: diff --git a/src/pricehist/outputs/gnucashsql.py b/src/pricehist/outputs/gnucashsql.py index 9b3439b..f4f5410 100644 --- a/src/pricehist/outputs/gnucashsql.py +++ b/src/pricehist/outputs/gnucashsql.py @@ -5,8 +5,10 @@ from importlib.resources import read_text from pricehist import __version__ from pricehist.format import Format +from .baseoutput import BaseOutput -class GnuCashSQL: + +class GnuCashSQL(BaseOutput): def format(self, series, source=None, fmt=Format()): src = f"pricehist:{source.id()}" diff --git a/src/pricehist/outputs/ledger.py b/src/pricehist/outputs/ledger.py index b41fd2a..4301b87 100644 --- a/src/pricehist/outputs/ledger.py +++ b/src/pricehist/outputs/ledger.py @@ -1,7 +1,9 @@ from pricehist.format import Format +from .baseoutput import BaseOutput -class Ledger: + +class Ledger(BaseOutput): def format(self, series, source=None, fmt=Format()): lines = [] for price in series.prices: diff --git a/src/pricehist/sources/basesource.py b/src/pricehist/sources/basesource.py new file mode 100644 index 0000000..88394c0 --- /dev/null +++ b/src/pricehist/sources/basesource.py @@ -0,0 +1,34 @@ +from abc import ABC, abstractmethod + +from pricehist.series import Series + + +class BaseSource(ABC): + @abstractmethod + def id(self) -> str: + pass + + @abstractmethod + def name(self) -> str: + pass + + def description(self) -> str: + pass + + def source_url(self) -> str: + pass + + def start(self) -> str: + pass + + def types(self) -> list[str]: + pass + + def notes(self) -> str: + pass + + def symbols(self) -> list[str]: + pass + + def fetch(self, series: Series) -> Series: + pass diff --git a/src/pricehist/sources/coindesk.py b/src/pricehist/sources/coindesk.py index e5b8a1e..40972f1 100644 --- a/src/pricehist/sources/coindesk.py +++ b/src/pricehist/sources/coindesk.py @@ -6,8 +6,10 @@ import requests from pricehist.price import Price +from .basesource import BaseSource -class CoinDesk: + +class CoinDesk(BaseSource): def id(self): return "coindesk"