Add broken symlink diagnostics
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from serato_doctor.models.crate import Crate, CrateKind
|
||||
from serato_doctor.models.duplicate import DuplicateGroup, DuplicateKind
|
||||
from serato_doctor.models.filesystem import BrokenSymlink, FilesystemScan
|
||||
from serato_doctor.models.health import HealthReport
|
||||
from serato_doctor.models.library import Library
|
||||
from serato_doctor.models.match import MatchEvidence, TrackMatch
|
||||
@@ -12,6 +13,8 @@ __all__ = [
|
||||
"DiskTrack",
|
||||
"DuplicateGroup",
|
||||
"DuplicateKind",
|
||||
"BrokenSymlink",
|
||||
"FilesystemScan",
|
||||
"HealthReport",
|
||||
"Library",
|
||||
"MatchEvidence",
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from typing import Optional, Tuple
|
||||
|
||||
from serato_doctor.models.track import DiskTrack
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class BrokenSymlink:
|
||||
"""A symbolic link whose target cannot be resolved."""
|
||||
|
||||
path: Path
|
||||
target: Optional[Path]
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class FilesystemScan:
|
||||
"""Read-only findings from one traversal of a music folder."""
|
||||
|
||||
tracks: Tuple[DiskTrack, ...]
|
||||
broken_symlinks: Tuple[BrokenSymlink, ...]
|
||||
@@ -19,6 +19,7 @@ class HealthReport:
|
||||
suspected_cloud_conflict_files: int
|
||||
unused_tracks: int
|
||||
suggested_matches: int
|
||||
broken_symlinks: int
|
||||
static_crates: int
|
||||
smart_crates: int
|
||||
unknown_crates: int
|
||||
|
||||
@@ -2,6 +2,7 @@ from dataclasses import dataclass
|
||||
from typing import Iterable, Tuple
|
||||
|
||||
from serato_doctor.models.crate import Crate
|
||||
from serato_doctor.models.filesystem import BrokenSymlink
|
||||
from serato_doctor.models.reference import ReferenceResult, TrackReference
|
||||
from serato_doctor.models.track import DiskTrack
|
||||
|
||||
@@ -13,18 +14,27 @@ class Library:
|
||||
references: Tuple[TrackReference, ...]
|
||||
tracks: Tuple[DiskTrack, ...]
|
||||
crates: Tuple[Crate, ...] = ()
|
||||
broken_symlinks: Tuple[BrokenSymlink, ...] = ()
|
||||
|
||||
@classmethod
|
||||
def build(
|
||||
cls,
|
||||
references: Iterable[TrackReference],
|
||||
tracks: Iterable[DiskTrack],
|
||||
broken_symlinks: Iterable[BrokenSymlink] = (),
|
||||
) -> "Library":
|
||||
return cls(tuple(references), tuple(tracks))
|
||||
return cls(
|
||||
tuple(references),
|
||||
tuple(tracks),
|
||||
broken_symlinks=tuple(broken_symlinks),
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_crates(
|
||||
cls, crates: Iterable[Crate], tracks: Iterable[DiskTrack]
|
||||
cls,
|
||||
crates: Iterable[Crate],
|
||||
tracks: Iterable[DiskTrack],
|
||||
broken_symlinks: Iterable[BrokenSymlink] = (),
|
||||
) -> "Library":
|
||||
crate_tuple = tuple(crates)
|
||||
references = tuple(
|
||||
@@ -32,7 +42,12 @@ class Library:
|
||||
for crate in crate_tuple
|
||||
for reference in crate.references
|
||||
)
|
||||
return cls(references, tuple(tracks), crate_tuple)
|
||||
return cls(
|
||||
references,
|
||||
tuple(tracks),
|
||||
crate_tuple,
|
||||
tuple(broken_symlinks),
|
||||
)
|
||||
|
||||
def reconcile_by_filename(self) -> Tuple[ReferenceResult, ...]:
|
||||
disk_names = {track.filename for track in self.tracks}
|
||||
|
||||
Reference in New Issue
Block a user