61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
|
import enum
|
||
|
import os
|
||
|
from typing import List, Tuple, Union
|
||
|
|
||
|
|
||
|
class AnsiColor(enum.Enum):
|
||
|
ERROR = "\033[0;31m"
|
||
|
INFO = "\033[0;34m"
|
||
|
DATA = "\033[0;36m"
|
||
|
RESET = "\033[0m"
|
||
|
|
||
|
|
||
|
class Site(enum.Enum):
|
||
|
CHESSCOM = "chesscom"
|
||
|
LICHESS = "lichess"
|
||
|
|
||
|
|
||
|
class Repo:
|
||
|
"""Shared filesystem-related functionality."""
|
||
|
|
||
|
def __init__(self, site: str):
|
||
|
self.site = site
|
||
|
|
||
|
def path_site_dir(self):
|
||
|
"""The root directory for all site-related files."""
|
||
|
return os.path.join("data", self.site)
|
||
|
|
||
|
def path_site_file(self, filename: str):
|
||
|
"""Path to a top-level site-related file."""
|
||
|
return os.path.join(self.path_site_dir(), filename)
|
||
|
|
||
|
def path_coaches_dir(self):
|
||
|
"""The root directory for all coach-related downloads."""
|
||
|
return os.path.join(self.path_site_dir(), "coaches")
|
||
|
|
||
|
def path_coach_dir(self, username: str):
|
||
|
"""The root directory for a specific coach's downloads."""
|
||
|
return os.path.join(self.path_coaches_dir(), username)
|
||
|
|
||
|
def path_coach_file(self, username: str, filename: str):
|
||
|
"""Path to a coach-specific file download."""
|
||
|
return os.path.join(self.path_coach_dir(username), filename)
|
||
|
|
||
|
def path_pages_dir(self):
|
||
|
"""The root directory for all username listing files."""
|
||
|
return os.path.join(self.path_site_dir(), "pages")
|
||
|
|
||
|
def path_page_file(self, page_no: int):
|
||
|
"""The root directory for usernames scraped from a single page."""
|
||
|
return os.path.join(self.path_pages_dir(), f"{page_no}.txt")
|
||
|
|
||
|
def log(self, msgs: List[Tuple[Union[AnsiColor, None], str]]):
|
||
|
transformed = []
|
||
|
for k, v in msgs:
|
||
|
if k is None:
|
||
|
transformed.append(v)
|
||
|
else:
|
||
|
transformed.append(f"{k.value}{v}{AnsiColor.RESET.value}")
|
||
|
|
||
|
print("".join(transformed))
|