diff --git a/src/solo_turnier/__init__.py b/src/solo_turnier/__init__.py index 16e588f..1446c3e 100644 --- a/src/solo_turnier/__init__.py +++ b/src/solo_turnier/__init__.py @@ -3,7 +3,6 @@ from . import group from . import types from . import cli -from . import reader from . import participant from . import html_locator diff --git a/src/solo_turnier/reader.py b/src/solo_turnier/reader.py deleted file mode 100644 index c162858..0000000 --- a/src/solo_turnier/reader.py +++ /dev/null @@ -1,96 +0,0 @@ -import solo_turnier -import csv -import os -import logging -import re -from pprint import pformat -from .types import CSVResultRow as ResultRow - - -class CSVResultReader: - def __init__(self, fileName: str): - self.fileName = fileName - self.l = logging.getLogger("solo_turnier.reader.CSVResultReader") - - def readFile(self): - with open(self.fileName, "r") as fp: - dialect = csv.Sniffer().sniff(fp.read(1024)) - fp.seek(0) - - csvReader = csv.reader(fp, dialect) - - rows = [] - for row in csvReader: - rows.append(row) - - ret = {"header": rows[0], "data": rows[1:]} - - self.l.log(5, "Imported results from allresults.csv file: %s", (ret)) - return ret - - def extractResult(self, entries=None) -> list[ResultRow]: - if entries is None: - entries = self.readFile() - - groupParser = solo_turnier.group.GroupParser() - classParser = solo_turnier.competition_class.CompetitionClassParser() - - def __processRow(row): - result = ResultRow( - competitionGroup=groupParser.parseGroup(row[2]), - competitionClass=classParser.parseClass(row[3]), - dance=row[4], - id=row[5], - firstName=row[6], - lastName=row[7], - club=row[10], - place=row[12], - placeTo=row[13], - group=groupParser.parseGroup(row[15]), - class_=classParser.parseClass(row[16]), - ) - self.l.log(5, "Found row in CSV: %s", result) - return result - - ret = list(map(__processRow, entries["data"])) - - self.l.log(5, "Extracted rows from CSV data: %s", ret) - return ret - - -class CSVExtractor: - def __init__(self): - self.l = logging.getLogger("solo_turnier.worker") - self.__groupMaps = {"Kinder": "Kin.", "Junioren": "Jun.", "Jugend": "Jug."} - self.__classMaps = {"Newcomer": "Newc.", "Beginner": "Beg.", "Advanced": "Adv."} - - def __mapGroup(self, group): - return self.__groupMaps.get(group, group) - - def __mapClass(self, class_): - return self.__classMaps.get(class_, class_) - - def mapCSVImport(self, imported) -> list[ResultRow]: - ret = [] - - def __processRow(row): - result = ResultRow( - competitionGroup=self.__mapGroup(row[2]), - competitionClass=self.__mapClass(row[3]), - dance=row[4], - id=row[5], - firstName=row[6], - lastName=row[7], - club=row[10], - place=row[12], - placeTo=row[13], - group=self.__mapGroup(row[15]), - class_=self.__mapClass(row[16]), - ) - ret.append(result) - self.l.log(5, "Found row in CSV: %s", result) - - for row in imported["data"]: - __processRow(row) - - return ret diff --git a/src/solo_turnier/types/__init__.py b/src/solo_turnier/types/__init__.py index 6f7bab0..31e08e4 100644 --- a/src/solo_turnier/types/__init__.py +++ b/src/solo_turnier/types/__init__.py @@ -1,10 +1,5 @@ from .place import Place -from .. import group -from .. import competition_class - - -from .csvResultRow import CSVResultRow from .htmlPreviewParticipant import HtmlPreviewParticipant from .htmlParticipant import HtmlParticipant from .htmlPreviewImport import HtmlPreviewImport diff --git a/src/solo_turnier/types/csvResultRow.py b/src/solo_turnier/types/csvResultRow.py deleted file mode 100644 index faeb8bd..0000000 --- a/src/solo_turnier/types/csvResultRow.py +++ /dev/null @@ -1,30 +0,0 @@ -class CSVResultRow: - def __init__( - self, - firstName, - lastName, - club, - id, - group, - class_, - dance, - place, - placeTo, - competitionGroup, - competitionClass, - ): - self.firstName = firstName - self.lastName = lastName - self.name = f"{firstName} {lastName}" - self.club = club - self.id = id - self.group = group - self.class_ = class_ - self.dance = dance - self.place = place - self.placeTo = placeTo - self.competitionGroup = competitionGroup - self.competitionClass = competitionClass - - def __repr__(self): - return f"{self.name} ({self.id}, {self.club}) is in {self.group} {self.class_} and danced the {self.dance} in {self.competitionGroup} {self.competitionClass} getting place {self.place}-{self.placeTo}" diff --git a/src/solo_turnier/worker.py b/src/solo_turnier/worker.py index b099fbc..127c681 100644 --- a/src/solo_turnier/worker.py +++ b/src/solo_turnier/worker.py @@ -1,17 +1,3 @@ -from .reader import ResultRow - -# import logging -# from pprint import pformat - -# import re - -# import solo_turnier - -# from .types import HtmlCompetitionResultRow as CompetitionResult -# from . import types -# from . import competition_class - - class HtmlPerson: def __init__(self, name, id, group): self.name = name @@ -39,12 +25,6 @@ class ResultPerson: self.id = id self.group = group - @staticmethod - def extractFromResultRow(row: ResultRow): - return ResultPerson( - firstName=row.firstName, lastName=row.lastName, club=row.club - ) - def __eq__(self, o): if not isinstance(o, ResultPerson): return False diff --git a/src/solo_turnier/workers/DataWorker.py b/src/solo_turnier/workers/DataWorker.py index 5bf21f8..8c77d30 100644 --- a/src/solo_turnier/workers/DataWorker.py +++ b/src/solo_turnier/workers/DataWorker.py @@ -1,4 +1,3 @@ -from ..reader import ResultRow from ..worker import ResultPerson from ..types import HtmlCompetitionResultRow as CompetitionResult from solo_turnier import html_parser @@ -9,148 +8,6 @@ class DataWorker: def __init__(self): self.l = logging.getLogger("solo_turnier.worker.DataWorker") - def combineRowsByPerson( - self, rows: list[ResultRow] - ) -> dict[ResultPerson, list[CompetitionResult]]: - ret = {} - for row in rows: - result = CompetitionResult.extractFromResultRow(row) - - if result.place == "-" or result.placeTo == "-": - continue - - person = ResultPerson.extractFromResultRow(row) - if person not in ret: - ret[person] = [] - ret[person].append(result) - return ret - - def checkUniqueIds(self, data: dict[ResultPerson, list[CompetitionResult]]) -> bool: - unique = True - for person in data: - ids = set([c.id for c in data[person]]) - if len(ids) == 1: - person.id = list(ids)[0] - else: - unique = False - - return unique - - """ - Return a tuple - The first one is True, if all persons could be unambiguously identified a group - The second one is True if there was the need to override a group but it was possible to extract from other data - The second one can be seen as a warning - """ - - def consolidateGroups( - self, data: dict[ResultPerson, list[CompetitionResult]] - ) -> tuple[bool, bool]: - ambiguous = False - warnChange = False - - unambiguousGroups = set(["Kin.", "Jun.", "Jug."]) - combinations = set(["Kin./Jun.", "Jun./Jug."]) - - for person in data: - groupsRaw = set([c.group for c in data[person]]) - - unknown = groupsRaw.difference(unambiguousGroups).difference(combinations) - if len(unknown) > 0: - raise Exception( - f"There were unknown groups found for {person}: {unknown}" - ) - - numUnambiguousGroups = len(groupsRaw.intersection(unambiguousGroups)) - - if numUnambiguousGroups == 0: - if len(groupsRaw) == 2: - warnChange = True - person.group = "Jun." - else: - ambiguous = True - if len(groupsRaw) == 1: - person.group = list(groupsRaw)[0] - - elif numUnambiguousGroups == 1: - if len(groupsRaw.intersection(combinations)) > 0: - warnChange = True - - person.group = list(groupsRaw.intersection(unambiguousGroups))[0] - - else: - raise Exception(f"{person} cannot have different groups.") - - return (not ambiguous, warnChange) - - def _createHtmlLUT(self, htmlImports: list[html_parser.HtmlImport]): - ret = {} - parser = html_parser.HtmlParser("") - for imp in htmlImports: - parsed = parser.guessDataFromHtmlTitle(imp.title) - key = (parsed["group"], parsed["class_"], parsed["dance"]) - ret[key] = imp - self.l.debug("LUT[%s] = %s", key, imp) - self.l.debug("LUT completed") - return ret - - def mergeHtmlData( - self, - data: dict[ResultPerson, list[CompetitionResult]], - htmlImports: list[html_parser.HtmlImport], - ): - lut = self._createHtmlLUT(htmlImports) - - for person in data: - for competition in data[person]: - key = ( - competition.competitionGroup, - competition.competitionClass, - competition.dance, - ) - htmlImport = lut[key] - participant = htmlImport.participants[str(competition.id)] - if participant.name != person.name: - self.l.error( - f"Names for {person} and participant in HTML import ({participant}) do not match. Please check carefully." - ) - competition.finalist = participant.finalist - - def getAllDancesInCompetitions( - self, data: dict[ResultPerson, list[CompetitionResult]] - ) -> list[str]: - allDances = [ - "Samba", - "Cha Cha", - "Rumba", - "Paso Doble", - "Jive", - "Langs. Walzer", - "Tango", - "Wiener Walzer", - "Slowfox", - "Quickstep", - ] - dancesPresent = {d: False for d in allDances} - - for person in data: - for competition in data[person]: - dancesPresent[competition.dance] = True - - return [d for d in allDances if dancesPresent[d]] - - def collectPersonsInGroups( - self, data: dict[ResultPerson, list[CompetitionResult]] - ) -> list[tuple[str, list[ResultPerson]]]: - groups = { - "Kin.": [p for p in data.keys() if p.group == "Kin."], - "Jun.": [p for p in data.keys() if p.group == "Jun."], - "Jug.": [p for p in data.keys() if p.group == "Jug."], - } - found = groups["Kin."] + groups["Jun."] + groups["Jug."] - groups["Sonst"] = [p for p in data.keys() if p not in found] - return groups - def sortPersonsInGroup(self, persons: list[ResultPerson]) -> list[ResultPerson]: ids = [p.id for p in persons]