Discover Serato smart crate definitions
This commit is contained in:
+34
-1
@@ -6,6 +6,7 @@ from serato_doctor.crate_parser import (
|
||||
classify_crate,
|
||||
clean_path,
|
||||
load_crate,
|
||||
load_library_crates,
|
||||
parse_crate,
|
||||
parse_crates,
|
||||
path_markers,
|
||||
@@ -92,7 +93,7 @@ def test_parse_crates_reuses_configured_roots_for_every_crate(tmp_path):
|
||||
("relative_path", "expected"),
|
||||
[
|
||||
("_Serato_/Subcrates/House.crate", CrateKind.STATIC),
|
||||
("_Serato_/Smartcrates/Warmup.crate", CrateKind.SMART),
|
||||
("_Serato_/SmartCrates/Warmup.scrate", CrateKind.SMART),
|
||||
("_Serato_/Subcrates/Compatible by key.crate", CrateKind.SMART),
|
||||
("fixtures/Unknown.crate", CrateKind.UNKNOWN),
|
||||
],
|
||||
@@ -101,3 +102,35 @@ def test_classify_crate_uses_provenance_and_known_dynamic_name(
|
||||
tmp_path, relative_path, expected
|
||||
):
|
||||
assert classify_crate(tmp_path / relative_path) is expected
|
||||
|
||||
|
||||
def test_smart_crate_preserves_encoded_hierarchy(tmp_path):
|
||||
crate_path = (
|
||||
tmp_path / "_Serato_" / "SmartCrates" / "Compatible by key≫≫10A.scrate"
|
||||
)
|
||||
crate_path.parent.mkdir(parents=True)
|
||||
crate_path.write_bytes(b"")
|
||||
crate = load_crate(crate_path)
|
||||
|
||||
assert crate.kind is CrateKind.SMART
|
||||
assert crate.hierarchy == ("Compatible by key", "10A")
|
||||
assert crate.display_name == "10A"
|
||||
assert crate.is_smart_definition
|
||||
|
||||
|
||||
def test_load_library_crates_discovers_scrate_definitions(tmp_path):
|
||||
smart_folder = tmp_path / "SmartCrates"
|
||||
static_folder = tmp_path / "Subcrates"
|
||||
smart_folder.mkdir()
|
||||
static_folder.mkdir()
|
||||
(smart_folder / "New EDM.scrate").write_bytes(b"")
|
||||
(smart_folder / "Re-Drums.scrate").write_bytes(b"")
|
||||
(static_folder / "House.crate").write_bytes(b"")
|
||||
|
||||
crates = load_library_crates(tmp_path)
|
||||
|
||||
assert [(crate.path.name, crate.kind) for crate in crates] == [
|
||||
("New EDM.scrate", CrateKind.SMART),
|
||||
("Re-Drums.scrate", CrateKind.SMART),
|
||||
("House.crate", CrateKind.STATIC),
|
||||
]
|
||||
|
||||
@@ -63,14 +63,14 @@ def test_empty_library_has_no_health_score():
|
||||
def test_smart_crate_references_are_reported_but_not_scored():
|
||||
static_reference = reference("Found.mp3")
|
||||
smart_reference = TrackReference(
|
||||
Path("Smartcrates/Dynamic.crate"),
|
||||
Path("SmartCrates/Dynamic.scrate"),
|
||||
Path("/old/House/Dynamic.mp3"),
|
||||
"Dynamic.mp3",
|
||||
)
|
||||
crates = [
|
||||
Crate(Path("Subcrates/Static.crate"), (static_reference,), CrateKind.STATIC),
|
||||
Crate(
|
||||
Path("Smartcrates/Dynamic.crate"),
|
||||
Path("SmartCrates/Dynamic.scrate"),
|
||||
(smart_reference,),
|
||||
CrateKind.SMART,
|
||||
),
|
||||
@@ -85,6 +85,7 @@ def test_smart_crate_references_are_reported_but_not_scored():
|
||||
assert report.missing_references == 0
|
||||
assert report.static_crates == 1
|
||||
assert report.smart_crates == 1
|
||||
assert report.smart_crate_containers == 0
|
||||
assert report.dynamic_references_excluded == 1
|
||||
|
||||
|
||||
|
||||
@@ -24,7 +24,9 @@ def test_generated_sample_library_has_expected_scenario(tmp_path):
|
||||
if not result.exists_by_filename
|
||||
}
|
||||
|
||||
assert len(list((sample_root / "Serato").rglob("*.crate"))) == 7
|
||||
crate_files = list((sample_root / "Serato").rglob("*.crate"))
|
||||
smart_files = list((sample_root / "Serato").rglob("*.scrate"))
|
||||
assert len(crate_files) + len(smart_files) == 7
|
||||
assert len(library.references) == 13
|
||||
assert len(tracks) == 10
|
||||
assert missing == {"Missing.mp3", "Old Name.mp3"}
|
||||
|
||||
Reference in New Issue
Block a user