utils.ts 5.3 KB

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