add argument parsing

This commit is contained in:
Marc 2024-09-16 12:33:36 +02:00
parent be9209e80d
commit 9d0dba3a5b

View file

@ -1,3 +1,4 @@
import argparse
import csv
import json
import logging
@ -22,18 +23,96 @@ PROJECT_ROOT = Path(__file__).parent.parent
logger = logging.getLogger(__package__)
def parse_arguments() -> dict:
"""
Parse the arguments.
:return: dict
"""
argparser = argparse.ArgumentParser(
prog="cgn-appointments",
description="Scrapes appointments from termine.stadt-koeln.de an sends a message to a ntfy server.",
)
argparser.add_argument(
"-s",
"--services",
action="store",
nargs='+',
type=str,
help="Services to check",
required=False,
)
argparser.add_argument(
"-l",
"--locations",
action="store",
nargs='+',
type=str,
help="Locations to check",
required=False,
)
argparser.add_argument(
"--config-file",
action="store",
type=Path,
help="Path to the configuration file",
required=False,
)
argparser.add_argument(
"--log-file",
action="store",
type=Path,
help="Path to logfile",
required=False,
)
argparser.add_argument(
"--log-level",
action="store",
type=str,
choices=["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG", "NOTSET"],
help="Logging Level",
required=False,
)
return argparser.parse_args().__dict__
def update_config_with_args(config: dict, args: dict) -> dict:
"""
Update the configuration with the arguments.
:param config:
:param args:
:return: dict
"""
update_config = {
"services": args.get("services"),
"locations": args.get("locations"),
"csv_path": args.get("csv_path"),
}
for key, value in update_config.items():
if value is not None:
config[key] = value
if args.get("log_file") is not None:
config["logging"]["handlers"]["file"]["filename"] = args.get("log_file")
if args.get("log_level") is not None:
config["logging"]["loggers"]["root"]["level"] = args.get("log_level")
return config
def get_config() -> dict:
"""
Get the configuration from the config.yaml file.
:return:
:return: dict
"""
config_yaml = Path(user_config_dir()) / "cgn-appointments" / "config.yaml"
args = parse_arguments()
if args.get("config_file") is not None:
config_yaml = args.get("config_file")
else:
config_yaml = Path(user_config_dir()) / "cgn-appointments" / "config.yaml"
if not config_yaml.exists():
logger.info(f"""config.yaml not found.
Creating a new one under '{config_yaml}'.
Please fill in the required information.""")
print(f"""config.yaml not found.
Creating a new one under '{config_yaml}'.
Please fill in the required information.""")
config_yaml.parent.mkdir(parents=True, exist_ok=True)
config_yaml.touch()
config_yaml.write_text(Path(Path(__file__).parent, "config_template.yaml").read_text())
@ -41,18 +120,21 @@ def get_config() -> dict:
try:
with open(config_yaml, "r") as file:
return dict(yaml.safe_load(file))
config = dict(yaml.safe_load(file))
except FileNotFoundError:
print("config.yaml not found")
print(f"config.yaml not found in '{config_yaml}'.")
exit(1)
# Replace config values with given arguments
return update_config_with_args(config, args)
def define_csv_path(csv_path: str|None, csv_name: str|None) -> Path:
"""
Define the path to the csv file.
:param csv_path:
:param csv_name:
:return:
:return: Path
"""
csv_path = Path(csv_path) if csv_path else None
csv_name = Path(csv_name) if csv_name else None
@ -233,16 +315,16 @@ def main():
# Get location containers
location_containers = driver.find_elements(By.CLASS_NAME, "location-container")
for location_container in location_containers:
loc_title = location_container.find_element(By.CLASS_NAME, "location_title")
for loc in check_locations:
for loc in check_locations:
for location_container in location_containers:
loc_title = location_container.find_element(By.CLASS_NAME, "location_title")
if loc in loc_title.text:
locations.update({loc: {"location_container": location_container}})
if len(locations) > 0:
logger.debug(f"Location containers found",
extra={"locations": locations})
else:
logger.warning("No location containers found.")
if len(locations) > 0:
logger.debug(f"Location containers found",
extra={"locations": locations})
else:
logger.warning("No location containers found.")
# Get earliest date for each location
for loc in locations.keys():