diff --git a/docs/source/_static/images/cell-tags-toolbar.png b/docs/source/_static/images/cell-tags-toolbar.png new file mode 100644 index 000000000..5058ef872 Binary files /dev/null and b/docs/source/_static/images/cell-tags-toolbar.png differ diff --git a/docs/source/_static/images/shortcut-editor.png b/docs/source/_static/images/shortcut-editor.png new file mode 100644 index 000000000..7efd2be9a Binary files /dev/null and b/docs/source/_static/images/shortcut-editor.png differ diff --git a/docs/source/_static/images/table-style-change.png b/docs/source/_static/images/table-style-change.png new file mode 100644 index 000000000..46c139fe4 Binary files /dev/null and b/docs/source/_static/images/table-style-change.png differ diff --git a/docs/source/_static/images/table-style-change.xcf b/docs/source/_static/images/table-style-change.xcf new file mode 100644 index 000000000..dd34ce265 Binary files /dev/null and b/docs/source/_static/images/table-style-change.xcf differ diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 0b6277dd5..99637d7e1 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -24,52 +24,93 @@ Upgrade to version 9+ of pip before upgrading ``notebook`` is strongly recommend .. _release-5.0.0: Notebook version 5.0 -==================== +-------------------- -This is the first major release of the Notebook Application and Server after -the version 4.0 created by the "Big Split" of IPython into IPython and Jupyter. +This is the first major release of the Jupyter Notebook since version 4.0 was +created by the "Big Split" of IPython and Jupyter. We encourage users to start trying JupyterLab in preparation for a future transition. -The Notebook Web Application and Server have seen more than 200 pull requests -merged since the 4.x series. This only covers a small subset of the new -features available on this new version; bugfixes are omitted. +We have merged more than 200 pull requests since the 4.x series. Some of the +major user-facing changes are described here. -- Dashboard/tree can now be ordered by ``last-modified`` and ``name``, - (:ghpull:`943`) +Cell tags +********* -- Keyboard shortcuts for command mode are now editable from within the UI, see - the ``Help > Edit Keyboard Shortcuts`` Menu item and follow instructions. - (:ghpull:`1347`) +There is a new cell toolbar for adding *cell tags* (:ghpull:`2048`): +.. image:: /_static/images/cell-tags-toolbar.png + :align: center -- Markdown cells now supports attachments. Simply drag and drop an image from +Cell tags are a lightweight way to customise the behaviour of tools working with +notebooks; we're working on building support for them into tools like `nbconvert +`__ and `nbval +`__. + +The UI for editing cell tags is basic for now; we hope to improve it in future +releases. + +Table style +*********** + +The default styling for tables in the notebook has been updated (:ghpull:`1776`): + +.. image:: /_static/images/table-style-change.png + :align: center + +Customise keyboard shortcuts +**************************** + +You can now edit keyboard shortcuts for command mode within the UI +(:ghpull:`1347`): + +.. image:: /_static/images/shortcut-editor.png + :align: center + +See the ``Help > Edit Keyboard Shortcuts`` menu item and follow the instructions. + +Other additions +*************** + +- You can copy and paste cells between notebooks, using :kbd:`Ctrl-C` and + :kbd:`Ctrl-V` (:kbd:`Cmd-C` and :kbd:`Cmd-V` on Mac). + +- It's easier to configure a password for the notebook with the new + ``jupyter notebook password`` command (:ghpull:`2007`). + +- The file list can now be ordered by *last modified* or by *name* + (:ghpull:`943`). + +- Markdown cells now support attachments. Simply drag and drop an image from your desktop to a markdown cell to add it. Unlike relative links that you - enter manually, attachments are embedded in the notebook itself. A - non-referenced attachment will be automatically scrubbed from the notebook on - save. :ghpull:`621` + enter manually, attachments are embedded in the notebook itself. An + unreferenced attachment will be automatically scrubbed from the notebook on + save (:ghpull:`621`). +- Undoing cell deletion now supports undeleting multiple cells. Cells may not be + in the same order as before their deletion, depending on the actions you did + on the meantime, but this should should help reduce the impact of + accidentally deleting code. -- Undoing cell deletion now supports undeleting multiple cells. Cell may not be - in the same order as before their deletion depending on the actions you did - on the meantime, but this should should help minimize the impact of - accidental code deletion. +- The file browser now has *Edit* and *View* buttons. -- Dashboard now has ``edit`` and ``view`` buttons. +- The file browser now supports moving multiple files at once + (:ghpull:`1088`). -- The Dashboard/Tree view now supports moving multiple files at once. - :ghpull:`1088` +- The Notebook will refuse to run as root unless the ``--allow-root`` flag is + given (:ghpull:`1115`). -- Notebook refuses to run as root user (unless forced to) :ghpull:`1115` +- Keyboard shortcuts are now declarative (:ghpull:`1234`). -- Keyboard shortcuts are now declarative (:ghpull:`1234`) +- Toggling line numbers can now affect all cells (:ghpull:`1312`). -- Toggling line numbers can now affect all cells (:ghpull:`1312`) +- Add more visible *Trusted* and *Untrusted* notifications (:ghpull:`1658`). -- Add more visible ``Trusted`` and ``Untrusted`` notifications :ghpull:`1658` +- The tab icon in the browser now changes to indicate when the kernel is busy + (:ghpull:`1837`). -We remind readers that upgrading ``notebook`` only affect part of the user +Remember that upgrading ``notebook`` only affects the user interface. Upgrading kernels and libraries may also provide new features, better stability and integration with the notebook interface. @@ -161,7 +202,7 @@ Bug fixes: Other improvements: -- Allow JSON output data with mime type "application/*+json" +- Allow JSON output data with mime type ``application/*+json`` - Allow kernelspecs to have spaces in them for backward compat - Allow websocket connections from scripts - Allow :code:`None` for post_save_hook diff --git a/docs/source/conf.py b/docs/source/conf.py index f190444f5..c82a2344b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -30,6 +30,8 @@ for item in sys.path: # add repo root to sys.path # here = root/docs/source here = os.path.abspath(os.path.dirname(__file__)) +sphinxext = os.path.join(os.path.dirname(here), 'sphinxext') +sys.path.insert(0, sphinxext) repo_root = os.path.dirname(os.path.dirname(here)) sys.path.insert(0, repo_root) @@ -70,6 +72,7 @@ extensions = [ 'sphinx.ext.mathjax', 'IPython.sphinxext.ipython_console_highlighting', 'nbsphinx', + 'github', ] # Add any paths that contain templates here, relative to this directory. @@ -91,6 +94,9 @@ project = 'Jupyter Notebook' copyright = '2015, Jupyter Team, https://jupyter.org' author = 'The Jupyter Team' +# ghissue config +github_project_url = "https://github.com/jupyter/notebook" + # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. diff --git a/docs/sphinxext/github.py b/docs/sphinxext/github.py new file mode 100644 index 000000000..8f0ffc0d9 --- /dev/null +++ b/docs/sphinxext/github.py @@ -0,0 +1,157 @@ +"""Define text roles for GitHub + +* ghissue - Issue +* ghpull - Pull Request +* ghuser - User + +Adapted from bitbucket example here: +https://bitbucket.org/birkenfeld/sphinx-contrib/src/tip/bitbucket/sphinxcontrib/bitbucket.py + +Authors +------- + +* Doug Hellmann +* Min RK +""" +# +# Original Copyright (c) 2010 Doug Hellmann. All rights reserved. +# + +from docutils import nodes, utils +from docutils.parsers.rst.roles import set_classes + +def make_link_node(rawtext, app, type, slug, options): + """Create a link to a github resource. + + :param rawtext: Text being replaced with link node. + :param app: Sphinx application context + :param type: Link type (issues, changeset, etc.) + :param slug: ID of the thing to link to + :param options: Options dictionary passed to role func. + """ + + try: + base = app.config.github_project_url + if not base: + raise AttributeError + if not base.endswith('/'): + base += '/' + except AttributeError as err: + raise ValueError('github_project_url configuration value is not set (%s)' % str(err)) + + ref = base + type + '/' + slug + '/' + set_classes(options) + prefix = "#" + if type == 'pull': + prefix = "PR " + prefix + node = nodes.reference(rawtext, prefix + utils.unescape(slug), refuri=ref, + **options) + return node + +def ghissue_role(name, rawtext, text, lineno, inliner, options={}, content=[]): + """Link to a GitHub issue. + + Returns 2 part tuple containing list of nodes to insert into the + document and a list of system messages. Both are allowed to be + empty. + + :param name: The role name used in the document. + :param rawtext: The entire markup snippet, with role. + :param text: The text marked with the role. + :param lineno: The line number where rawtext appears in the input. + :param inliner: The inliner instance that called us. + :param options: Directive options for customization. + :param content: The directive content for customization. + """ + + try: + issue_num = int(text) + if issue_num <= 0: + raise ValueError + except ValueError: + msg = inliner.reporter.error( + 'GitHub issue number must be a number greater than or equal to 1; ' + '"%s" is invalid.' % text, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + app = inliner.document.settings.env.app + #app.info('issue %r' % text) + if 'pull' in name.lower(): + category = 'pull' + elif 'issue' in name.lower(): + category = 'issues' + else: + msg = inliner.reporter.error( + 'GitHub roles include "ghpull" and "ghissue", ' + '"%s" is invalid.' % name, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + node = make_link_node(rawtext, app, category, str(issue_num), options) + return [node], [] + +def ghuser_role(name, rawtext, text, lineno, inliner, options={}, content=[]): + """Link to a GitHub user. + + Returns 2 part tuple containing list of nodes to insert into the + document and a list of system messages. Both are allowed to be + empty. + + :param name: The role name used in the document. + :param rawtext: The entire markup snippet, with role. + :param text: The text marked with the role. + :param lineno: The line number where rawtext appears in the input. + :param inliner: The inliner instance that called us. + :param options: Directive options for customization. + :param content: The directive content for customization. + """ + app = inliner.document.settings.env.app + #app.info('user link %r' % text) + ref = 'https://www.github.com/' + text + node = nodes.reference(rawtext, text, refuri=ref, **options) + return [node], [] + +def ghcommit_role(name, rawtext, text, lineno, inliner, options={}, content=[]): + """Link to a GitHub commit. + + Returns 2 part tuple containing list of nodes to insert into the + document and a list of system messages. Both are allowed to be + empty. + + :param name: The role name used in the document. + :param rawtext: The entire markup snippet, with role. + :param text: The text marked with the role. + :param lineno: The line number where rawtext appears in the input. + :param inliner: The inliner instance that called us. + :param options: Directive options for customization. + :param content: The directive content for customization. + """ + app = inliner.document.settings.env.app + #app.info('user link %r' % text) + try: + base = app.config.github_project_url + if not base: + raise AttributeError + if not base.endswith('/'): + base += '/' + except AttributeError as err: + raise ValueError('github_project_url configuration value is not set (%s)' % str(err)) + + ref = base + text + node = nodes.reference(rawtext, text[:6], refuri=ref, **options) + return [node], [] + + +def setup(app): + """Install the plugin. + + :param app: Sphinx application context. + """ + app.info('Initializing GitHub plugin') + app.add_role('ghissue', ghissue_role) + app.add_role('ghpull', ghissue_role) + app.add_role('ghuser', ghuser_role) + app.add_role('ghcommit', ghcommit_role) + app.add_config_value('github_project_url', None, 'env') + + metadata = {'parallel_read_safe': True, 'parallel_write_safe': True} + return metadata