import subprocess as sp import subprocess as sp import requests import json from decouple import config def install_available(pipfile): """ Install Python packages or their dependencies mentioned in pipfile if they are available in System repos """ def is_available_in_system_repos(package): try: sp.check_output(['apk', 'info', f'py3-{package}']) except: return False else: return True if get_distro_name() == "alpine": dependencies = [] need_to_be_installed = [] try: with open(pipfile) as f: lines = f.readlines() try: start_index = lines.index("[packages]\n") end_index = lines.index("\n", start_index) for package in lines[start_index: end_index]: if '= "*"' in package: package = package[:package.index(" =")] if is_available_in_system_repos(package): need_to_be_installed.append(f"py3-{package}") else: dependencies.append(package) except ValueError: print("Not Found") except: return else: for dependency in dependencies: content = requests.get(f"https://libraries.io/api/pypi/{dependency}/latest/dependencies?api_key={config('LIBRARIES_IO_API')}") content = json.loads(content.content.decode("utf-8")) for subdependency in content["dependencies"]: subdependency = subdependency["name"] if is_available_in_system_repos(subdependency): need_to_be_installed.append(f"py3-{subdependency}") for package in need_to_be_installed: try: sp.check_output(["apk", "add", package]) except: print(f"Could not install {package}") def clone_common(path='.'): sp.check_output(['git', 'clone', f'https://code.ungleich.ch/ungleich-public/ucloud_common'], cwd=path) def clone_etcd_wrapper(path='.'): sp.check_output(['git', 'clone', f'https://code.ungleich.ch/ahmedbilal/etcd3_wrapper'], cwd=path) def get_distro_name(): distro_name = None with open("/etc/os-release") as f: content = f.read() start = content.find("ID=") + 3 end = content.find("\n", start) distro_name = content[start:end] return distro_name