2022-09-07 19:24:43 +03:00
|
|
|
import os
|
2020-06-05 15:03:18 +03:00
|
|
|
import subprocess
|
2022-09-07 19:24:43 +03:00
|
|
|
from typing import Optional
|
2020-06-05 15:03:18 +03:00
|
|
|
|
2022-09-07 19:24:43 +03:00
|
|
|
import ports
|
2020-06-05 15:03:18 +03:00
|
|
|
|
2022-09-07 19:24:43 +03:00
|
|
|
class NodeGraphQL:
|
|
|
|
def __init__(self, cmd: list[str], env: dict[str, str] = {}, port: Optional[int] = None):
|
2020-06-05 15:03:18 +03:00
|
|
|
self.cmd = cmd
|
2022-09-07 19:24:43 +03:00
|
|
|
self.env = env
|
|
|
|
self.port = port if port else ports.find_free_port()
|
|
|
|
self.proc: Optional[subprocess.Popen[bytes]] = None
|
2020-06-05 15:03:18 +03:00
|
|
|
|
|
|
|
def start(self):
|
2022-09-07 19:24:43 +03:00
|
|
|
self.proc = subprocess.Popen(self.cmd, env={**os.environ, **self.env, 'PORT': str(self.port)})
|
|
|
|
try:
|
|
|
|
ports.wait_for_port(self.port, timeout = 3)
|
|
|
|
except:
|
|
|
|
self.proc.kill()
|
|
|
|
self.proc = None
|
|
|
|
raise
|
2020-06-05 15:03:18 +03:00
|
|
|
|
|
|
|
def stop(self):
|
2022-09-07 19:24:43 +03:00
|
|
|
if self.proc:
|
|
|
|
self.proc.terminate()
|
|
|
|
self.proc = None
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url(self):
|
|
|
|
return f'http://localhost:{self.port}'
|