├── binder ├── runtime.txt ├── requirements.txt └── postBuild ├── jupyterlab_templates ├── _version.py ├── extension │ ├── jupyterlab_templates.json │ ├── install.json │ └── notebook_templates │ │ └── jupyterlab_templates │ │ └── Sample.ipynb ├── tests │ ├── __init__.py │ ├── test_all.py │ ├── test_init.py │ └── test_extension.py ├── __init__.py ├── templates │ └── jupyterlab_templates │ │ └── Sample.ipynb └── extension.py ├── js ├── icon.png ├── tests │ ├── styleMock.js │ ├── fileMock.js │ ├── setup.js │ ├── assetsTransformer.js │ ├── activate.test.js │ └── export.test.js ├── babel.config.js ├── style │ ├── icon.svg │ └── index.css ├── jest.config.js ├── .eslintrc.js ├── package.json └── src │ └── index.js ├── docs ├── logo.png └── example1.gif ├── setup.py ├── .gitattributes ├── .github ├── CODE_OF_CONDUCT.md ├── dependabot.yml ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── workflows │ ├── license-scanning.yml │ └── build.yml ├── NOTICE ├── AUTHORS ├── .bumpversion.cfg ├── MANIFEST.in ├── GOVERNANCE.md ├── .gitignore ├── Makefile ├── pyproject.toml ├── CONTRIBUTING.md ├── README.md └── LICENSE /binder/runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.9 -------------------------------------------------------------------------------- /jupyterlab_templates/_version.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.5.2" 2 | -------------------------------------------------------------------------------- /binder/requirements.txt: -------------------------------------------------------------------------------- 1 | jupyterlab_templates==0.5.2 2 | jupyterlab>=4,<5 3 | -------------------------------------------------------------------------------- /binder/postBuild: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | jupyter server extension enable --py jupyterlab 3 | -------------------------------------------------------------------------------- /js/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timkpaine/jupyterlab_templates/HEAD/js/icon.png -------------------------------------------------------------------------------- /docs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timkpaine/jupyterlab_templates/HEAD/docs/logo.png -------------------------------------------------------------------------------- /docs/example1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timkpaine/jupyterlab_templates/HEAD/docs/example1.gif -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # setup.py shim for use with applications that require it. 2 | __import__("setuptools").setup() 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | docs/* linguist-documentation 2 | 3 | *.ipynb linguist-documentation 4 | 5 | *.js text eol=lf 6 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct for jupyterlab_templates 2 | 3 | Please see the [Community Code of Conduct](https://www.finos.org/code-of-conduct). 4 | -------------------------------------------------------------------------------- /jupyterlab_templates/extension/jupyterlab_templates.json: -------------------------------------------------------------------------------- 1 | { 2 | "ServerApp": { 3 | "jpserver_extensions": { 4 | "jupyterlab_templates": true 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | jupyterlab_templates - FINOS 2 | Copyright 2020 - the jupyterlab_templates authors - info@finos.org 3 | 4 | This product includes software developed at the Fintech Open Source Foundation (https://www.finos.org/). 5 | -------------------------------------------------------------------------------- /jupyterlab_templates/extension/install.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageManager": "python", 3 | "packageName": "jupyterlab_templates", 4 | "uninstallInstructions": "Use your Python package manager (pip, conda, etc.) to uninstall the package jupyterlab_templates" 5 | } -------------------------------------------------------------------------------- /jupyterlab_templates/tests/__init__.py: -------------------------------------------------------------------------------- 1 | # ***************************************************************************** 2 | # 3 | # Copyright (c) 2020, the jupyterlab_templates authors. 4 | # 5 | # This file is part of the jupyterlab_templates library, distributed under the terms of 6 | # the Apache License 2.0. The full license can be found in the LICENSE file. 7 | # 8 | -------------------------------------------------------------------------------- /js/tests/styleMock.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2020, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | module.exports = {}; 10 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | # This is the official list of jupyterlab_templates authors for copyright purposes. 2 | 3 | Tim Paine 4 | Max Klein 5 | James Young 6 | Vidar Tonaas Fauske 7 | Chris Ball 8 | Francesco Battaglia 9 | Thoralf Gutierrez 10 | Samuel Young 11 | ajyeager 12 | Peter Law 13 | -------------------------------------------------------------------------------- /js/tests/fileMock.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2020, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | module.exports = "test-file-stub"; 10 | -------------------------------------------------------------------------------- /jupyterlab_templates/tests/test_all.py: -------------------------------------------------------------------------------- 1 | # ***************************************************************************** 2 | # 3 | # Copyright (c) 2020, the jupyterlab_templates authors. 4 | # 5 | # This file is part of the jupyterlab_templates library, distributed under the terms of 6 | # the Apache License 2.0. The full license can be found in the LICENSE file. 7 | # 8 | # for Coverage 9 | from jupyterlab_templates import * # noqa: F401, F403 10 | from jupyterlab_templates.extension import * # noqa: F401, F403 11 | -------------------------------------------------------------------------------- /js/tests/setup.js: -------------------------------------------------------------------------------- 1 | Object.defineProperty(window, "DragEvent", { 2 | value: class DragEvent {}, 3 | }); 4 | 5 | Object.defineProperty(window, "matchMedia", { 6 | writable: true, 7 | value: jest.fn().mockImplementation((query) => ({ 8 | matches: false, 9 | media: query, 10 | onchange: null, 11 | addListener: jest.fn(), // Deprecated 12 | removeListener: jest.fn(), // Deprecated 13 | addEventListener: jest.fn(), 14 | removeEventListener: jest.fn(), 15 | dispatchEvent: jest.fn(), 16 | })), 17 | }); 18 | -------------------------------------------------------------------------------- /js/tests/assetsTransformer.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2020, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | import {basename} from "path"; 10 | 11 | export function process(src, filename) { 12 | return `module.exports = ${JSON.stringify(basename(filename))};`; 13 | } 14 | -------------------------------------------------------------------------------- /js/babel.config.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2021, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | 10 | module.exports = { 11 | presets: [ 12 | [ 13 | "@babel/preset-env", 14 | { 15 | targets: { 16 | node: "current", 17 | }, 18 | }, 19 | ], 20 | ], 21 | }; 22 | -------------------------------------------------------------------------------- /js/tests/activate.test.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2020, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | import "isomorphic-fetch"; 10 | 11 | import {_activate} from "../src/index"; 12 | 13 | describe("Checks activate", () => { 14 | test("Check activate", () => { 15 | expect(_activate); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /js/tests/export.test.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2020, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | import "isomorphic-fetch"; 10 | 11 | import * as extension from "../src/index"; 12 | 13 | describe("Checks exports", () => { 14 | test("Check extension", () => { 15 | expect(extension); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | labels: 8 | - "part: github_actions" 9 | 10 | - package-ecosystem: "pip" 11 | directory: "/" 12 | schedule: 13 | interval: "monthly" 14 | labels: 15 | - "lang: python" 16 | - "part: dependencies" 17 | 18 | - package-ecosystem: "npm" 19 | directory: "/" 20 | schedule: 21 | interval: "monthly" 22 | labels: 23 | - "lang: javascript" 24 | - "part: dependencies" 25 | -------------------------------------------------------------------------------- /js/style/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jupyterlab_templates/tests/test_init.py: -------------------------------------------------------------------------------- 1 | # ***************************************************************************** 2 | # 3 | # Copyright (c) 2020, the jupyterlab_templates authors. 4 | # 5 | # This file is part of the jupyterlab_templates library, distributed under the terms of 6 | # the Apache License 2.0. The full license can be found in the LICENSE file. 7 | # 8 | # for Coverage 9 | from jupyterlab_templates import _jupyter_server_extension_paths 10 | 11 | 12 | class TestInit: 13 | def test__jupyter_server_extension_paths(self): 14 | assert _jupyter_server_extension_paths() == [{"module": "jupyterlab_templates.extension"}] 15 | -------------------------------------------------------------------------------- /.bumpversion.cfg: -------------------------------------------------------------------------------- 1 | [bumpversion] 2 | current_version = 0.5.2 3 | commit = True 4 | tag = False 5 | 6 | [bumpversion:file:jupyterlab_templates/_version.py] 7 | search = __version__ = "{current_version}" 8 | replace = __version__ = "{new_version}" 9 | 10 | [bumpversion:file:pyproject.toml] 11 | search = version = "{current_version}" 12 | replace = version = "{new_version}" 13 | 14 | [bumpversion:file:js/package.json] 15 | search = "version": "{current_version}" 16 | replace = "version": "{new_version}" 17 | 18 | [bumpversion:file:binder/requirements.txt] 19 | search = jupyterlab_templates=={current_version} 20 | replace = jupyterlab_templates=={new_version} 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /jupyterlab_templates/__init__.py: -------------------------------------------------------------------------------- 1 | # ***************************************************************************** 2 | # 3 | # Copyright (c) 2020, the jupyterlab_templates authors. 4 | # 5 | # This file is part of the jupyterlab_templates library, distributed under the terms of 6 | # the Apache License 2.0. The full license can be found in the LICENSE file. 7 | # 8 | from ._version import __version__ # noqa: F401 9 | from .extension import load_jupyter_server_extension # noqa: F401 10 | 11 | 12 | def _jupyter_server_extension_paths(): 13 | return [{"module": "jupyterlab_templates.extension"}] 14 | 15 | 16 | def _jupyter_server_extension_points(): 17 | return [{"module": "jupyterlab_templates.extension"}] 18 | -------------------------------------------------------------------------------- /jupyterlab_templates/tests/test_extension.py: -------------------------------------------------------------------------------- 1 | # ***************************************************************************** 2 | # 3 | # Copyright (c) 2020, the jupyterlab_templates authors. 4 | # 5 | # This file is part of the jupyterlab_templates library, distributed under the terms of 6 | # the Apache License 2.0. The full license can be found in the LICENSE file. 7 | # 8 | # for Coverage 9 | from unittest.mock import MagicMock 10 | from jupyterlab_templates.extension import load_jupyter_server_extension 11 | 12 | 13 | class TestExtension: 14 | def test_load_jupyter_server_extension(self): 15 | m = MagicMock() 16 | 17 | m.web_app.settings = {} 18 | m.web_app.settings["base_url"] = "/test" 19 | load_jupyter_server_extension(m) 20 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.md 3 | 4 | include pyproject.toml 5 | 6 | graft jupyterlab_templates 7 | graft jupyterlab_templates/extension 8 | graft jupyterlab_templates/labextension 9 | 10 | # grab js 11 | graft js 12 | prune js/coverage 13 | prune js/dist 14 | prune js/docs 15 | prune js/lib 16 | prune js/node_modules 17 | prune js/yarn.lock 18 | 19 | # get rid of binder 20 | prune binder 21 | 22 | # get rid of docs 23 | prune docs 24 | exclude CONTRIBUTING.md 25 | exclude GOVERNANCE.md 26 | 27 | # get rid of dev tools 28 | exclude .bumpversion.cfg 29 | exclude Makefile 30 | 31 | # get rid of test and lint artifacts 32 | prune .pytest_cache 33 | prune .ruff_cache 34 | prune .mypy_cache 35 | 36 | # Patterns to exclude from any directory 37 | global-exclude *~ 38 | global-exclude *.pyc 39 | global-exclude *.pyo 40 | global-exclude .git 41 | global-exclude .ipynb_checkpoints 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /js/jest.config.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2021, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | const esModules = [ 10 | "@finos", 11 | "@jupyter", 12 | "@jupyterlab", 13 | "@jupyter-widgets", 14 | "@microsoft", 15 | "@rjsf", 16 | "delaunator", 17 | "exenv-es6", 18 | "internmap", 19 | "lib0", 20 | "lodash-es", 21 | "nanoid", 22 | "robust-predicates", 23 | "y-protocols", 24 | ].join("|"); 25 | 26 | module.exports = { 27 | moduleDirectories: ["node_modules", "src", "tests"], 28 | moduleNameMapper: { 29 | "\\.(css|less|sass|scss)$": "/tests/styleMock.js", 30 | "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/tests/fileMock.js", 31 | }, 32 | reporters: [ "default", "jest-junit" ], 33 | setupFiles: ["/tests/setup.js"], 34 | testEnvironment: "jsdom", 35 | transform: { 36 | "^.+\\.jsx?$": "babel-jest", 37 | ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css", 38 | }, 39 | transformIgnorePatterns: [`/node_modules/(?!(${esModules}))`], 40 | }; 41 | -------------------------------------------------------------------------------- /.github/workflows/license-scanning.yml: -------------------------------------------------------------------------------- 1 | name: License Scanning 2 | 3 | on: 4 | push: 5 | paths: 6 | - 'js/package.json' 7 | - 'js/yarn.lock' 8 | - '.github/workflows/license-scanning.yml' 9 | - 'pyproject.toml' 10 | 11 | env: 12 | ALLOW_LICENSES: "MIT;Apache License 2.0" 13 | 14 | jobs: 15 | license-scan: 16 | name: license-scan 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: actions/checkout@v5 20 | - name: Use Node.js 16.x 21 | uses: actions/setup-node@v5 22 | with: 23 | node-version: 16.x 24 | - name: Build node using yarn 25 | run: yarn install --production --frozen-lockfile 26 | working-directory: js 27 | - name: Install node-license-validator 28 | run: npm install -g node-license-validator 29 | working-directory: js 30 | - name: Run node-license-validator 31 | run: node-license-validator . --allow-licenses Apache-2.0 MIT BSD-2-Clause BSD BSD-3-Clause Unlicense ISC 32 | working-directory: js 33 | - name: Use Python 3.10 34 | uses: actions/setup-python@v6 35 | with: 36 | python-version: "3.10" 37 | - name: Install pip-licenses 38 | run: pip3 install pip-licenses 39 | - name: Run pip-licenses 40 | run: pip-licenses --allow-only="${{ env.ALLOW_LICENSES }}" # --ignore-packages="${{ env.IGNORE_PACKAGES }}" 41 | -------------------------------------------------------------------------------- /jupyterlab_templates/templates/jupyterlab_templates/Sample.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Sample Template" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Here is some sample text, and a first block of code" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "# insert code here\n", 24 | "\n" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "## A second heading" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "and some more text" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [] 47 | } 48 | ], 49 | "metadata": { 50 | "kernelspec": { 51 | "display_name": "Python 3", 52 | "language": "python", 53 | "name": "python3" 54 | }, 55 | "language_info": { 56 | "codemirror_mode": { 57 | "name": "ipython", 58 | "version": 3 59 | }, 60 | "file_extension": ".py", 61 | "mimetype": "text/x-python", 62 | "name": "python", 63 | "nbconvert_exporter": "python", 64 | "pygments_lexer": "ipython3", 65 | "version": "3.6.4" 66 | } 67 | }, 68 | "nbformat": 4, 69 | "nbformat_minor": 2 70 | } 71 | -------------------------------------------------------------------------------- /jupyterlab_templates/extension/notebook_templates/jupyterlab_templates/Sample.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Sample Template" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Here is some sample text, and a first block of code" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "# insert code here\n", 24 | "\n" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "## A second heading" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "and some more text" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [] 47 | } 48 | ], 49 | "metadata": { 50 | "kernelspec": { 51 | "display_name": "Python 3", 52 | "language": "python", 53 | "name": "python3" 54 | }, 55 | "language_info": { 56 | "codemirror_mode": { 57 | "name": "ipython", 58 | "version": 3 59 | }, 60 | "file_extension": ".py", 61 | "mimetype": "text/x-python", 62 | "name": "python", 63 | "nbconvert_exporter": "python", 64 | "pygments_lexer": "ipython3", 65 | "version": "3.6.4" 66 | } 67 | }, 68 | "nbformat": 4, 69 | "nbformat_minor": 2 70 | } 71 | -------------------------------------------------------------------------------- /GOVERNANCE.md: -------------------------------------------------------------------------------- 1 | # FINOS Governance Policies 2 | 3 | ## Roles 4 | 5 | The project community consists of Contributors and Maintainers: 6 | * A **Contributor** is anyone who submits a contribution to the project 7 | * A **Maintainer** is a Contributor who, by virtue of their contribution history, has been given write access to project repositories and may merge approved contributions 8 | 9 | One maintainer will interface with FINOS on behalf of the team, and will approve [quarterly project reports](https://community.finos.org/docs/governance/#project-governing-board-reporting) 10 | 11 | ## Contribution Rules 12 | 13 | Anyone is welcome to submit a contribution to the project. The rules below apply to all contributions: 14 | 15 | * All contributions must be submitted as pull requests 16 | * All pull requests should be reviewed by a maintainer before being merged 17 | * Pull requests for non-trivial contributions should be discussed and reviewed amongst maintainers 18 | * Approved pull requests can be merged by any maintainer 19 | * In cases of disputes, maintainers can call for a vote 20 | 21 | ## Maintainer Voting 22 | 23 | If consensus can't be reached on an issue, maintainers can call for a vote where majority rules. In the event of a tie, the most senior active maintainer (as defined by duration from first contribution) will be the tie breaker. 24 | 25 | ## Maintainer Qualifications 26 | 27 | Maintainers can be added or removed via the voting process above. Prospective maintainers (or nominators) should open an issue on the project. No vote is required for an existing maintainer to relinquish their maintainer status. 28 | 29 | ## Changes to this Document 30 | 31 | This document can be altered via pull request, subject to the above rules. 32 | -------------------------------------------------------------------------------- /js/.eslintrc.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2021, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | 10 | module.exports = { 11 | parser: "@babel/eslint-parser", 12 | extends: ["airbnb-base", "prettier", "plugin:json/recommended"], 13 | plugins: ["prettier", "jest"], 14 | env: { 15 | browser: true, 16 | commonjs: true, 17 | es6: true, 18 | node: true, 19 | jasmine: true, 20 | jest: true, 21 | "jest/globals": true, 22 | }, 23 | parserOptions: { 24 | ecmaVersion: 2017, 25 | ecmaFeatures: {}, 26 | sourceType: "module", 27 | experimentalObjectRestSpread: true, 28 | }, 29 | rules: { 30 | "prettier/prettier": [ 31 | "error", 32 | { 33 | printWidth: 200, 34 | tabWidth: 2, 35 | bracketSpacing: false, 36 | }, 37 | ], 38 | "max-len": [ 39 | "warn", 40 | { 41 | code: 200, 42 | comments: 200, 43 | ignoreTrailingComments: true, 44 | }, 45 | ], 46 | camelcase: "off", 47 | "class-methods-use-this": "off", 48 | "constructor-super": "error", 49 | indent: "off", 50 | "linebreak-style": ["error", "unix"], 51 | "no-const-assign": "error", 52 | "no-nested-ternary": "warn", 53 | "no-this-before-super": "error", 54 | "no-undef": "error", 55 | "no-underscore-dangle": "off", 56 | "no-unreachable": "error", 57 | "no-unused-vars": "warn", 58 | "object-curly-spacing": "off", 59 | quotes: "off", 60 | "spaced-comment": "off", 61 | "valid-typeof": "error", 62 | 63 | "import/no-unresolved": "off", 64 | "import/prefer-default-export": "off", 65 | "import/no-extraneous-dependencies": "off", 66 | }, 67 | }; 68 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Status 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - v* 9 | paths-ignore: 10 | - docs/ 11 | - CONTRIBUTING.md 12 | - LICENSE 13 | - README.md 14 | pull_request: 15 | workflow_dispatch: 16 | 17 | concurrency: 18 | group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} 19 | cancel-in-progress: true 20 | 21 | permissions: 22 | checks: write 23 | pull-requests: write 24 | 25 | jobs: 26 | build: 27 | runs-on: ${{ matrix.os }} 28 | 29 | strategy: 30 | matrix: 31 | os: [ubuntu-latest, macos-latest, windows-latest] 32 | python-version: [3.9] 33 | node-version: [16.x] 34 | 35 | steps: 36 | - uses: actions/checkout@v5 37 | 38 | - name: Set up Python ${{ matrix.python-version }} 39 | uses: actions/setup-python@v6 40 | with: 41 | python-version: ${{ matrix.python-version }} 42 | cache: "pip" 43 | cache-dependency-path: 'setup.py' 44 | 45 | - name: Use Node.js ${{ matrix.node-version }} 46 | uses: actions/setup-node@v5 47 | with: 48 | node-version: ${{ matrix.node-version }} 49 | cache: 'yarn' 50 | cache-dependency-path: js/yarn.lock 51 | 52 | - name: Install yarn 53 | run: npm install -g yarn 54 | 55 | - name: Install dependencies 56 | run: | 57 | make develop 58 | 59 | - name: Build 60 | run: | 61 | make build 62 | 63 | - name: Lint 64 | run: | 65 | make lint 66 | 67 | - name: Checks 68 | run: | 69 | make checks 70 | if: ${{ matrix.os == 'ubuntu-latest' }} 71 | 72 | - name: Test 73 | run: | 74 | make tests 75 | if: ${{ matrix.os == 'ubuntu-latest' }} 76 | 77 | - name: Upload test results (Python) 78 | uses: actions/upload-artifact@v4 79 | with: 80 | name: py-test-results-${{ matrix.os }}-${{ matrix.python-version }} 81 | path: junit.xml 82 | if: ${{ always() }} 83 | 84 | - name: Upload test results (JS) 85 | uses: actions/upload-artifact@v4 86 | with: 87 | name: js-test-results-${{ matrix.os }}-${{ matrix.python-version }} 88 | path: js/junit.xml 89 | if: ${{ always() }} 90 | 91 | - name: Publish Unit Test Results 92 | uses: EnricoMi/publish-unit-test-result-action@v2 93 | with: 94 | files: | 95 | **/junit.xml 96 | if: ${{ matrix.os == 'ubuntu-latest' }} 97 | 98 | - name: Upload coverage 99 | uses: codecov/codecov-action@v5 100 | 101 | - name: Twine check 102 | run: | 103 | make dist 104 | 105 | -------------------------------------------------------------------------------- /js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jupyterlab_templates", 3 | "version": "0.5.2", 4 | "description": "Notebook templates", 5 | "author": "the jupyterlab_templates authors", 6 | "main": "lib/index.js", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/finos/jupyterlab_templates.git" 10 | }, 11 | "license": "Apache-2.0", 12 | "keywords": [ 13 | "jupyter", 14 | "jupyterlab", 15 | "jupyterlab-extension", 16 | "templates", 17 | "finos" 18 | ], 19 | "scripts": { 20 | "build:babel": "babel src/ --source-maps --out-dir lib/", 21 | "build:lab": "rimraf ../jupyterlab_templates/labextension && jupyter labextension build .", 22 | "build": "npm-run-all clean build:*", 23 | "check-security": "auditjs-screener 5", 24 | "clean": "rimraf lib", 25 | "fix": "yarn lint --fix", 26 | "lint": "eslint -c .eslintrc.js --ext .js src/ tests/", 27 | "prepublishOnly": "npm run build", 28 | "test": "jest --coverage --collectCoverageFrom=src/*.{js}" 29 | }, 30 | "files": [ 31 | "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", 32 | "style/**/*.css" 33 | ], 34 | "jupyterlab": { 35 | "extension": "lib/index.js", 36 | "outputDir": "../jupyterlab_templates/labextension", 37 | "discovery": { 38 | "server": { 39 | "base": { 40 | "name": "jupyterlab_templates" 41 | }, 42 | "managers": [ 43 | "pip" 44 | ] 45 | } 46 | } 47 | }, 48 | "dependencies": { 49 | "@jupyterlab/application": "^4.1.5", 50 | "@jupyterlab/apputils": "^4.2.5", 51 | "@jupyterlab/filebrowser": "^4.1.5", 52 | "@jupyterlab/launcher": "^4.1.5", 53 | "@jupyterlab/mainmenu": "^4.1.5", 54 | "@jupyterlab/notebook": "^4.1.5", 55 | "@jupyterlab/services": "^7.1.5", 56 | "@lumino/disposable": "^2.1.2" 57 | }, 58 | "devDependencies": { 59 | "@babel/cli": "^7.24.1", 60 | "@babel/core": "^7.24.3", 61 | "@babel/eslint-parser": "^7.24.1", 62 | "@babel/preset-env": "^7.24.3", 63 | "@jupyterlab/builder": "^4.1.5", 64 | "auditjs": "^4.0.45", 65 | "auditjs-screener": "^0.1.1", 66 | "babel-jest": "^29.7.0", 67 | "eslint": "^8.57.0", 68 | "eslint-config-airbnb": "^19.0.4", 69 | "eslint-config-airbnb-base": "^15.0.0", 70 | "eslint-config-prettier": "^9.1.0", 71 | "eslint-plugin-import": "^2.29.1", 72 | "eslint-plugin-jest": "^27.9.0", 73 | "eslint-plugin-json": "^3.1.0", 74 | "eslint-plugin-prettier": "^5.1.3", 75 | "isomorphic-fetch": "^3.0.0", 76 | "jest": "^29.7.0", 77 | "jest-environment-jsdom": "^29.7.0", 78 | "jest-junit": "^16.0.0", 79 | "jest-transform-css": "^6.0.1", 80 | "mkdirp": "^3.0.1", 81 | "npm-run-all": "^4.1.5", 82 | "prettier": "^3.2.5", 83 | "rimraf": "^5.0.5" 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | python_junit.xml 44 | junit.xml 45 | nosetests.xml 46 | coverage.xml 47 | *,cover 48 | .hypothesis/ 49 | .pytest_cache 50 | .ruff_cache 51 | 52 | # Translations 53 | *.mo 54 | *.pot 55 | 56 | # Django stuff: 57 | *.log 58 | local_settings.py 59 | 60 | # Flask instance folder 61 | instance/ 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | docs/source 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # IPython Notebook 74 | .ipynb_checkpoints 75 | .autoversion 76 | 77 | # pyenv 78 | .python-version 79 | 80 | # celery beat schedule file 81 | celerybeat-schedule 82 | 83 | # dotenv 84 | .env 85 | 86 | # virtualenv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | 93 | # Rope project settings 94 | .ropeproject 95 | 96 | # ========================= 97 | # Operating System Files 98 | # ========================= 99 | 100 | # OSX 101 | # ========================= 102 | 103 | .DS_Store 104 | .AppleDouble 105 | .LSOverride 106 | 107 | # Thumbnails 108 | ._* 109 | 110 | # Files that might appear in the root of a volume 111 | .DocumentRevisions-V100 112 | .fseventsd 113 | .Spotlight-V100 114 | .TemporaryItems 115 | .Trashes 116 | .VolumeIcon.icns 117 | 118 | # Directories potentially created on remote AFP share 119 | .AppleDB 120 | .AppleDesktop 121 | Network Trash Folder 122 | Temporary Items 123 | .apdisk 124 | 125 | # Windows 126 | # ========================= 127 | 128 | # Windows image file caches 129 | Thumbs.db 130 | ehthumbs.db 131 | 132 | # Folder config file 133 | Desktop.ini 134 | 135 | # Recycle Bin used on file shares 136 | $RECYCLE.BIN/ 137 | 138 | # Windows Installer files 139 | *.cab 140 | *.msi 141 | *.msm 142 | *.msp 143 | 144 | # Windows shortcuts 145 | *.lnk 146 | 147 | 148 | # NPM 149 | # ---- 150 | **/node_modules/ 151 | 152 | # Coverage data 153 | # ------------- 154 | **/coverage/ 155 | 156 | # Notebook and lab extensions 157 | jupyterlab_templates/labextension/*.tgz 158 | jupyterlab_templates/labextension 159 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ############### 2 | # Build Tools # 3 | ############### 4 | build: ## build python/javascript 5 | python -m build . 6 | 7 | develop: ## install to site-packages in editable mode 8 | python -m pip install --upgrade build pip setuptools twine wheel 9 | cd js; yarn 10 | python -m pip install -e .[develop] 11 | 12 | install: ## install to site-packages 13 | python -m pip install . 14 | 15 | ########### 16 | # Testing # 17 | ########### 18 | testpy: ## run python unit tests 19 | python -m pytest -v jupyterlab_templates/tests --junitxml=junit.xml --cov=jupyterlab_templates --cov-report=xml:.coverage.xml --cov-branch --cov-fail-under=20 --cov-report term-missing 20 | 21 | testjs: ## run javascript unit tests 22 | cd js; yarn test 23 | 24 | test: tests 25 | tests: testpy testjs ## run all tests 26 | 27 | ########### 28 | # Linting # 29 | ########### 30 | lintpy: ## lint python with ruff 31 | python -m ruff check jupyterlab_templates setup.py 32 | 33 | lintjs: ## lint javascript with eslint 34 | cd js; yarn lint 35 | 36 | lint: lintpy lintjs ## run all linters 37 | 38 | fixpy: ## format python with ruff 39 | python -m ruff format jupyterlab_templates setup.py 40 | 41 | fixjs: ## format javascript with eslint 42 | cd js; yarn fix 43 | 44 | fix: fixpy fixjs ## run all autofixers 45 | format: fix 46 | 47 | ################# 48 | # Other Checks # 49 | ################# 50 | check: checks 51 | 52 | checks: check-manifest ## run security, packaging, and other checks 53 | 54 | check-manifest: ## run manifest checker for sdist 55 | check-manifest -v 56 | 57 | semgrep: ## run semgrep 58 | semgrep ci --config auto 59 | 60 | ################ 61 | # Distribution # 62 | ################ 63 | dist: clean build ## create dists 64 | python -m twine check dist/* 65 | 66 | publishpy: ## dist to pypi 67 | python -m twine upload dist/* --skip-existing 68 | 69 | publishjs: ## dist to npm 70 | cd js; npm publish || echo "can't publish - might already exist" 71 | 72 | publish: dist publishpy publishjs ## dist to pypi and npm 73 | 74 | ############ 75 | # Cleaning # 76 | ############ 77 | clean: ## clean the repository 78 | find . -name "__pycache__" | xargs rm -rf 79 | find . -name "*.pyc" | xargs rm -rf 80 | find . -name ".ipynb_checkpoints" | xargs rm -rf 81 | rm -rf .coverage coverage *.xml build dist *.egg-info lib node_modules .pytest_cache *.egg-info 82 | rm -rf jupyterlab_templates/labextension 83 | cd js && yarn clean 84 | git clean -fd 85 | 86 | ########### 87 | # Helpers # 88 | ########### 89 | # Thanks to Francoise at marmelab.com for this 90 | .DEFAULT_GOAL := help 91 | help: 92 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' 93 | 94 | print-%: 95 | @echo '$*=$($*)' 96 | 97 | .PHONY: testjs testpy tests test lintpy lintjs lint fixpy fixjs fix format checks check check-manifest semgrep build develop install labextension dist publishpy publishjs publish docs clean 98 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = [ 3 | "hatchling>=1.22.4,<1.28", 4 | "pkginfo>=1.10,<1.13", 5 | "jupyterlab>=4,<5", 6 | ] 7 | build-backend = "hatchling.build" 8 | 9 | [project] 10 | name = "jupyterlab_templates" 11 | description = "notebook templates for jupyterlab" 12 | version = "0.5.2" 13 | readme = "README.md" 14 | license = { file = "LICENSE" } 15 | requires-python = ">=3.7" 16 | authors = [ 17 | { name = "the jupyterlab_templates authors" }, 18 | ] 19 | keywords = [ 20 | "Jupyter", 21 | "JupyterLab", 22 | "JupyterLab Extension", 23 | "Templates", 24 | "FINOS", 25 | ] 26 | classifiers = [ 27 | "Development Status :: 4 - Beta", 28 | "Framework :: Jupyter", 29 | "Framework :: Jupyter :: JupyterLab", 30 | "Programming Language :: Python", 31 | "Programming Language :: Python :: 3", 32 | "Programming Language :: Python :: 3.7", 33 | "Programming Language :: Python :: 3.8", 34 | "Programming Language :: Python :: 3.9", 35 | "Programming Language :: Python :: 3.10", 36 | "Programming Language :: Python :: 3.11", 37 | "Programming Language :: Python :: 3.12", 38 | "License :: OSI Approved :: Apache Software License", 39 | ] 40 | dependencies = [ 41 | "jupyterlab>=4,<5", 42 | ] 43 | 44 | [project.optional-dependencies] 45 | develop = [ 46 | "check-manifest", 47 | "ruff>=0.5.0,<0.13", 48 | "pytest", 49 | "pytest-cov", 50 | "twine>=5,<6.2" 51 | ] 52 | test = [ 53 | "pytest", 54 | "pytest-cov", 55 | ] 56 | 57 | [project.urls] 58 | Repository = "https://github.com/finos/jupyterlab_templates" 59 | Homepage = "https://github.com/finos/jupyterlab_templates" 60 | 61 | [tool.check-manifest] 62 | ignore = [ 63 | "jupyterlab_templates/labextension/**", 64 | "js/**" 65 | ] 66 | 67 | [tool.hatch.build] 68 | artifacts = [ 69 | "jupyterlab_templates/labextension" 70 | ] 71 | 72 | [tool.hatch.build.targets.wheel.shared-data] 73 | "jupyterlab_templates/labextension" = "share/jupyter/labextensions/jupyterlab_templates" 74 | "jupyterlab_templates/extension/install.json" = "share/jupyter/labextensions/jupyterlab_templates/install.json" 75 | "jupyterlab_templates/extension/jupyterlab_templates.json" = "etc/jupyter/jupyter_server_config.d/jupyterlab_templates.json" 76 | "jupyterlab_templates/extension/notebook_templates" = "share/jupyter/notebook" 77 | 78 | [tool.hatch.build.targets.sdist] 79 | exclude = [ 80 | ".github", 81 | "binder", 82 | "docs", 83 | ] 84 | 85 | [tool.hatch.build.hooks.jupyter-builder] 86 | build-function = "hatch_jupyter_builder.npm_builder" 87 | ensured-targets = [ 88 | "jupyterlab_templates/labextension/package.json", 89 | ] 90 | skip-if-exists = [ 91 | "jupyterlab_templates/labextension/package.json", 92 | ] 93 | dependencies = [ 94 | "hatch-jupyter-builder>=0.5.0", 95 | ] 96 | 97 | [tool.hatch.build.hooks.jupyter-builder.build-kwargs] 98 | path = "js" 99 | build_cmd = "build" 100 | 101 | [tool.ruff] 102 | line-length = 120 103 | 104 | [tool.ruff.lint.per-file-ignores] 105 | "__init__.py" = ["F401"] 106 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thank you for your interest in contributing to `jupyterlab_templates`! 4 | 5 | `jupyterlab_templates` is built on open source and hosted by the Fintech Open Source Foundation (FINOS). We invite you to participate in our community by adding and commenting on [issues](https://github.com/finos/jupyterlab_templates/issues) (e.g., bug reports; new feature suggestions) or contributing code enhancements through a pull request. 6 | 7 | Note that commits and pull requests to FINOS repositories such as `jupyterlab_templates` may only be accepted from those contributors with a [Contributor License Agreement (CLA)](https://community.finos.org/docs/governance/Software-Projects/contribution-compliance-requirements) with FINOS. This may take the form of either: 8 | * an active, executed Individual Contributor License Agreement (ICLA) with FINOS, OR 9 | * coverage under an existing, active Corporate Contribution License Agreement (CCLA) executed with FINOS (most likely by the developer's employer). Please note that some, though not all, CCLAs require individuals/employees to be explicitly named on the CCLA. 10 | 11 | Commits from individuals not covered under an CLA can not be merged by `jupyterlab_templates`'s committers. We encourage you to check that you have a CLA in place well in advance of making your first pull request. 12 | 13 | Need an ICLA? Unsure if you are covered under an existing CCLA? Confused? Email [help@finos.org](mailto:help@finos.org) and the foundation team will help get it sorted out for you. 14 | 15 | If you have any general questions about contributing to `jupyterlab_templates`, please feel free to open an issue on [github](https://github.com/finos/jupyterlab_templates/issues/new), or email [help@finos.org](mailto:finos.org). 16 | 17 | ## Reporting bugs, feature requests, etc. 18 | 19 | To report bugs, request new features or similar, please open an issue on the Github 20 | repository. 21 | 22 | A good bug report includes: 23 | 24 | - Expected behavior 25 | - Actual behavior 26 | - Steps to reproduce (preferably as minimal as possible) 27 | - Possibly any output from the browser console (typically available via Ctrl + Shift + J or via F12). 28 | 29 | ## Minor changes, typos etc. 30 | 31 | Minor changes can be contributed by navigating to the relevant files on the Github repository, 32 | and clicking the "edit file" icon. By following the instructions on the page you should be able to 33 | create a pull-request proposing your changes. A repository maintainer will then review your changes, 34 | and either merge them, propose some modifications to your changes, or reject them (with a reason for 35 | the rejection). 36 | 37 | ## Setting up a development environment 38 | 39 | If you want to help resolve an issue by making some changes that are larger than that covered by the above paragraph, it is recommended that you: 40 | 41 | - Fork the repository on Github 42 | - Clone your fork to your computer 43 | - Run the following commands inside the cloned repository: 44 | - `pip install -e .[dev]` - This will install the Python package in development 45 | mode. 46 | - `jupyter labextension install .` - This will add the lab extension development 47 | mode. 48 | - Validate the install by running the tests: 49 | - `py.test` - This command will run the Python tests. 50 | - `yarn test` - This command will run the JS tests. 51 | 52 | Once you have such a development setup, you should: 53 | 54 | - Make the changes you consider necessary 55 | - Run the tests to ensure that your changes does not break anything 56 | - If you add new code, preferably write one or more tests for checking that your code works as expected. 57 | - Commit your changes and publish the branch to your github repo. 58 | - Open a pull-request (PR) back to the main repo on Github. 59 | 60 | ## Project Governance 61 | See [GOVERNANCE.md](./GOVERNANCE.md) 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | Support for jupyter notebook templates in jupyterlab 4 | 5 | [![Build Status](https://github.com/finos/jupyterlab_templates/workflows/Build%20Status/badge.svg?branch=main)](https://github.com/finos/jupyterlab_templates/actions?query=workflow%3A%22Build+Status%22) 6 | [![codecov](https://codecov.io/gh/finos/jupyterlab_templates/branch/main/graph/badge.svg)](https://codecov.io/gh/finos/jupyterlab_templates) 7 | [![PyPI](https://img.shields.io/pypi/l/jupyterlab_templates.svg)](https://pypi.python.org/pypi/jupyterlab_templates) 8 | [![PyPI](https://img.shields.io/pypi/v/jupyterlab_templates.svg)](https://pypi.python.org/pypi/jupyterlab_templates) 9 | [![npm](https://img.shields.io/npm/v/jupyterlab_templates.svg)](https://www.npmjs.com/package/jupyterlab_templates) 10 | [![FINOS Active](https://cdn.jsdelivr.net/gh/finos/contrib-toolbox@master/images/badge-active.svg)](https://community.finos.org/docs/governance/software-projects/stages/active/) 11 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/finos/jupyterlab_templates/main?urlpath=lab) 12 | 13 | ![](https://raw.githubusercontent.com/finos/jupyterlab_templates/main/docs/example1.gif) 14 | 15 | 16 | ## Install 17 | 18 | ### PyPI 19 | `jupyterlab_templates` is available on [PyPI](https://pypi.org/project/jupyterlab-templates/): 20 | 21 | ```bash 22 | pip install jupyterlab_templates 23 | ``` 24 | 25 | ### Conda 26 | `jupyterlab_templates` is also available on [conda-forge](https://github.com/conda-forge/jupyterlab_templates-feedstock): 27 | 28 | ```bash 29 | conda install -c conda-forge jupyterlab_templates 30 | ``` 31 | 32 | ### Jupyter Server/JupyterLab Extension 33 | ``` 34 | jupyter labextension install jupyterlab_templates 35 | jupyter server extension enable --py jupyterlab_templates 36 | ``` 37 | 38 | ## Adding templates 39 | install the server extension, and add the following to `jupyter_notebook_config.py` 40 | 41 | ```python3 42 | c.JupyterLabTemplates.allowed_extensions = ["*.ipynb"] 43 | c.JupyterLabTemplates.template_dirs = ['list', 'of', 'template', 'directories'] 44 | c.JupyterLabTemplates.include_default = True 45 | c.JupyterLabTemplates.include_core_paths = True 46 | c.JupyterLabTemplates.template_label = "Template" 47 | ``` 48 | 49 | ## Templates for libraries 50 | The extension will search *subdirectories* of each parent directory specified in `template_dirs` for templates. 51 | **Note!** Templates in the parent directories will be ignored. You must put the templates in *subdirectories*, in order to keep everything organized. 52 | 53 | If `include_default = True` the `notebook_templates` directory under the [jupyter data folder](https://jupyter.readthedocs.io/en/latest/use/jupyter-directories.html) is one of the default parent directories. Thus, if you have tutorials or guides you'd like to install for users, simply copy them into your jupyter data folder inside the `notebook_templates` directory, e.g. `/usr/local/share/jupyter/notebook_templates/bqplot` for `bqplot`. 54 | 55 | If you want to exclude templates from a specific directory, please add a file `.jupyterlab_templates_ignore` to to this location. 56 | All notebooks in this directory will be ignored (but has no effect on subdirectories). 57 | 58 | ### Flags 59 | - `allowed_extensions`: a list of extensions to allow templates for. (optional, default `["*.ipynb"]`) 60 | - `template_dirs`: a list of absolute directory paths. All files matching `allowed_extensions` in any *subdirectories* of these paths will be listed as templates 61 | - `include_default`: include the default Sample template (default True) 62 | - `include_core_paths`: include jupyter core paths (see: jupyter --paths) (default True) 63 | - `template_label`: set label for template UI icon (default "Template") 64 | 65 | 66 | ## Development 67 | 68 | See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines. 69 | 70 | 71 | ## License 72 | 73 | This software is licensed under the Apache 2.0 license. See the 74 | [LICENSE](LICENSE) and [AUTHORS](AUTHORS) files for details. 75 | -------------------------------------------------------------------------------- /jupyterlab_templates/extension.py: -------------------------------------------------------------------------------- 1 | # ***************************************************************************** 2 | # 3 | # Copyright (c) 2020, the jupyterlab_templates authors. 4 | # 5 | # This file is part of the jupyterlab_templates library, distributed under the terms of 6 | # the Apache License 2.0. The full license can be found in the LICENSE file. 7 | # 8 | import json 9 | import os 10 | import os.path 11 | import jupyter_core.paths 12 | import tornado.web 13 | 14 | from io import open 15 | from fnmatch import fnmatch 16 | from jupyter_server.base.handlers import JupyterHandler 17 | from jupyter_server.utils import url_path_join 18 | 19 | TEMPLATES_IGNORE_FILE = ".jupyterlab_templates_ignore" 20 | 21 | 22 | class TemplatesLoader: 23 | def __init__(self, template_dirs, allowed_extensions=None, template_label=None): 24 | self.template_dirs = template_dirs 25 | self.template_label = template_label or "Template" 26 | self.allowed_extensions = allowed_extensions or ["*.ipynb"] 27 | 28 | def get_templates(self): 29 | templates = {} 30 | template_by_path = {} 31 | 32 | for path in self.template_dirs: 33 | # in order to produce correct filenames, abspath should point to the parent directory of path 34 | abspath = os.path.abspath(os.path.join(os.path.realpath(path), os.pardir)) 35 | files = [] 36 | # get all files in subdirectories 37 | for dirname, _, filenames in os.walk(path, followlinks=True): 38 | if dirname == path: 39 | # Skip top level 40 | continue 41 | 42 | if TEMPLATES_IGNORE_FILE in filenames: 43 | # skip this very directory (subdirectories will still be considered) 44 | continue 45 | 46 | _files = [x for x in filenames if any(fnmatch(x, y) for y in self.allowed_extensions)] 47 | for filename in _files: 48 | if ".ipynb_checkpoints" not in dirname: 49 | files.append( 50 | ( 51 | os.path.join(dirname, filename), 52 | dirname.replace(path, ""), 53 | filename, 54 | ) 55 | ) 56 | # pull contents and push into templates list 57 | for f, dirname, filename in sorted(files): 58 | # skips over faild attempts to read content 59 | try: 60 | with open(os.path.join(abspath, f), "r", encoding="utf8") as fp: 61 | content = fp.read() 62 | except (FileNotFoundError, PermissionError): 63 | # Can't read file, skip 64 | continue 65 | 66 | data = { 67 | "path": f, 68 | "name": os.path.join(dirname, filename), 69 | "dirname": dirname, 70 | "filename": filename, 71 | "content": content, 72 | } 73 | 74 | # remove leading slash for select 75 | if dirname.strip(os.path.sep) not in templates: 76 | templates[dirname.strip(os.path.sep)] = [] 77 | 78 | # don't include content unless necessary 79 | templates[dirname.strip(os.path.sep)].append({"name": data["name"]}) 80 | 81 | # full data 82 | template_by_path[data["name"]] = data 83 | 84 | return templates, template_by_path 85 | 86 | 87 | class TemplatesHandler(JupyterHandler): 88 | def initialize(self, loader): 89 | self.loader = loader 90 | 91 | @tornado.web.authenticated 92 | def get(self): 93 | temp = self.get_argument("template", "") 94 | if temp: 95 | self.finish(self.loader.get_templates()[1][temp]) 96 | self.set_status(404) 97 | 98 | 99 | class TemplateNamesHandler(JupyterHandler): 100 | def initialize(self, loader): 101 | self.loader = loader 102 | 103 | @tornado.web.authenticated 104 | def get(self): 105 | templates, _ = self.loader.get_templates() 106 | response = {"templates": templates, "template_label": self.loader.template_label} 107 | self.finish(json.dumps(response)) 108 | 109 | 110 | def load_jupyter_server_extension(nb_server_app): 111 | """ 112 | Called when the extension is loaded. 113 | 114 | Args: 115 | nb_server_app (NotebookWebApplication): handle to the Notebook webserver instance. 116 | """ 117 | web_app = nb_server_app.web_app 118 | template_dirs = nb_server_app.config.get("JupyterLabTemplates", {}).get("template_dirs", []) 119 | 120 | allowed_extensions = nb_server_app.config.get("JupyterLabTemplates", {}).get("allowed_extensions", ["*.ipynb"]) 121 | 122 | if nb_server_app.config.get("JupyterLabTemplates", {}).get("include_default", True): 123 | template_dirs.insert(0, os.path.join(os.path.dirname(__file__), "templates")) 124 | 125 | base_url = web_app.settings["base_url"] 126 | 127 | host_pattern = ".*$" 128 | nb_server_app.log.info("Installing jupyterlab_templates handler on path %s" % url_path_join(base_url, "templates")) 129 | 130 | if nb_server_app.config.get("JupyterLabTemplates", {}).get("include_core_paths", True): 131 | template_dirs.extend([os.path.join(x, "notebook_templates") for x in jupyter_core.paths.jupyter_path()]) 132 | nb_server_app.log.info("Search paths:\n\t%s" % "\n\t".join(template_dirs)) 133 | 134 | template_label = nb_server_app.config.get("JupyterLabTemplates", {}).get("template_label", "Template") 135 | nb_server_app.log.info("Template label: %s" % template_label) 136 | 137 | loader = TemplatesLoader(template_dirs, allowed_extensions=allowed_extensions, template_label=template_label) 138 | nb_server_app.log.info("Available templates:\n\t%s" % "\n\t".join(t for t in loader.get_templates()[1].keys())) 139 | 140 | web_app.add_handlers( 141 | host_pattern, 142 | [ 143 | ( 144 | url_path_join(base_url, "templates/names"), 145 | TemplateNamesHandler, 146 | {"loader": loader}, 147 | ) 148 | ], 149 | ) 150 | web_app.add_handlers( 151 | host_pattern, 152 | [ 153 | ( 154 | url_path_join(base_url, "templates/get"), 155 | TemplatesHandler, 156 | {"loader": loader}, 157 | ) 158 | ], 159 | ) 160 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2020 jupyterlab-templates authors 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /js/style/index.css: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2020, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | .jp-TemplateIcon { 10 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAByMAAAaXCAYAAADVacKDAAAACXBIWXMAAJ16AACdegHu2JUgAAAgAElEQVR4nOzdQW4UWbqG4dNXd2jJ3gEMY2Z2gHsFeAdpVgA9iiHU0CO8gzQraPcKrmsFBTMPqR2AFHOuoutkX1ddwNjOLzNOxPNILfWgVGX/p6Tm7/dExN++fv1aAAAAAAAAALbtv0wUAAAAAAAASBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgx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AAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAA8G/bAa7UEeSv4UYVAAAAAElFTkSuQmCC"); 11 | } -------------------------------------------------------------------------------- /js/src/index.js: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * 3 | * Copyright (c) 2020, the jupyterlab_templates authors. 4 | * 5 | * This file is part of the jupyterlab_templates library, distributed under the terms of 6 | * the Apache License 2.0. The full license can be found in the LICENSE file. 7 | * 8 | */ 9 | import {Dialog, showDialog} from "@jupyterlab/apputils"; 10 | 11 | import {IFileBrowserFactory} from "@jupyterlab/filebrowser"; 12 | 13 | import {ILauncher} from "@jupyterlab/launcher"; 14 | 15 | import {IMainMenu} from "@jupyterlab/mainmenu"; 16 | 17 | import {ServerConnection} from "@jupyterlab/services"; 18 | 19 | import {Widget} from "@lumino/widgets"; 20 | 21 | import "../style/index.css"; 22 | 23 | let templates; 24 | 25 | export class OpenTemplateWidget extends Widget { 26 | constructor() { 27 | const body = document.createElement("div"); 28 | const label = document.createElement("label"); 29 | label.textContent = "Template:"; 30 | 31 | const package_input = document.createElement("select"); 32 | const notebook_input = document.createElement("select"); 33 | 34 | Object.keys(templates).forEach((package_name) => { 35 | const package_option = document.createElement("option"); 36 | package_option.label = package_name; 37 | package_option.text = package_name; 38 | package_option.value = package_name; 39 | package_input.appendChild(package_option); 40 | }); 41 | 42 | const fill = (package_name) => { 43 | while (notebook_input.lastChild) { 44 | notebook_input.removeChild(notebook_input.lastChild); 45 | } 46 | 47 | templates[package_name].forEach((notebook) => { 48 | const notebook_option = document.createElement("option"); 49 | notebook_option.label = notebook.name; 50 | notebook_option.text = notebook.name; 51 | notebook_option.value = notebook.name; 52 | notebook_input.appendChild(notebook_option); 53 | }); 54 | }; 55 | 56 | package_input.addEventListener("change", (event) => { 57 | const package_name = event.target.value; 58 | fill(package_name); 59 | }); 60 | 61 | if (Object.keys(templates).length > 0) { 62 | fill(Object.keys(templates)[0]); 63 | } 64 | 65 | body.appendChild(label); 66 | body.appendChild(package_input); 67 | body.appendChild(notebook_input); 68 | super({node: body}); 69 | } 70 | 71 | getValue = () => this.node.getElementsByTagName("select")[1].value; 72 | } 73 | 74 | async function activate(app, menu, browser, launcher) { 75 | // grab templates from serverextension 76 | const settings = ServerConnection.makeSettings(); 77 | const res = await ServerConnection.makeRequest(`${settings.baseUrl}templates/names`, {}, settings); 78 | if (res.ok) { 79 | const template_data = await res.json(); 80 | templates = template_data.templates; 81 | const templateLabel = template_data.template_label || "Template"; 82 | 83 | if (Object.keys(templates).length > 0) { 84 | // Add an application command 85 | const open_command = "template:open"; 86 | 87 | app.commands.addCommand(open_command, { 88 | caption: "Initialize a notebook from a template notebook", 89 | execute: () => { 90 | showDialog({ 91 | body: new OpenTemplateWidget(), 92 | buttons: [Dialog.cancelButton(), Dialog.okButton({label: "GO"})], 93 | focusNodeSelector: "input", 94 | title: templateLabel, 95 | }).then(async (result) => { 96 | if (result.button.label === "Cancel") { 97 | return; 98 | } 99 | if (result.value) { 100 | const res2 = await ServerConnection.makeRequest(`${settings.baseUrl}templates/get?${new URLSearchParams({template: result.value})}`, {}, settings); 101 | const data = await res2.json(); 102 | const {path} = browser.tracker.currentWidget.model; 103 | 104 | const ext = data.filename.split(".").pop().toLowerCase(); 105 | const isNotebook = ext === "ipynb"; 106 | const model = await app.commands.execute("docmanager:new-untitled", {ext, path, type: isNotebook ? "notebook" : "file"}); 107 | const widget = await app.commands.execute("docmanager:open", {factory: isNotebook ? "Notebook" : null, path: model.path}); 108 | // eslint-disable-next-line no-param-reassign 109 | widget.isUntitled = true; 110 | await widget.context.ready; 111 | if (isNotebook) { 112 | widget.model.fromString(data.content); 113 | } else { 114 | widget.content.editor._editor.setValue(data.content); 115 | } 116 | } 117 | }); 118 | }, 119 | iconClass: "jp-TemplateIcon", 120 | isEnabled: () => true, 121 | label: templateLabel, 122 | }); 123 | 124 | // Add a launcher item if the launcher is available. 125 | if (launcher) { 126 | launcher.add({ 127 | args: {isLauncher: true, kernelName: "template"}, 128 | category: "Notebook", 129 | command: open_command, 130 | // eslint-disable-next-line max-len 131 | kernelIconUrl: 132 | // eslint-disable-next-line max-len 133 | "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAByMAAAaXCAYAAADVacKDAAAACXBIWXMAAJ16AACdegHu2JUgAAAgAElEQVR4nOzdQW4UWbqG4dNXd2jJ3gEMY2Z2gHsFeAdpVgA9iiHU0CO8gzQraPcKrmsFBTMPqR2AFHOuoutkX1ddwNjOLzNOxPNILfWgVGX/p6Tm7/dExN++fv1aAAAAAAAAALbtv0wUAAAAAAAASBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgxEgAAAAAAAIgQIwEAAAAAAIAIMRIAAAAAAACIECMBAAAAAACACDESAAAAAAAAiBAjAQAAAAAAgAgx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AAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAAkJCRAAAAAAAAQEJGAgAAAAAAAAkZCQAAAAAAACRkJAAAAAAAAJCQkQAAAAAAAEBCRgIAAAAAAAAJGQkAAAAAAAAkZCQAAAAAAACQkJEAAAAAAABAQkYCAAAAAAAACRkJAAAAAAAAJGQkAAAAAAAA8G/bAa7UEeSv4UYVAAAAAElFTkSuQmCC", 134 | rank: 1, 135 | }); 136 | } 137 | 138 | if (menu) { 139 | // Add new text file creation to the file menu. 140 | menu.fileMenu.newMenu.addGroup([{command: open_command}], 40); 141 | } 142 | } else { 143 | // eslint-disable-next-line no-console 144 | console.log("No JupyterLab templates available!"); 145 | } 146 | } 147 | 148 | // eslint-disable-next-line no-console 149 | console.log("JupyterLab extension jupyterlab_templates is activated!"); 150 | } 151 | 152 | const extension = { 153 | activate, 154 | autoStart: true, 155 | id: "jupyterlab_templates", 156 | optional: [ILauncher], 157 | requires: [IMainMenu, IFileBrowserFactory], 158 | }; 159 | 160 | export default extension; 161 | export {activate as _activate}; 162 | --------------------------------------------------------------------------------