|
|
|
|
|
""" |
|
|
Post-build Package Version Checker |
|
|
Logs installed package versions and validates imports |
|
|
""" |
|
|
import sys |
|
|
import subprocess |
|
|
import importlib |
|
|
|
|
|
def check_package_version(package_name): |
|
|
"""Get installed version of a package""" |
|
|
try: |
|
|
result = subprocess.run( |
|
|
[sys.executable, "-m", "pip", "show", package_name], |
|
|
capture_output=True, |
|
|
text=True, |
|
|
timeout=10 |
|
|
) |
|
|
if result.returncode == 0: |
|
|
for line in result.stdout.split('\n'): |
|
|
if line.startswith('Version:'): |
|
|
return line.split(':', 1)[1].strip() |
|
|
return "NOT FOUND" |
|
|
except Exception as e: |
|
|
return f"ERROR: {e}" |
|
|
|
|
|
def test_import(module_name, from_name=None): |
|
|
"""Test if a module/class can be imported""" |
|
|
try: |
|
|
if from_name: |
|
|
module = importlib.import_module(module_name) |
|
|
getattr(module, from_name) |
|
|
return "β OK" |
|
|
else: |
|
|
importlib.import_module(module_name) |
|
|
return "β OK" |
|
|
except ImportError as e: |
|
|
return f"β FAIL: {e}" |
|
|
except AttributeError as e: |
|
|
return f"β FAIL: {e}" |
|
|
except Exception as e: |
|
|
return f"β ERROR: {e}" |
|
|
|
|
|
def main(): |
|
|
print("=" * 80) |
|
|
print("GraphWiz Ireland - Package Version & Import Check") |
|
|
print("=" * 80) |
|
|
|
|
|
|
|
|
packages = [ |
|
|
'sentence-transformers', |
|
|
'transformers', |
|
|
'torch', |
|
|
'numpy', |
|
|
'huggingface-hub', |
|
|
'streamlit', |
|
|
'hnswlib', |
|
|
'networkx', |
|
|
'spacy', |
|
|
'rank-bm25', |
|
|
'groq', |
|
|
'pandas', |
|
|
'scikit-learn', |
|
|
'scipy' |
|
|
] |
|
|
|
|
|
print("\nπ¦ Installed Package Versions:") |
|
|
print("-" * 80) |
|
|
for pkg in packages: |
|
|
version = check_package_version(pkg) |
|
|
status = "β" if version != "NOT FOUND" and not version.startswith("ERROR") else "β" |
|
|
print(f"{status} {pkg:30s} {version}") |
|
|
|
|
|
|
|
|
print("\nπ Checking for Known Version Conflicts:") |
|
|
print("-" * 80) |
|
|
|
|
|
hf_hub_version = check_package_version('huggingface-hub') |
|
|
transformers_version = check_package_version('transformers') |
|
|
|
|
|
print(f"huggingface-hub version: {hf_hub_version}") |
|
|
print(f"transformers version: {transformers_version}") |
|
|
|
|
|
|
|
|
try: |
|
|
if hf_hub_version != "NOT FOUND": |
|
|
hf_major = int(hf_hub_version.split('.')[0]) |
|
|
hf_minor = int(hf_hub_version.split('.')[1]) |
|
|
|
|
|
if hf_major == 0 and hf_minor >= 19 and hf_minor < 100: |
|
|
print("β huggingface-hub version is compatible (>=0.19.3, <1.0)") |
|
|
else: |
|
|
print(f"β WARNING: huggingface-hub {hf_hub_version} may not be compatible!") |
|
|
print(" transformers requires: >=0.19.3, <1.0") |
|
|
except: |
|
|
print("β οΈ Could not parse version numbers") |
|
|
|
|
|
|
|
|
print("\nπ§ͺ Testing Critical Imports:") |
|
|
print("-" * 80) |
|
|
|
|
|
imports_to_test = [ |
|
|
('streamlit', None), |
|
|
('sentence_transformers', 'SentenceTransformer'), |
|
|
('transformers', None), |
|
|
('huggingface_hub', 'hf_hub_download'), |
|
|
('hnswlib', None), |
|
|
('groq', 'Groq'), |
|
|
('networkx', None), |
|
|
('spacy', None), |
|
|
] |
|
|
|
|
|
all_passed = True |
|
|
for module, from_name in imports_to_test: |
|
|
if from_name: |
|
|
test_name = f"from {module} import {from_name}" |
|
|
else: |
|
|
test_name = f"import {module}" |
|
|
|
|
|
result = test_import(module, from_name) |
|
|
print(f"{test_name:50s} {result}") |
|
|
if "FAIL" in result or "ERROR" in result: |
|
|
all_passed = False |
|
|
|
|
|
|
|
|
print("\nπ§ Testing Application Modules:") |
|
|
print("-" * 80) |
|
|
|
|
|
sys.path.insert(0, '/app/src') |
|
|
|
|
|
app_modules = [ |
|
|
('groq_llm', 'GroqLLM'), |
|
|
('text_processor', None), |
|
|
('hybrid_retriever', 'HybridRetriever'), |
|
|
('rag_engine', 'IrelandRAGEngine'), |
|
|
] |
|
|
|
|
|
for module, from_name in app_modules: |
|
|
if from_name: |
|
|
test_name = f"from {module} import {from_name}" |
|
|
else: |
|
|
test_name = f"import {module}" |
|
|
|
|
|
result = test_import(module, from_name) |
|
|
print(f"{test_name:50s} {result}") |
|
|
if "FAIL" in result or "ERROR" in result: |
|
|
all_passed = False |
|
|
|
|
|
print(f" Detailed error for {module}:") |
|
|
try: |
|
|
importlib.import_module(module) |
|
|
except Exception as e: |
|
|
print(f" {type(e).__name__}: {e}") |
|
|
|
|
|
print("\n" + "=" * 80) |
|
|
if all_passed: |
|
|
print("β
All checks passed!") |
|
|
else: |
|
|
print("β Some checks failed - see details above") |
|
|
print("=" * 80) |
|
|
|
|
|
return 0 if all_passed else 1 |
|
|
|
|
|
if __name__ == "__main__": |
|
|
sys.exit(main()) |
|
|
|