From c2b17d599eb09afb52223ee3768dcbaeff573a5d Mon Sep 17 00:00:00 2001 From: nuest Date: Mon, 5 Nov 2018 21:10:13 +0100 Subject: [PATCH] add tests pyjp vs. py for Stencila, make Stencila tests more specific --- .../py/plain-python/bibliography.bibtex | 21 ++ tests/stencila/py/plain-python/manifest.xml | 6 + tests/stencila/py/plain-python/py.ipynb | 195 ++++++++++++++++ .../py/plain-python/py.ipynb.jats.xml | 212 ++++++++++++++++++ tests/stencila/py/verify | 5 + tests/stencila/pyjp/verify | 2 +- tests/stencila/r/verify | 1 + 7 files changed, 441 insertions(+), 1 deletion(-) create mode 100644 tests/stencila/py/plain-python/bibliography.bibtex create mode 100644 tests/stencila/py/plain-python/manifest.xml create mode 100644 tests/stencila/py/plain-python/py.ipynb create mode 100644 tests/stencila/py/plain-python/py.ipynb.jats.xml create mode 100755 tests/stencila/py/verify diff --git a/tests/stencila/py/plain-python/bibliography.bibtex b/tests/stencila/py/plain-python/bibliography.bibtex new file mode 100644 index 00000000..643df1dd --- /dev/null +++ b/tests/stencila/py/plain-python/bibliography.bibtex @@ -0,0 +1,21 @@ +@article{kluyver2016jupyter, + title={Jupyter Notebooks-a publishing format for reproducible computational workflows.}, + author={Kluyver, Thomas and Ragan-Kelley, Benjamin and P{\'e}rez, Fernando and Granger, Brian E and Bussonnier, Matthias and Frederic, Jonathan and Kelley, Kyle and Hamrick, Jessica B and Grout, Jason and Corlay, Sylvain and others}, + journal={ELPUB}, + pages={87--90}, + year={2016} +} +@article{ragan2014jupyter, + title={The Jupyter/IPython architecture: a unified view of computational research, from interactive exploration to communication and publication.}, + author={Ragan-Kelley, M and Perez, F and Granger, B and Kluyver, T and Ivanov, P and Frederic, J and Bussonnier, M}, + journal={AGU Fall Meeting Abstracts}, + year={2014} +} +@article{perez2015project, + title={Project Jupyter: Computational narratives as the engine of collaborative data science}, + author={Perez, Fernando and Granger, Brian E}, + journal={Retrieved September}, + volume={11}, + pages={207}, + year={2015} +} diff --git a/tests/stencila/py/plain-python/manifest.xml b/tests/stencila/py/plain-python/manifest.xml new file mode 100644 index 00000000..ef19f7d7 --- /dev/null +++ b/tests/stencila/py/plain-python/manifest.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/stencila/py/plain-python/py.ipynb b/tests/stencila/py/plain-python/py.ipynb new file mode 100644 index 00000000..2a2f1835 --- /dev/null +++ b/tests/stencila/py/plain-python/py.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jupyter notebooks ([@perez2015project; @kluyver2016jupyter; @ragan2014jupyter]) are one of the most popular platforms for doing reproducible research. Stencila supports importing of Jupyter Notebook `.ipynb` files. This allows you to work with collegues to refine a document for final publication while still retaining the code cells, and thus reprodubility of your the work. In the future we also plan to support exporting to `.ipynb` files. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Markdown cells\n", + "\n", + "Most standard Markdown should be supported by the importer including inline `code`, headings etc (although the Stencila user interface do not currently support rendering of some elements e.g. math and lists).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Code cells\n", + "\n", + "Code cells in notebooks are imported without loss. Stencila's user interface currently differs from Jupyter in that code cells are executed on update while you are typing. This produces a very reactive user experience but is inappropriate for more compute intensive, longer running code cells. We are currently working on improving this to allowing users to decide to execute cells explicitly (e.g. using `Ctrl+Enter`)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Hello this is Python 3.5 and it is Tue Feb 13 10:56:10 2018'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import sys\n", + "import time\n", + "'Hello this is Python %s.%s and it is %s' % (sys.version_info[0], sys.version_info[1], time.strftime('%c'))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Stencila also support Jupyter code cells that produce plots. The cell below produces a simple plot based on the example from [the Matplotlib website](https://matplotlib.org/examples/shapes_and_collections/scatter_demo.html). Try changing the code below (for example, the variable `N`)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "N = 50\n", + "N = min(N, 1000) # Prevent generation of too many numbers :)\n", + "x = np.random.rand(N)\n", + "y = np.random.rand(N)\n", + "colors = np.random.rand(N)\n", + "area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radii\n", + "\n", + "plt.scatter(x, y, s=area, c=colors, alpha=0.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are currently working on supporting [Jupyter's magic commands](http://ipython.readthedocs.io/en/stable/interactive/magics.html) in Stencila via a bridge to Jupyter kernels." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Metadata\n", + "\n", + "To add some metadata about the document (such as authors, title, abstract and so on), In Jupyter, select `Edit -> Edit Notebook metadata` from the top menu. Add the title and abstract as JSON strings and authors and organisations metadata as [JSON arrays](https://www.w3schools.com/js/js_json_arrays.asp). Author `affiliation` identifiers (like `university-of-earth` below) must be unique and preferably use only lowercase characters and no spaces.\n", + " \n", + "For example," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```\n", + " \"authors\": [\n", + " {\n", + " \"given-names\": \"Your first name goes here\",\n", + " \"surname\": \"Your last name goes here\",\n", + " \"email\": \"your.email@your-organisation\",\n", + " \"corresponding\": \"yes / no\",\n", + " \"affiliation\": \"university-of-earth\"\n", + " }\n", + " ],\n", + " \n", + " \"organisations\": [ \n", + " {\n", + " \"university-of-earth\": {\n", + " \"institution\": \"Your organisation name\",\n", + " \"city\": \"Your city\",\n", + " \"country\": \"Your country\" \n", + " }\n", + " ],\n", + "\n", + " \"title\": \"Your title goes here\",\n", + " \"abstract\": \"This is a paper about lots of different interesting things\",\n", + " \n", + " ```\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Citations and references \n", + "\n", + "Stencila supports Pandoc style citations and reference lists within Jupyter notebook Markdown cells. Add a `bibliography` entry to the notebook's metadata which points to a file containing your list of references e.g.\n", + "\n", + "```json\n", + "\"bibliography\": \"my-bibliography.bibtex\"\n", + "```\n", + "\n", + "Then, within Markdown cells, you can insert citations inside square brackets and separated by semicolons. Each citation is represented using the `@` symbol followed by the citation identifier from the bibliography database e.g.\n", + "\n", + "```json\n", + "[@perez2015project; @kluyver2016jupyter]\n", + "```\n", + "\n", + "The [cite2c](https://github.com/takluyver/cite2c) Jupyter extension allows for easier, \"cite-while-you-write\" insertion of citations from a Zotero library. We're hoping to support conversion of cite2cstyle citations/references in the [future](https://github.com/stencila/convert/issues/14).\n" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "authors": [ + { + "given-names": "Aleksandra", + "surname": "Pawlik" + } + ], + "bibliography": "bibliography.bibtex", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + }, + "title": "Jupyter and Stencila" + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/stencila/py/plain-python/py.ipynb.jats.xml b/tests/stencila/py/plain-python/py.ipynb.jats.xml new file mode 100644 index 00000000..7e6e1d10 --- /dev/null +++ b/tests/stencila/py/plain-python/py.ipynb.jats.xml @@ -0,0 +1,212 @@ + + +
+ + + + Jupyter and Stencila + + + + + Pawlik + Aleksandra + + + + +

An example of a Jupyter notebook converted into a JATS document for editing in Stencila.

+
+
+
+ + + + Introduction +

Jupyter notebooks (13) are one of the most popular platforms for doing reproducible research. Stencila supports importing of Jupyter Notebook .ipynb files. This allows you to work with collegues to refine a document for final publication while still retaining the code cells, and thus reprodubility of your the work. In the future we also plan to support exporting to .ipynb files.

+
+ + Markdown cells +

Most standard Markdown should be supported by the importer including inline code, headings etc (although the Stencila user interface do not currently support rendering of some elements e.g. math and lists).

+
+ + Code cells +

Code cells in notebooks are imported without loss. Stencila’s user interface currently differs from Jupyter in that code cells are executed on update while you are typing. This produces a very reactive user experience but is inappropriate for more compute intensive, longer running code cells. We are currently working on improving this to allowing users to decide to execute cells explicitly (e.g. using Ctrl+Enter).

+ + import sys +import time +'Hello this is Python %s.%s and it is %s' % (sys.version_info[0], sys.version_info[1], time.strftime('%c')) + {} + + + +

Stencila also support Jupyter code cells that produce plots. The cell below produces a simple plot based on the example from the Matplotlib website. Try changing the code below (for example, the variable N).

+ + import numpy as np +import matplotlib.pyplot as plt + +N = 50 +N = min(N, 1000) # Prevent generation of too many numbers :) +x = np.random.rand(N) +y = np.random.rand(N) +colors = np.random.rand(N) +area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radii + +plt.scatter(x, y, s=area, c=colors, alpha=0.5) +plt.show() + {} + + + +

We are currently working on supporting Jupyter’s magic commands in Stencila via a bridge to Jupyter kernels.

+
+ + Metadata +

To add some metadata about the document (such as authors, title, abstract and so on), In Jupyter, select Edit -> Edit Notebook metadata from the top menu. Add the title and abstract as JSON strings and authors and organisations metadata as JSON arrays. Author affiliation identifiers (like university-of-earth below) must be unique and preferably use only lowercase characters and no spaces.

+

For example,

+ "authors": [ + { + "given-names": "Your first name goes here", + "surname": "Your last name goes here", + "email": "your.email@your-organisation", + "corresponding": "yes / no", + "affiliation": "university-of-earth" + } + ], + + "organisations": [ + { + "university-of-earth": { + "institution": "Your organisation name", + "city": "Your city", + "country": "Your country" + } + ], + + "title": "Your title goes here", + "abstract": "This is a paper about lots of different interesting things", + +
+ + Citations and references +

Stencila supports Pandoc style citations and reference lists within Jupyter notebook Markdown cells. Add a bibliography entry to the notebook’s metadata which points to a file containing your list of references e.g.

+ "bibliography": "my-bibliography.bibtex" +

Then, within Markdown cells, you can insert citations inside square brackets and separated by semicolons. Each citation is represented using the @ symbol followed by the citation identifier from the bibliography database e.g.

+ [@perez2015project; @kluyver2016jupyter] +

The cite2c Jupyter extension allows for easier, “cite-while-you-write” insertion of citations from a Zotero library. We’re hoping to support conversion of cite2cstyle citations/references in the future.

+
+ + + + + + + + Perez + Fernando + + + Granger + Brian E + + + Project jupyter: Computational narratives as the engine of collaborative data science + Retrieved September + 2015 + 11 + 207 + + + + + + + Kluyver + Thomas + + + Ragan-Kelley + Benjamin + + + Pérez + Fernando + + + Granger + Brian E + + + Bussonnier + Matthias + + + Frederic + Jonathan + + + Kelley + Kyle + + + Hamrick + Jessica B + + + Grout + Jason + + + Corlay + Sylvain + + + Others + + + Jupyter notebooks-a publishing format for reproducible computational workflows. + ELPUB + 2016 + 87 + + + + + + + Ragan-Kelley + M + + + Perez + F + + + Granger + B + + + Kluyver + T + + + Ivanov + P + + + Frederic + J + + + Bussonnier + M + + + The jupyter/ipython architecture: A unified view of computational research, from interactive exploration to communication and publication. + AGU Fall Meeting Abstracts + 2014 + + + + +
\ No newline at end of file diff --git a/tests/stencila/py/verify b/tests/stencila/py/verify new file mode 100755 index 00000000..788ef9da --- /dev/null +++ b/tests/stencila/py/verify @@ -0,0 +1,5 @@ +#!/bin/sh + +jupyter serverextension list 2>&1 | grep nbstencilaproxy +jupyter nbextension list 2>&1 | grep nbstencilaproxy +python3 -c "import stencila" diff --git a/tests/stencila/pyjp/verify b/tests/stencila/pyjp/verify index 788ef9da..218e75f4 100755 --- a/tests/stencila/pyjp/verify +++ b/tests/stencila/pyjp/verify @@ -2,4 +2,4 @@ jupyter serverextension list 2>&1 | grep nbstencilaproxy jupyter nbextension list 2>&1 | grep nbstencilaproxy -python3 -c "import stencila" +python3 -c "import stencila" 2>&1 | grep ModuleNotFoundError diff --git a/tests/stencila/r/verify b/tests/stencila/r/verify index 2bd4ad54..33db4a89 100755 --- a/tests/stencila/r/verify +++ b/tests/stencila/r/verify @@ -2,4 +2,5 @@ jupyter serverextension list 2>&1 | grep nbstencilaproxy jupyter nbextension list 2>&1 | grep nbstencilaproxy +python3 -c "import stencila" 2>&1 | grep ModuleNotFoundError R -e "library('stencila');"