PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/IPython/html/services/kernelspecs/handlers.py

https://github.com/arokem/ipython
Python | 86 lines | 67 code | 14 blank | 5 comment | 8 complexity | 4e08feb29efa86a085893265fa29d88b MD5 | raw file
  1. """Tornado handlers for kernel specifications."""
  2. # Copyright (c) IPython Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. import glob
  5. import json
  6. import os
  7. pjoin = os.path.join
  8. from tornado import web
  9. from ...base.handlers import IPythonHandler, json_errors
  10. from ...utils import url_path_join
  11. def kernelspec_model(handler, name):
  12. """Load a KernelSpec by name and return the REST API model"""
  13. ksm = handler.kernel_spec_manager
  14. spec = ksm.get_kernel_spec(name)
  15. d = {'name': name}
  16. d['spec'] = spec.to_dict()
  17. d['resources'] = resources = {}
  18. resource_dir = spec.resource_dir
  19. for resource in ['kernel.js', 'kernel.css']:
  20. if os.path.exists(pjoin(resource_dir, resource)):
  21. resources[resource] = url_path_join(
  22. handler.base_url,
  23. 'kernelspecs',
  24. name,
  25. resource
  26. )
  27. for logo_file in glob.glob(pjoin(resource_dir, 'logo-*')):
  28. fname = os.path.basename(logo_file)
  29. no_ext, _ = os.path.splitext(fname)
  30. resources[no_ext] = url_path_join(
  31. handler.base_url,
  32. 'kernelspecs',
  33. name,
  34. fname
  35. )
  36. return d
  37. class MainKernelSpecHandler(IPythonHandler):
  38. SUPPORTED_METHODS = ('GET',)
  39. @web.authenticated
  40. @json_errors
  41. def get(self):
  42. ksm = self.kernel_spec_manager
  43. km = self.kernel_manager
  44. model = {}
  45. model['default'] = km.default_kernel_name
  46. model['kernelspecs'] = specs = {}
  47. for kernel_name in ksm.find_kernel_specs():
  48. try:
  49. d = kernelspec_model(self, kernel_name)
  50. except Exception:
  51. self.log.error("Failed to load kernel spec: '%s'", kernel_name, exc_info=True)
  52. continue
  53. specs[kernel_name] = d
  54. self.set_header("Content-Type", 'application/json')
  55. self.finish(json.dumps(model))
  56. class KernelSpecHandler(IPythonHandler):
  57. SUPPORTED_METHODS = ('GET',)
  58. @web.authenticated
  59. @json_errors
  60. def get(self, kernel_name):
  61. try:
  62. model = kernelspec_model(self, kernel_name)
  63. except KeyError:
  64. raise web.HTTPError(404, u'Kernel spec %s not found' % kernel_name)
  65. self.set_header("Content-Type", 'application/json')
  66. self.finish(json.dumps(model))
  67. # URL to handler mappings
  68. kernel_name_regex = r"(?P<kernel_name>\w+)"
  69. default_handlers = [
  70. (r"/api/kernelspecs", MainKernelSpecHandler),
  71. (r"/api/kernelspecs/%s" % kernel_name_regex, KernelSpecHandler),
  72. ]