diff options
Diffstat (limited to 'scripts/verify_playlist_integration.py')
| -rw-r--r-- | scripts/verify_playlist_integration.py | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/scripts/verify_playlist_integration.py b/scripts/verify_playlist_integration.py new file mode 100644 index 0000000..1306782 --- /dev/null +++ b/scripts/verify_playlist_integration.py @@ -0,0 +1,203 @@ +"""Verification script for playlist membership integration. + +Checks that all components are properly integrated into MainWindow. +""" + +import sys +from pathlib import Path + +# Add project root to path +project_root = Path(__file__).parent.parent +sys.path.insert(0, str(project_root)) + + +def _check_import(module_path: str, component_name: str, check_num: int) -> tuple[int, int]: + """Check if a component can be imported. + + Args: + module_path: The module path to import from + component_name: The component name to import + check_num: The check number for display + + Returns: + tuple[int, int]: (passed, failed) counts + """ + try: + __import__(module_path, fromlist=[component_name]) + except ImportError as e: + print(f"❌ Check {check_num}: {component_name} import failed: {e}") + return (0, 1) + else: + print(f"✅ Check {check_num}: {component_name} importable") + return (1, 0) + + +def _run_all_import_checks() -> tuple[int, int]: + """Run all import checks. + + Returns: + tuple[int, int]: (passed, failed) counts + """ + checks = [ + ("tidal_dl_ng.gui.playlist_membership_mixin", "PlaylistMembershipMixin", 1), + ("tidal_dl_ng.gui.playlist_membership", "PlaylistContextLoader", 2), + ("tidal_dl_ng.gui.playlist_membership", "ThreadSafePlaylistCache", 3), + ("tidal_dl_ng.gui.playlist_membership", "PlaylistColumnDelegate", 4), + ("tidal_dl_ng.ui.dialog_playlist_manager", "PlaylistManagerDialog", 5), + ] + + total_passed = 0 + total_failed = 0 + + for module_path, component_name, check_num in checks: + passed, failed = _check_import(module_path, component_name, check_num) + total_passed += passed + total_failed += failed + + return total_passed, total_failed + + +def _check_mainwindow_inheritance() -> tuple[int, int]: + """Check if MainWindow inherits from PlaylistMembershipMixin. + + Returns: + tuple[int, int]: (passed, failed) counts + """ + try: + from tidal_dl_ng.gui.main_window import MainWindow + from tidal_dl_ng.gui.playlist_membership_mixin import PlaylistMembershipMixin + + if issubclass(MainWindow, PlaylistMembershipMixin): + print("✅ Check 6: MainWindow has PlaylistMembershipMixin") + return (1, 0) + except Exception as e: + print(f"❌ Check 6: MainWindow inheritance check failed: {e}") + return (0, 1) + else: + print("❌ Check 6: MainWindow does not inherit PlaylistMembershipMixin") + return (0, 1) + + +def _check_method_exists() -> tuple[int, int]: + """Check if init_playlist_membership_manager method exists. + + Returns: + tuple[int, int]: (passed, failed) counts + """ + try: + from tidal_dl_ng.gui.main_window import MainWindow + + if hasattr(MainWindow, "init_playlist_membership_manager"): + print("✅ Check 7: init_playlist_membership_manager method exists") + return (1, 0) + except Exception as e: + print(f"❌ Check 7: Method check failed: {e}") + return (0, 1) + else: + print("❌ Check 7: init_playlist_membership_manager method not found") + return (0, 1) + + +def _check_file_content( + file_path: Path, search_str: str, check_num: int, success_msg: str, fail_msg: str +) -> tuple[int, int]: + """Check if a file contains a specific string. + + Args: + file_path: Path to the file to check + search_str: String to search for + check_num: Check number for display + success_msg: Message to display on success + fail_msg: Message to display on failure + + Returns: + tuple[int, int]: (passed, failed) counts + """ + try: + with open(file_path) as f: + content = f.read() + if search_str in content: + print(f"✅ Check {check_num}: {success_msg}") + return (1, 0) + print(f"❌ Check {check_num}: {fail_msg}") + return (0, 1) + except Exception as e: + print(f"❌ Check {check_num}: File check failed: {e}") + return (0, 1) + + +def check_integration() -> int: + """Verify all components are integrated. + + Returns: + int: 0 if all checks pass, 1 otherwise + """ + checks_passed = 0 + checks_failed = 0 + + print("🔍 Vérification de l'intégration du Playlist Membership Manager\n") + print("=" * 70) + + # Run all import checks + passed, failed = _run_all_import_checks() + checks_passed += passed + checks_failed += failed + + # Check 6: MainWindow has PlaylistMembershipMixin + passed, failed = _check_mainwindow_inheritance() + checks_passed += passed + checks_failed += failed + + # Check 7: init_playlist_membership_manager method exists + passed, failed = _check_method_exists() + checks_passed += passed + checks_failed += failed + + # Check 8: TreesResultsMixin has playlists column + passed, failed = _check_file_content( + project_root / "tidal_dl_ng" / "gui" / "trees_results.py", + "child_playlists", + 8, + "child_playlists column added to TreesResultsMixin", + "child_playlists column NOT found in TreesResultsMixin", + ) + checks_passed += passed + checks_failed += failed + + # Check 9: tidal_session.py calls init_playlist_membership_manager + passed, failed = _check_file_content( + project_root / "tidal_dl_ng" / "gui" / "tidal_session.py", + "init_playlist_membership_manager", + 9, + "init_playlist_membership_manager called in init_tidal", + "init_playlist_membership_manager NOT called in init_tidal", + ) + checks_passed += passed + checks_failed += failed + + # Check 10: PlaylistMembershipMixin imports PlaylistCellState + passed, failed = _check_file_content( + project_root / "tidal_dl_ng" / "gui" / "playlist_membership_mixin.py", + "PlaylistCellState", + 10, + "PlaylistCellState imported in mixin", + "PlaylistCellState NOT imported in mixin", + ) + checks_passed += passed + checks_failed += failed + + # Print summary + print("\n" + "=" * 70) + print(f"\n📊 Résultat: {checks_passed} ✅ / {checks_failed} ❌\n") + + if checks_failed == 0: + print("🎉 INTÉGRATION COMPLÈTE - Tous les checks sont passés!") + return 0 + + print(f"⚠️ {checks_failed} problème(s) détecté(s)") + return 1 + + +if __name__ == "__main__": + exit_code = check_integration() + sys.exit(exit_code) |
