diff --git a/src/solo_turnier/html_locator.py b/src/solo_turnier/html_locator.py new file mode 100644 index 0000000..e4be68f --- /dev/null +++ b/src/solo_turnier/html_locator.py @@ -0,0 +1,24 @@ +import os +import logging + +class HtmlLocator: + def __init__(self): + self.l = logging.getLogger('solo_turnier.html_locator') + self.fileName = 'erg.htm' + + def __findRecursivelyCandidates(self, path: str): + ret = [] + ls = os.listdir(path) + + if self.fileName in ls and os.path.isfile(os.path.join(path, self.fileName)): + ret.append(os.path.join(path, self.fileName)) + + for p in ls: + subPath = os.path.join(path, p) + if os.path.isdir(subPath): + ret = ret + self.__findRecursivelyCandidates(subPath) + + return ret + + def findCandidates(self, path: str): + return self.__findRecursivelyCandidates(path) diff --git a/src/solo_turnier/html_parser.py b/src/solo_turnier/html_parser.py index ce25f2e..7d628ae 100644 --- a/src/solo_turnier/html_parser.py +++ b/src/solo_turnier/html_parser.py @@ -1,5 +1,4 @@ from bs4 import BeautifulSoup -import bs4 import logging import re @@ -12,7 +11,7 @@ class HtmlParser: def parseString(self, text: str): soup = BeautifulSoup(text, 'html.parser') - ret = {} + participants = {} def __parseRows(rows, finalist: bool): def __parseRow(row): @@ -32,7 +31,7 @@ class HtmlParser: 'place': place, 'finalist': finalist } - ret[number] = participant + participants[number] = participant for row in rows: __parseRow(row) @@ -54,4 +53,10 @@ class HtmlParser: __parseRemainingTables(tables[1:]) + title = soup.find('div', class_='eventhead').table.tr.td.contents[0] + + ret = { + 'participants': participants, + 'title': title + } return ret diff --git a/src/solo_turnier/reader.py b/src/solo_turnier/reader.py index 8bef531..dac7720 100644 --- a/src/solo_turnier/reader.py +++ b/src/solo_turnier/reader.py @@ -27,64 +27,3 @@ class AllResultReader: logging.getLogger('solo_turnier.reader.all_results').debug('Imported results from allresults.csv file: %s', ret) return ret - -class ERReader: - def __init__(self, fileName: str): - self.fileName = fileName - self.l = logging.getLogger('solo_turnier.reader.wert_er') - - def __parseFileContent(self, lines): - gruppe = re.compile('Startgruppe:\W(.+)').search(lines[2]).group(1).strip() - klasse = re.compile('Startklasse:\W(.+)').search(lines[3]).group(1).strip() - tanz = re.compile('Turnierart:\W(.+)').search(lines[4]).group(1).strip() - - restLines = lines[5:] - - # Search for first line with the name of the dance - found = -1 - for i in range(len(restLines)): - if restLines[i].startswith(tanz): - found = i - break - - if found == -1: - self.l.warn(f'Could not find the dance {tanz} in the result file for {gruppe} ({klasse}). This might mean that the competition was not carried out.') - return { - 'gruppe': gruppe, - 'klasse': klasse, - 'tanz': tanz, - 'finalisten': [] - } - pass - - # Extract the finalists - finalists = [] - for i in range(found + 1, len(restLines)): - if restLines[i].startswith('TopTurnier'): - break - - # self.l.debug('Parsing line "%s"', restLines[i].strip()) - - match = re.compile('[0-9]+').match(restLines[i].strip()) - if match is None: - raise Exception('Could not parse starter number for end result table.') - else: - finalists.append(int(match.group(0))) - - ret = { - 'gruppe': gruppe, - 'klasse': klasse, - 'tanz': tanz, - 'finalisten': finalists - } - self.l.debug('Extracted data for final: %s', ret) - return ret - - def readFile(self): - with open(self.fileName, 'r') as fp: - lines = fp.readlines() - lines = [l.strip('\n') for l in lines] - lines = [l for l in lines if l != ''] - self.l.debug('Read lines for final: %s', lines) - - return self.__parseFileContent(lines) diff --git a/src/solo_turnier/tests/html_locator/export/1-foo/deck.html b/src/solo_turnier/tests/html_locator/export/1-foo/deck.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/1-foo/index.htm b/src/solo_turnier/tests/html_locator/export/1-foo/index.htm new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/1-foo/menu.html b/src/solo_turnier/tests/html_locator/export/1-foo/menu.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/2-bar/deck.html b/src/solo_turnier/tests/html_locator/export/2-bar/deck.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/2-bar/erg.htm b/src/solo_turnier/tests/html_locator/export/2-bar/erg.htm new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/2-bar/index.htm b/src/solo_turnier/tests/html_locator/export/2-bar/index.htm new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/2-bar/menu.html b/src/solo_turnier/tests/html_locator/export/2-bar/menu.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/deck.html b/src/solo_turnier/tests/html_locator/export/3-baz/deck.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/erg.htm b/src/solo_turnier/tests/html_locator/export/3-baz/erg.htm new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/index.htm b/src/solo_turnier/tests/html_locator/export/3-baz/index.htm new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/menu.html b/src/solo_turnier/tests/html_locator/export/3-baz/menu.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/deck.html b/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/deck.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/erg.htm b/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/erg.htm new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/index.htm b/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/index.htm new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/menu.html b/src/solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/menu.html new file mode 100644 index 0000000..e69de29 diff --git a/src/solo_turnier/tests/html_parser/1/expected.json b/src/solo_turnier/tests/html_parser/1/expected.json index 7438fa7..8b8b39b 100644 --- a/src/solo_turnier/tests/html_parser/1/expected.json +++ b/src/solo_turnier/tests/html_parser/1/expected.json @@ -1,47 +1,50 @@ { - "14": { - "name": "Max Mustermann 1", - "place": "1.", - "finalist": true + "participants": { + "14": { + "name": "Max Mustermann 1", + "place": "1.", + "finalist": true + }, + "9": { + "name": "Max Mustermann 2", + "place": "2.", + "finalist": true + }, + "13": { + "name": "Max Mustermann 3", + "place": "3.", + "finalist": true + }, + "17": { + "name": "Max Mustermann 4", + "place": "4.", + "finalist": true + }, + "6": { + "name": "Max Mustermann 5", + "place": "5.", + "finalist": true + }, + "27": { + "name": "Max Mustermann 6", + "place": "6.", + "finalist": true + }, + "22": { + "name": "Max Mustermann 7", + "place": "7.", + "finalist": true + }, + "26": { + "name": "Max Mustermann 8", + "place": "8.", + "finalist": false + }, + "25": { + "name": "Max Mustermann 9", + "place": "9.", + "finalist": false + } }, - "9": { - "name": "Max Mustermann 2", - "place": "2.", - "finalist": true - }, - "13": { - "name": "Max Mustermann 3", - "place": "3.", - "finalist": true - }, - "17": { - "name": "Max Mustermann 4", - "place": "4.", - "finalist": true - }, - "6": { - "name": "Max Mustermann 5", - "place": "5.", - "finalist": true - }, - "27": { - "name": "Max Mustermann 6", - "place": "6.", - "finalist": true - }, - "22": { - "name": "Max Mustermann 7", - "place": "7.", - "finalist": true - }, - "26": { - "name": "Max Mustermann 8", - "place": "8.", - "finalist": false - }, - "25": { - "name": "Max Mustermann 9", - "place": "9.", - "finalist": false - } + "title": "09.07.2022 - ETW, Solos Jun. Newc./Beg. Rumba" } diff --git a/src/solo_turnier/tests/html_parser/2/expected.json b/src/solo_turnier/tests/html_parser/2/expected.json index 4f7a89c..0032e44 100644 --- a/src/solo_turnier/tests/html_parser/2/expected.json +++ b/src/solo_turnier/tests/html_parser/2/expected.json @@ -1,27 +1,31 @@ { - "14": { - "name": "Maxime Musterfrau 1", - "place": "1.", - "finalist": true + "participants": { + + "14": { + "name": "Maxime Musterfrau 1", + "place": "1.", + "finalist": true + }, + "13": { + "name": "Maxime Musterfrau 2", + "place": "2.", + "finalist": true + }, + "17": { + "name": "Maxime Musterfrau 3", + "place": "3.", + "finalist": true + }, + "6": { + "name": "Maxime Musterfrau 4", + "place": "4.", + "finalist": true + }, + "22": { + "name": "Maxime Musterfrau 5", + "place": "5.", + "finalist": true + } }, - "13": { - "name": "Maxime Musterfrau 2", - "place": "2.", - "finalist": true - }, - "17": { - "name": "Maxime Musterfrau 3", - "place": "3.", - "finalist": true - }, - "6": { - "name": "Maxime Musterfrau 4", - "place": "4.", - "finalist": true - }, - "22": { - "name": "Maxime Musterfrau 5", - "place": "5.", - "finalist": true - } + "title": "09.07.2022 - ETW, Solos Jun. Beginner Jive" } diff --git a/src/solo_turnier/tests/test_html_locator.py b/src/solo_turnier/tests/test_html_locator.py new file mode 100644 index 0000000..a24a514 --- /dev/null +++ b/src/solo_turnier/tests/test_html_locator.py @@ -0,0 +1,17 @@ + +import os +import solo_turnier.html_locator + +def test_fetchLocationCandidates(): + folder = os.path.join(os.path.dirname(__file__), 'html_locator', 'export') + relFolder = os.path.relpath(folder) + + locator = solo_turnier.html_locator.HtmlLocator() + candidates = locator.findCandidates(relFolder) + + expected = [ + 'solo_turnier/tests/html_locator/export/2-bar/erg.htm', + 'solo_turnier/tests/html_locator/export/3-baz/erg.htm', + 'solo_turnier/tests/html_locator/export/3-baz/subfolder/4-baz/erg.htm' + ] + assert set(candidates) == set(expected)