#!/usr/bin/env python3 """ Debug script to test PyStorm with Starcraft.mpq """ import sys from pathlib import Path print("="*60) print("PyStorm Debug Script - Testing with Starcraft.mpq") print("="*60) # Test 1: Import PyStorm print("\n[1/5] Importing PyStorm...") try: from pystorm import MPQArchive, StormLibError print("✓ PyStorm imported successfully") except ImportError as e: print(f"✗ Failed to import PyStorm: {e}") sys.exit(1) # Test 2: Check file exists print("\n[2/5] Checking if Starcraft.mpq exists...") mpq_path = Path("Starcraft.mpq") if not mpq_path.exists(): print(f"✗ File not found: {mpq_path.absolute()}") sys.exit(1) file_size = mpq_path.stat().st_size print(f"✓ File found: {mpq_path}") print(f" Size: {file_size:,} bytes ({file_size / 1024 / 1024:.2f} MB)") # Test 3: Open the archive print("\n[3/5] Opening archive...") try: archive = MPQArchive(str(mpq_path)) print("✓ Archive opened successfully") except StormLibError as e: print(f"✗ Failed to open archive: {e}") sys.exit(1) except Exception as e: print(f"✗ Unexpected error: {e}") import traceback traceback.print_exc() sys.exit(1) # Test 4: List files print("\n[4/5] Listing files in archive...") try: files = archive.find_files("*") print(f"✓ Found {len(files)} files in archive") # Show first 10 files print("\nFirst 10 files:") for i, file_info in enumerate(files[:10], 1): name = file_info['name'] size = file_info['size'] compressed = file_info['compressed_size'] print(f" {i:2d}. {name:40s} {size:>10,} bytes") if len(files) > 10: print(f" ... and {len(files) - 10} more files") # Statistics total_size = sum(f['size'] for f in files) total_compressed = sum(f['compressed_size'] for f in files) ratio = (1 - total_compressed / total_size) * 100 if total_size > 0 else 0 print(f"\nArchive Statistics:") print(f" Total files: {len(files)}") print(f" Uncompressed size: {total_size:,} bytes ({total_size / 1024 / 1024:.2f} MB)") print(f" Compressed size: {total_compressed:,} bytes ({total_compressed / 1024 / 1024:.2f} MB)") print(f" Compression ratio: {ratio:.1f}%") except StormLibError as e: print(f"✗ Failed to list files: {e}") archive.close() sys.exit(1) except Exception as e: print(f"✗ Unexpected error: {e}") import traceback traceback.print_exc() archive.close() sys.exit(1) # Test 5: Extract a small file print("\n[5/5] Testing file extraction...") try: # Find the smallest file to extract if files: smallest = min(files, key=lambda f: f['size']) test_file = smallest['name'] test_size = smallest['size'] print(f" Extracting: {test_file} ({test_size} bytes)") # Extract to temporary file then read import tempfile with tempfile.NamedTemporaryFile(delete=False) as tmp: tmp_path = tmp.name archive.extract_file(test_file, tmp_path) with open(tmp_path, 'rb') as f: data = f.read() import os os.unlink(tmp_path) print(f"✓ Successfully extracted {len(data)} bytes") # Show first 100 bytes if it's text-like if test_size < 1000: try: text = data.decode('utf-8', errors='ignore')[:200] if text.isprintable() or '\n' in text: print(f"\n Preview (first 200 chars):") print(" " + "-"*50) for line in text.split('\n')[:5]: print(f" {line}") print(" " + "-"*50) except: pass else: print(" No files to extract") except StormLibError as e: print(f"✗ Failed to extract file: {e}") archive.close() sys.exit(1) except Exception as e: print(f"✗ Unexpected error: {e}") import traceback traceback.print_exc() archive.close() sys.exit(1) # Cleanup print("\n[6/6] Closing archive...") try: archive.close() print("✓ Archive closed") except Exception as e: print(f"✗ Failed to close archive: {e}") finally: # Prevent __del__ from trying to close again archive._closed = True print("\n" + "="*60) print("ALL TESTS PASSED! PyStorm is working correctly.") print("="*60)