import argparse import os import subprocess import shutil import sys import time root_dir = sys.path[0] def devupdate(args): subprocess.check_call( [ sys.executable, '-m', 'pip', 'install', '-r', os.path.join(root_dir, 'dev-python-requirements.txt'), ] ) def run(args): import docker POSTGRES_USER = 'locality' POSTGRES_PASSWORD = 'wkyhjofg2837f' POSTGRES_DB = 'locality' postgres_env = { 'POSTGRES_USER': POSTGRES_USER, 'POSTGRES_PASSWORD': POSTGRES_PASSWORD, 'POSTGRES_DB': POSTGRES_DB, } locality_env = { 'LOCALITY_DATABASE_URL': 'postgres://{}:{}@localhost/{}'.format( POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB ) } docker_client = docker.from_env() postgres_container = docker_client.containers.run( 'postgres:14.11', environment=postgres_env, detach=True, ports={'5432/tcp': ('127.0.0.1', 5432)}, ) try: docker_stream = postgres_container.attach(stream=True) for line_binary in docker_stream: line = line_binary.decode('utf-8') print(line) if 'listening on IPv4 address "0.0.0.0", port 5432' in line: break for line_binary in docker_stream: line = line_binary.decode('utf-8') print(line) if 'database system is ready to accept connections' in line: break cargo_bin = shutil.which('cargo') locality_process = subprocess.Popen( [cargo_bin, 'run'], env=locality_env, cwd=root_dir ) try: while locality_process.poll() is None: time.sleep(0.5) finally: if locality_process.poll() is None: locality_process.terminate() finally: postgres_container.stop() postgres_container.remove() parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(required=True) run_parser = subparsers.add_parser( 'run', help='Run a test instance of locality' ) run_parser.set_defaults(func=run) devupdate_parser = subparsers.add_parser( 'devupdate', help='Install or update packages used by this script' ) devupdate_parser.set_defaults(func=devupdate) args = parser.parse_args() args.func(args)