utils.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import json2html = require('json-to-html');
  4. import {
  5. simulate
  6. } from 'simulate-event';
  7. import {
  8. ServiceManager
  9. } from '@jupyterlab/services';
  10. import {
  11. ClientSession
  12. } from '@jupyterlab/apputils';
  13. import {
  14. nbformat, uuid
  15. } from '@jupyterlab/coreutils';
  16. import {
  17. TextModelFactory, DocumentRegistry, Context
  18. } from '@jupyterlab/docregistry';
  19. import {
  20. INotebookModel, NotebookModelFactory
  21. } from '@jupyterlab/notebook';
  22. import {
  23. IRenderMime, RenderMime, TextRendererFactory, RenderedHTML
  24. } from '@jupyterlab/rendermime';
  25. /**
  26. * Get a copy of the default rendermime instance.
  27. */
  28. export
  29. function defaultRenderMime(): RenderMime {
  30. return Private.rendermime.clone();
  31. }
  32. /**
  33. * Create a client session object.
  34. */
  35. export
  36. function createClientSession(options: Partial<ClientSession.IOptions> = {}): Promise<ClientSession> {
  37. let manager = options.manager || Private.manager.sessions;
  38. return manager.ready.then(() => {
  39. return new ClientSession({
  40. manager,
  41. path: options.path || uuid(),
  42. name: options.name,
  43. type: options.type,
  44. kernelPreference: options.kernelPreference || {
  45. shouldStart: true,
  46. canStart: true,
  47. name: manager.specs.default
  48. }
  49. });
  50. });
  51. }
  52. /**
  53. * Create a context for a file.
  54. */
  55. export
  56. function createFileContext(path?: string, manager?: ServiceManager.IManager): Context<DocumentRegistry.IModel> {
  57. manager = manager || Private.manager;
  58. let factory = Private.textFactory;
  59. path = path || uuid() + '.txt';
  60. return new Context({ manager, factory, path });
  61. }
  62. /**
  63. * Create a context for a notebook.
  64. */
  65. export
  66. function createNotebookContext(path?: string, manager?: ServiceManager.IManager): Promise<Context<INotebookModel>> {
  67. manager = manager || Private.manager;
  68. return manager.ready.then(() => {
  69. let factory = Private.notebookFactory;
  70. path = path || uuid() + '.ipynb';
  71. return new Context({
  72. manager, factory, path, kernelPreference: { name: manager.specs.default }
  73. });
  74. });
  75. }
  76. /**
  77. * Wait for a dialog to be attached to an element.
  78. */
  79. export
  80. function waitForDialog(host: HTMLElement = document.body): Promise<void> {
  81. return new Promise<void>((resolve, reject) => {
  82. let refresh = () => {
  83. let node = host.getElementsByClassName('jp-Dialog')[0];
  84. if (node) {
  85. resolve(void 0);
  86. return;
  87. }
  88. setTimeout(refresh, 10);
  89. };
  90. refresh();
  91. });
  92. }
  93. /**
  94. * Accept a dialog after it is attached by accepting the default button.
  95. */
  96. export
  97. function acceptDialog(host: HTMLElement = document.body): Promise<void> {
  98. return waitForDialog(host).then(() => {
  99. let node = host.getElementsByClassName('jp-Dialog')[0];
  100. if (node) {
  101. simulate(node as HTMLElement, 'keydown', { keyCode: 13 });
  102. }
  103. });
  104. }
  105. /**
  106. * Dismiss a dialog after it is attached.
  107. */
  108. export
  109. function dismissDialog(host: HTMLElement = document.body): Promise<void> {
  110. return waitForDialog(host).then(() => {
  111. let node = host.getElementsByClassName('jp-Dialog')[0];
  112. if (node) {
  113. simulate(node as HTMLElement, 'keydown', { keyCode: 27 });
  114. }
  115. });
  116. }
  117. /**
  118. * A namespace for private data.
  119. */
  120. namespace Private {
  121. export
  122. const manager = new ServiceManager();
  123. export
  124. const textFactory = new TextModelFactory();
  125. export
  126. const notebookFactory = new NotebookModelFactory({});
  127. class JSONRenderer extends RenderedHTML {
  128. mimeType = 'text/html';
  129. renderModel(model: IRenderMime.IMimeModel): Promise<void> {
  130. let source = model.data['application/json'];
  131. model.setData({ data: { 'text/html': json2html(source) } });
  132. return super.renderModel(model);
  133. }
  134. }
  135. class JSONRendererFactory extends TextRendererFactory {
  136. mimeTypes = ['application/json'];
  137. createRenderer(options: IRenderMime.IRendererOptions): IRenderMime.IRendererWidget {
  138. return new JSONRenderer(options);
  139. }
  140. }
  141. const initialFactories = RenderMime.getDefaultFactories();
  142. export
  143. const rendermime = new RenderMime({ initialFactories });
  144. rendermime.addFactory(new JSONRendererFactory(), 'application/json');
  145. }
  146. /**
  147. * The default outputs used for testing.
  148. */
  149. export
  150. const DEFAULT_OUTPUTS: nbformat.IOutput[] = [
  151. {
  152. name: 'stdout',
  153. output_type: 'stream',
  154. text: [
  155. 'hello world\n',
  156. '0\n',
  157. '1\n',
  158. '2\n'
  159. ]
  160. },
  161. {
  162. name: 'stderr',
  163. output_type: 'stream',
  164. text: [
  165. 'output to stderr\n'
  166. ]
  167. },
  168. {
  169. name: 'stderr',
  170. output_type: 'stream',
  171. text: [
  172. 'output to stderr2\n'
  173. ]
  174. },
  175. {
  176. output_type: 'execute_result',
  177. execution_count: 1,
  178. data: { 'text/plain': 'foo' },
  179. metadata: {}
  180. },
  181. {
  182. output_type: 'display_data',
  183. data: { 'text/plain': 'hello, world' },
  184. metadata: {}
  185. },
  186. {
  187. output_type: 'error',
  188. ename: 'foo',
  189. evalue: 'bar',
  190. traceback: ['fizz', 'buzz']
  191. }
  192. ];