example_check.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. # -*- coding: utf-8 -*-
  2. from concurrent.futures import ThreadPoolExecutor
  3. import importlib.util
  4. from os import path as osp
  5. import os
  6. import shutil
  7. import sys
  8. import subprocess
  9. from tornado.ioloop import IOLoop
  10. from traitlets import Bool, Unicode
  11. from jupyterlab.labapp import get_app_dir
  12. here = osp.abspath(osp.dirname(__file__))
  13. # Load the main file and grab the example class so we can subclass
  14. example_dir = sys.argv.pop()
  15. mod_path = osp.abspath(osp.join(example_dir, 'main.py'))
  16. spec = importlib.util.spec_from_file_location("example", mod_path)
  17. mod = importlib.util.module_from_spec(spec)
  18. spec.loader.exec_module(mod)
  19. class ExampleCheckApp(mod.ExampleApp):
  20. open_browser = Bool(False)
  21. default_url = '/example'
  22. base_url = '/foo/'
  23. ip = '127.0.0.1'
  24. def start(self):
  25. pool = ThreadPoolExecutor()
  26. future = pool.submit(run_browser, self.display_url)
  27. IOLoop.current().add_future(future, self._browser_finished)
  28. super().start()
  29. def _browser_finished(self, future):
  30. try:
  31. sys.exit(future.result())
  32. except Exception as e:
  33. self.log.error(str(e))
  34. sys.exit(1)
  35. def run_browser(url):
  36. """Run the browser test and return an exit code.
  37. """
  38. target = osp.join(get_app_dir(), 'example_test')
  39. if not osp.exists(osp.join(target, 'node_modules')):
  40. os.makedirs(target)
  41. subprocess.call(["jlpm"], cwd=target)
  42. subprocess.call(["jlpm", "add", "puppeteer"], cwd=target)
  43. shutil.copy(osp.join(here, 'chrome-example-test.js'), osp.join(target, 'chrome-example-test.js'))
  44. return subprocess.check_call(["node", "chrome-example-test.js", url], cwd=target)
  45. if __name__ == '__main__':
  46. ExampleCheckApp.launch_instance()