locality/dev.py

91 lines
2.3 KiB
Python

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)