my.hackernews.harmonic: use orjson + add __hash__ for Saved object

plus some minor cleanup
This commit is contained in:
karlicoss 2023-11-06 23:42:22 +00:00
parent 4ac3bbb101
commit 19353e996d

View file

@ -1,16 +1,16 @@
""" """
[[https://play.google.com/store/apps/details?id=com.simon.harmonichackernews][Harmonic]] app for Hackernews [[https://play.google.com/store/apps/details?id=com.simon.harmonichackernews][Harmonic]] app for Hackernews
""" """
REQUIRES = ['lxml'] REQUIRES = ['lxml', 'orjson']
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime, timezone from datetime import datetime, timezone
import json import orjson
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Iterator, List, Optional, Sequence, TypedDict, cast from typing import Any, Dict, Iterator, List, Optional, Sequence, TypedDict, cast
from lxml import etree from lxml import etree
from more_itertools import unique_everseen, one from more_itertools import one
from my.core import ( from my.core import (
Paths, Paths,
@ -21,15 +21,16 @@ from my.core import (
make_logger, make_logger,
stat, stat,
) )
from my.core.common import unique_everseen
import my.config
from .common import hackernews_link, SavedBase from .common import hackernews_link, SavedBase
from my.config import harmonic as user_config
logger = make_logger(__name__) logger = make_logger(__name__)
@dataclass @dataclass
class harmonic(user_config): class harmonic(my.config.harmonic):
export_path: Paths export_path: Paths
@ -76,6 +77,10 @@ class Saved(SavedBase):
def hackernews_link(self) -> str: def hackernews_link(self) -> str:
return hackernews_link(self.uid) return hackernews_link(self.uid)
def __hash__(self) -> int:
# meh. but seems like the easiest and fastest way to hash a dict?
return hash(orjson.dumps(self.raw))
_PREFIX = 'com.simon.harmonichackernews.KEY_SHARED_PREFERENCES' _PREFIX = 'com.simon.harmonichackernews.KEY_SHARED_PREFERENCES'
@ -95,7 +100,7 @@ def _saved() -> Iterator[Res[Saved]]:
cached: Dict[str, Cached] = {} cached: Dict[str, Cached] = {}
for sid in cached_ids: for sid in cached_ids:
res = one(cast(List[Any], tr.xpath(f'//*[@name="{_PREFIX}_CACHED_STORY{sid}"]'))) res = one(cast(List[Any], tr.xpath(f'//*[@name="{_PREFIX}_CACHED_STORY{sid}"]')))
j = json.loads(res.text) j = orjson.loads(res.text)
cached[sid] = j cached[sid] = j
res = one(cast(List[Any], tr.xpath(f'//*[@name="{_PREFIX}_BOOKMARKS"]'))) res = one(cast(List[Any], tr.xpath(f'//*[@name="{_PREFIX}_BOOKMARKS"]')))
@ -112,7 +117,7 @@ def _saved() -> Iterator[Res[Saved]]:
def saved() -> Iterator[Res[Saved]]: def saved() -> Iterator[Res[Saved]]:
yield from unique_everseen(_saved()) yield from unique_everseen(_saved)
def stats() -> Stats: def stats() -> Stats: