adapt codeforces/topcoder data from private package

This commit is contained in:
Dima Gerasimov 2019-12-24 23:22:17 +00:00
parent 2fff128939
commit cf087ae316
3 changed files with 29 additions and 26 deletions

View file

@ -5,15 +5,15 @@ from pathlib import Path
import json import json
from typing import Dict, Iterator, Any from typing import Dict, Iterator, Any
from kython import cproperty, fget from ..common import cproperty, get_files
from kython.konsume import zoom, ignore from ..error import Res, unwrap
from kython.kerror import Res, ytry, unwrap
from kython import fget
from kython.konsume import zoom, ignore, wrap
# TODO remove
from kython.kdatetime import as_utc from kython.kdatetime import as_utc
_BDIR = Path('/L/zzz_syncthing/data/codeforces')
Cid = int Cid = int
class Contest(NamedTuple): class Contest(NamedTuple):
@ -29,8 +29,10 @@ class Contest(NamedTuple):
Cmap = Dict[Cid, Contest] Cmap = Dict[Cid, Contest]
def get_contests() -> Cmap: def get_contests() -> Cmap:
last = max(_BDIR.glob('allcontests*.json')) from mycfg import paths
last = max(get_files(paths.codeforces.export_path, 'allcontests*.json'))
j = json.loads(last.read_text()) j = json.loads(last.read_text())
d = {} d = {}
for c in j['result']: for c in j['result']:
@ -39,18 +41,13 @@ def get_contests() -> Cmap:
return d return d
def get_latest():
last = max(_BDIR.glob('codeforces*.json'))
return json.loads(last.read_text())
class Competition(NamedTuple): class Competition(NamedTuple):
contest_id: str contest_id: Cid
contest: str contest: str
cmap: Cmap cmap: Cmap
@cproperty @cproperty
def uid(self) -> str: def uid(self) -> Cid:
return self.contest_id return self.contest_id
def __hash__(self): def __hash__(self):
@ -77,11 +74,13 @@ class Competition(NamedTuple):
# TODO ytry??? # TODO ytry???
ignore(json, 'rank', 'oldRating', 'newRating') ignore(json, 'rank', 'oldRating', 'newRating')
from kython.konsume import wrap
def iter_data() -> Iterator[Res[Competition]]: def iter_data() -> Iterator[Res[Competition]]:
cmap = get_contests() cmap = get_contests()
from mycfg import paths
last = max(get_files(paths.codeforces.export_path, 'codeforces*.json'))
with wrap(get_latest()) as j: with wrap(json.loads(last.read_text())) as j:
j['status'].ignore() j['status'].ignore()
res = j['result'].zoom() res = j['result'].zoom()

View file

@ -5,14 +5,19 @@ from pathlib import Path
import json import json
from typing import Dict, Iterator, Any from typing import Dict, Iterator, Any
from kython import cproperty, fget from ..common import cproperty, get_files
from ..error import Res, unwrap
# TODO get rid of fget?
from kython import fget
from kython.konsume import zoom, wrap, ignore from kython.konsume import zoom, wrap, ignore
from kython.kerror import Res, ytry, unwrap
def get_latest(): # TODO json type??
last = max(Path('/L/zzz_syncthing/data/topcoder').glob('*.json')) def _get_latest() -> Dict:
return json.loads(last.read_text()) from mycfg import paths
pp = max(get_files(paths.topcoder.export_path, glob='*.json'))
return json.loads(pp.read_text())
class Competition(NamedTuple): class Competition(NamedTuple):
@ -52,7 +57,7 @@ class Competition(NamedTuple):
def iter_data() -> Iterator[Res[Competition]]: def iter_data() -> Iterator[Res[Competition]]:
with wrap(get_latest()) as j: with wrap(_get_latest()) as j:
ignore(j, 'id', 'version') ignore(j, 'id', 'version')
res = j['result'].zoom() res = j['result'].zoom()

View file

@ -95,8 +95,7 @@ def setup_logger(logger, level=None, format=None, datefmt=None):
PathIsh = Union[Path, str] PathIsh = Union[Path, str]
# TODO use glob or something? see in promnesia def get_files(pp: PathIsh, glob: str) -> List[Path]:
def get_files(pp: PathIsh, glob: str) -> List[Path]:
""" """
Helper function to avoid boilerplate. Helper function to avoid boilerplate.
""" """
@ -104,6 +103,6 @@ def get_files(pp: PathIsh, glob: str) -> List[Path]:
if path.is_dir(): if path.is_dir():
return list(sorted(path.glob(glob))) return list(sorted(path.glob(glob)))
else: else:
assert path.is_file(), path
# TODO FIXME assert matches glob?? # TODO FIXME assert matches glob??
raise RuntimeError() return [path]
return path