commit c2351d530bcf1b7d3aae52993990fc01a3ab375c Author: Dima Gerasimov Date: Thu Apr 4 21:33:40 2019 +0100 initial topcoder provider diff --git a/coding/topcoder.py b/coding/topcoder.py new file mode 100644 index 0000000..a4e3f76 --- /dev/null +++ b/coding/topcoder.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +from datetime import datetime +from typing import NamedTuple +from pathlib import Path +import json +from typing import Dict, Iterator + +from kython import cproperty +from kython.konsume import dell, zoom, keq, akeq +from kython.kerror import Res, ytry + + +def get_latest(): + last = max(Path('/L/Dropbox/data/topcoder').glob('*.json')) + return json.loads(last.read_text()) + + +class Competition(NamedTuple): + json: Dict[str, str] + + @cproperty + def contest(self) -> str: + return self.json['challengeName'] + + @cproperty + def when(self) -> str: + return self.json['date'] + + # TODO rating/placement/percentile?? + + @classmethod + def make(cls, json) -> Iterator[Res['Competition']]: + yield cls(json=json) + yield from ytry(lambda: akeq(json, 'challengeName', 'percentile', 'rating', 'placement', 'date')) + + +def iter_data() -> Iterator[Res[Competition]]: + j = get_latest() + dell(j, 'id', 'version') + + j = zoom(j, 'result') + dell(j, 'success', 'status', 'metadata') + + j = zoom(j, 'content') + + dell(j, 'handle', 'handleLower', 'userId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy') + + dell(j, 'DEVELOP') # TODO handle it?? + j = zoom(j, 'DATA_SCIENCE') + + mar, srm = zoom(j, 'MARATHON_MATCH', 'SRM') + + mar = zoom(mar, 'history') + srm = zoom(srm, 'history') + # TODO right, I guess I could rely on pylint for unused variables?? + + for c in mar + srm: + dell(c, 'challengeId') + yield from Competition.make(json=c) + + +def get_data(): + return list(sorted(iter_data(), key=Competition.when)) + + +def main(): + for d in iter_data(): + print(d) + + +if __name__ == '__main__': + main()