diff --git a/PFERD/transform.py b/PFERD/transform.py index 16769df..7a05dd1 100644 --- a/PFERD/transform.py +++ b/PFERD/transform.py @@ -5,6 +5,8 @@ only files whose names match a regex, or renaming files from one numbering scheme to another. """ +import os +import re from dataclasses import dataclass from pathlib import PurePath from typing import Callable, List, Optional, TypeVar @@ -45,7 +47,8 @@ def apply_transform( # Transform combinators -keep = lambda path: path +def keep(path: PurePath) -> Optional[PurePath]: + return path def attempt(*args: Transform) -> Transform: def inner(path: PurePath) -> Optional[PurePath]: @@ -125,3 +128,15 @@ def re_rename(regex: Regex, target: str) -> Transform: return path.with_name(target.format(*groups)) return None return inner + + +def sanitize_windows_path(path: PurePath) -> Optional[PurePath]: + """ + A small function to escape characters that are forbidden in windows path names. + This method is a no-op on other operating systems. + """ + # Escape windows illegal path characters + if os.name == 'nt': + sanitized_parts = [re.sub(r'[<>:"/|?]', "_", x) for x in list(path.parts)] + return PurePath(*sanitized_parts) + return path diff --git a/sync_url.py b/sync_url.py index 2b8bc56..ddd239a 100755 --- a/sync_url.py +++ b/sync_url.py @@ -5,27 +5,17 @@ A simple script to download a course by name from ILIAS. """ import argparse -import os -import re -from pathlib import Path, PurePath -from typing import Optional +from pathlib import Path from urllib.parse import urlparse from PFERD import Pferd from PFERD.cookie_jar import CookieJar from PFERD.ilias import (IliasCrawler, IliasElementType, KitShibbolethAuthenticator) +from PFERD.transform import sanitize_windows_path from PFERD.utils import to_path -def sanitize_path(path: PurePath) -> Optional[PurePath]: - # Escape windows illegal path characters - if os.name == 'nt': - sanitized_parts = [re.sub(r'[<>:"/|?]', "_", x) for x in list(path.parts)] - return PurePath(*sanitized_parts) - return path - - def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--test-run", action="store_true") @@ -71,7 +61,7 @@ def main() -> None: full_url=args.url, cookies=args.cookies, dir_filter=dir_filter, - transform=sanitize_path + transform=sanitize_windows_path )