diff --git a/my/hackernews/materialistic.py b/my/hackernews/materialistic.py new file mode 100644 index 0000000..65a1cb6 --- /dev/null +++ b/my/hackernews/materialistic.py @@ -0,0 +1,60 @@ +""" +[[https://play.google.com/store/apps/details?id=io.github.hidroh.materialistic][Materialistic]] app for Hackernews +""" + +REQUIRES = ['dataset'] + +from datetime import datetime +from typing import Any, Dict, Iterator, NamedTuple, Sequence + +import pytz + +from my.config import materialistic as config +# todo migrate config to my.hackernews.materialistic + + +from ..core import get_files +from pathlib import Path +def inputs() -> Sequence[Path]: + return get_files(config.export_path) + + +Row = Dict[str, Any] +from .common import hackernews_link + +class Saved(NamedTuple): + row: Row + + @property + def when(self) -> datetime: + ts = int(self.row['time']) / 1000 + return datetime.fromtimestamp(ts, tz=pytz.utc) + + @property + def uid(self) -> str: + return self.row['itemid'] + + @property + def url(self) -> str: + return self.row['url'] + + @property + def title(self) -> str: + return self.row['title'] + + @property + def hackernews_link(self) -> str: + return hackernews_link(self.uid) + + +from ..core.dataset import connect_readonly +def raw() -> Iterator[Row]: + last = max(inputs()) + with connect_readonly(last) as db: + saved = db['saved'] + # TODO wonder if it's 'save time' or creation time? + yield from saved.all(order_by='time') + + +def saves() -> Iterator[Saved]: + yield from map(Saved, raw()) diff --git a/my/materialistic.py b/my/materialistic.py index 760d367..8a6a997 100644 --- a/my/materialistic.py +++ b/my/materialistic.py @@ -1,57 +1,4 @@ -""" -[[https://play.google.com/store/apps/details?id=io.github.hidroh.materialistic][Materialistic]] app for Hackernews -""" +from .core.warnings import high +high("DEPRECATED! Please use my.hackernews.materialistic instead.") -REQUIRES = ['dataset'] - -from datetime import datetime -from typing import Any, Dict, Iterator, NamedTuple - -import pytz - -from .core.common import get_files -from .core.dataset import connect_readonly -from my.config import materialistic as config - - -Row = Dict[str, Any] - - -class Saved(NamedTuple): - row: Row - - @property - def when(self) -> datetime: - ts = int(self.row['time']) / 1000 - return datetime.fromtimestamp(ts, tz=pytz.utc) - - @property - def uid(self) -> str: - return self.row['itemid'] - - @property - def url(self) -> str: - return self.row['url'] - - @property - def title(self) -> str: - return self.row['title'] - - @property - def hackernews_link(self) -> str: - return f'https://news.ycombinator.com/item?id={self.uid}' - - -def _last_export(): - return max(get_files(config.export_path, glob='**/*.db')) - - -def raw() -> Iterator[Row]: - db = connect_readonly(_last_export()) - st = db['saved'] - # TODO wonder if it's 'save time'? - yield from st.all(order_by='time') - - -def saves() -> Iterator[Saved]: - yield from map(Saved, raw()) +from .hackernews.materialistic import *