Extract Location into separate file

This commit is contained in:
Joscha 2020-04-23 17:38:28 +00:00
parent f3f4be2690
commit 5ef5a56e69
5 changed files with 41 additions and 38 deletions

37
PFERD/location.py Normal file
View File

@ -0,0 +1,37 @@
from pathlib import Path, PurePath
class ResolveException(Exception):
"""An exception while resolving a file."""
# TODO take care of this when doing exception handling
class Location:
"""
An object that has an inherent path.
"""
def __init__(self, path: Path):
self._path = path.resolve()
@property
def path(self) -> Path:
"""
This object's location.
"""
return self._path
def resolve(self, target: PurePath) -> Path:
"""
Resolve a file relative to the path of this location.
Raises a [ResolveException] if the file is outside the given directory.
"""
absolute_path = self.path.joinpath(target).resolve()
# TODO Make this less inefficient
if self.path not in absolute_path.parents:
raise ResolveException(f"Path {target} is not inside directory {self.path}")
return absolute_path

View File

@ -9,7 +9,8 @@ import shutil
from pathlib import Path from pathlib import Path
from typing import List, Set from typing import List, Set
from .utils import Location, PrettyLogger, prompt_yes_no from .location import Location
from .utils import PrettyLogger, prompt_yes_no
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
PRETTY = PrettyLogger(LOGGER) PRETTY = PrettyLogger(LOGGER)

View File

@ -5,10 +5,10 @@ from .cookie_jar import CookieJar
from .ilias import (IliasAuthenticator, IliasCrawler, IliasDirectoryFilter, from .ilias import (IliasAuthenticator, IliasCrawler, IliasDirectoryFilter,
IliasDownloader, KitShibbolethAuthenticator) IliasDownloader, KitShibbolethAuthenticator)
from .ilias.download_strategies import DownloadStrategy, download_everything from .ilias.download_strategies import DownloadStrategy, download_everything
from .location import Location
from .organizer import Organizer from .organizer import Organizer
from .tmp_dir import TmpDir from .tmp_dir import TmpDir
from .transform import Transform, apply_transform from .transform import Transform, apply_transform
from .utils import Location
# TODO save known-good cookies as soon as possible # TODO save known-good cookies as soon as possible
# TODO print synchronizer name before beginning synchronization # TODO print synchronizer name before beginning synchronization

View File

@ -6,7 +6,7 @@ from pathlib import Path
from types import TracebackType from types import TracebackType
from typing import Optional, Type from typing import Optional, Type
from .utils import Location from .location import Location
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)

View File

@ -78,41 +78,6 @@ def prompt_yes_no(question: str, default: Optional[bool] = None) -> bool:
print(wrong_reply) print(wrong_reply)
class ResolveException(Exception):
"""An exception while resolving a file."""
class Location:
"""
An object that has an inherent path.
"""
def __init__(self, path: Path):
self._path = path.resolve()
@property
def path(self) -> Path:
"""
This object's location.
"""
return self._path
def resolve(self, target: Path) -> Path:
"""
Resolve a file relative to the path of this location.
Raises a [ResolveException] if the file is outside the given directory.
"""
absolute_path = self.path.joinpath(target).resolve()
# TODO Make this less inefficient
if self.path not in absolute_path.parents:
raise ResolveException(f"Path {target} is not inside directory {self.path}")
return absolute_path
class PrettyLogger: class PrettyLogger:
""" """
A logger that prints some specially formatted log messages in color. A logger that prints some specially formatted log messages in color.