mirror of
https://github.com/Garmelon/PFERD.git
synced 2026-04-12 07:25:04 +02:00
Add Transforms and Transformables
This commit is contained in:
parent
a051e3bcca
commit
3c808879c9
3 changed files with 46 additions and 4 deletions
|
|
@ -11,16 +11,16 @@ import requests.auth
|
|||
|
||||
from .organizer import Organizer
|
||||
from .tmp_dir import TmpDir
|
||||
from .transform import Transformable
|
||||
from .utils import stream_to_path
|
||||
|
||||
|
||||
@dataclass
|
||||
class HttpDownloadInfo:
|
||||
class HttpDownloadInfo(Transformable):
|
||||
"""
|
||||
This class describes a single file to be downloaded.
|
||||
"""
|
||||
|
||||
path: Path
|
||||
url: str
|
||||
parameters: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import requests
|
|||
|
||||
from ..organizer import Organizer
|
||||
from ..tmp_dir import TmpDir
|
||||
from ..transform import Transformable
|
||||
from ..utils import soupify, stream_to_path
|
||||
from .authenticators import IliasAuthenticator
|
||||
|
||||
|
|
@ -19,12 +20,11 @@ class ContentTypeException(Exception):
|
|||
|
||||
|
||||
@dataclass
|
||||
class IliasDownloadInfo:
|
||||
class IliasDownloadInfo(Transformable):
|
||||
"""
|
||||
This class describes a single file to be downloaded.
|
||||
"""
|
||||
|
||||
path: Path
|
||||
url: str
|
||||
modification_date: datetime.datetime
|
||||
# parameters: Dict[str, Any] = field(default_factory=dict)
|
||||
|
|
|
|||
42
PFERD/transform.py
Normal file
42
PFERD/transform.py
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
"""
|
||||
Transforms let the user define functions to decide where the downloaded files
|
||||
should be placed locally. They let the user do more advanced things like moving
|
||||
only files whose names match a regex, or renaming files from one numbering
|
||||
scheme to another.
|
||||
"""
|
||||
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from typing import Callable, List, Optional, TypeVar
|
||||
|
||||
|
||||
Transform = Callable[[Path], Optional[Path]]
|
||||
|
||||
|
||||
@dataclass
|
||||
class Transformable:
|
||||
"""
|
||||
An object that can be transformed by a Transform.
|
||||
"""
|
||||
|
||||
path: Path
|
||||
|
||||
|
||||
TF = TypeVar("TF", bound=Transformable)
|
||||
|
||||
|
||||
def apply_transform(
|
||||
transform: Callable[[Path], Optional[Path]],
|
||||
transformables: List[TF],
|
||||
) -> List[TF]:
|
||||
"""
|
||||
Apply a Transform to multiple Transformables, discarding those that were
|
||||
not transformed by the Transform.
|
||||
"""
|
||||
|
||||
result: List[TF] = []
|
||||
for transformable in transformables:
|
||||
if new_path := transform(transformable.path):
|
||||
transformable.path = new_path
|
||||
result.append(transformable)
|
||||
return result
|
||||
Loading…
Add table
Add a link
Reference in a new issue