| 31 | UNDERLINE = '\033[4m' |
| 32 | |
| 33 | class DependencyManager: |
| 34 | def __init__(self): |
| 35 | self.required_packages = { |
| 36 | 'requests': 'requests', |
| 37 | 'urllib3': 'urllib3', |
| 38 | 'websocket-client': 'websocket-client', |
| 39 | 'psutil': 'psutil' |
| 40 | } |
| 41 | self.optional_packages = { |
| 42 | 'numpy': 'numpy', |
| 43 | 'pandas': 'pandas' |
| 44 | } |
| 45 | |
| 46 | def check_python_version(self): |
| 47 | """Check if Python version is sufficient""" |
| 48 | if sys.version_info < (3, 6): |
| 49 | print(f"{Colors.RED}[!] Python 3.6 or higher is required{Colors.RESET}") |
| 50 | return False |
| 51 | print(f"{Colors.GREEN}[+] Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} detected{Colors.RESET}") |
| 52 | return True |
| 53 | |
| 54 | def is_package_installed(self, package_name): |
| 55 | """Check if a package is installed""" |
| 56 | try: |
| 57 | importlib.import_module(package_name) |
| 58 | return True |
| 59 | except ImportError: |
| 60 | return False |
| 61 | |
| 62 | def install_package(self, package_name, pip_name=None): |
| 63 | """Install a package using pip""" |
| 64 | if pip_name is None: |
| 65 | pip_name = package_name |
| 66 | |
| 67 | print(f"{Colors.YELLOW}[~] Installing {package_name}...{Colors.RESET}") |
| 68 | try: |
| 69 | # Try using pip with current Python interpreter |
| 70 | subprocess.check_call([ |
| 71 | sys.executable, '-m', 'pip', 'install', |
| 72 | '--upgrade', pip_name |
| 73 | ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) |
| 74 | print(f"{Colors.GREEN}[+] Successfully installed {package_name}{Colors.RESET}") |
| 75 | return True |
| 76 | except subprocess.CalledProcessError: |
| 77 | try: |
| 78 | # Try without upgrade flag |
| 79 | subprocess.check_call([ |
| 80 | sys.executable, '-m', 'pip', 'install', pip_name |
| 81 | ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) |
| 82 | print(f"{Colors.GREEN}[+] Successfully installed {package_name}{Colors.RESET}") |
| 83 | return True |
| 84 | except subprocess.CalledProcessError as e: |
| 85 | print(f"{Colors.RED}[!] Failed to install {package_name}: {e}{Colors.RESET}") |
| 86 | return False |
| 87 | |
| 88 | def install_all_dependencies(self): |
| 89 | """Install all required dependencies""" |
| 90 | print(f"{Colors.CYAN}[*] Checking and installing dependencies...{Colors.RESET}") |
no outgoing calls
no test coverage detected