diff --git a/.gitignore b/.gitignore index 78302c1..91f6ae7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ dist/ nbmerge.egg-info/ - +build/ diff --git a/README.rst b/README.rst index 64db5f5..87fd4e9 100644 --- a/README.rst +++ b/README.rst @@ -26,11 +26,28 @@ Installation Usage ===== +For the usage as originally specified by +`@fperez `__'s gist, .. code:: sh nbmerge file_1.ipynb file_2.ipynb file_3.ipynb > merged.ipynb +Alternatively, nbmerge can cursively collect all files in the current +directory and below, recursively. After collection, it sorts them +lexicographically. You can use a regular expression as a file name +predicate. All ``.ipynb_checkpoints`` are automatically ignored. And, you +can use the `-i` option to ignore any notebook prefixed with an underscore +(think pseudo-private in python). + +For example, the following command collects all notebooks in your project +that have the word `intro` in the file name and saves it to a merged file +named `_merged.ipynb`, + +.. code:: sh + + nbmerge --recursive -i -f ".*intro.*" -o _merged.ipynb + Lineage ======= diff --git a/nbmerge/__init__.py b/nbmerge/__init__.py index 22c5dd8..24e4eeb 100644 --- a/nbmerge/__init__.py +++ b/nbmerge/__init__.py @@ -1,15 +1,13 @@ from __future__ import print_function -import codecs +import argparse import io +import re +import os import sys from nbformat import read as read_notebook from nbformat import write as write_notebook -# See: -# - stackoverflow.com/a/1169209 -# - github.com/kynan/nbstripout/commit/8e26f4df317fde8b935df8e4930b32c74f834cf9 -sys.stdout = codecs.getwriter('utf8')(sys.stdout) __title__ = "nbmerge" __description__ = "A tool to merge / concatenate Jupyter (IPython) notebooks" @@ -25,7 +23,7 @@ __email__ = "jbn@abreka.com" -def merge_notebooks(file_paths): +def merge_notebooks(file_paths, verbose=False): """ Merge the given notebooks into one notebook. @@ -38,11 +36,21 @@ def merge_notebooks(file_paths): but the first notebook has a key path of metadata.ns.y, the second data's entry is overwritten. It does not recursively descend into the dictionaries. + + :param file_paths: the ordered file paths to the notebooks for + concatenation + :param verbose: if True, print message for each notebook when processing + :return: the merged notebook """ merged, metadata = None, [] + if verbose: + print("Merging notebooks...") + for path in file_paths: with io.open(path, 'r', encoding='utf-8') as fp: + if verbose: + print("\tReading `{}`".format(path)) nb = read_notebook(fp, as_version=4) metadata.append(nb.metadata) @@ -52,6 +60,9 @@ def merge_notebooks(file_paths): else: merged.cells.extend(nb.cells) + if verbose: + print("Merging metadata in reverse order...") + merged_metadata = {} for meta in reversed(metadata): merged_metadata.update(meta) @@ -60,12 +71,94 @@ def merge_notebooks(file_paths): return merged +def recursive_find(ignore_underscored, filter_re): + """ + Find all notebooks relative to the cwd which match the filtering criteria. + + :param ignore_underscored: filter out all notebooks which begin with + an underscore prefix, irrespective of the filter regexp + :param filter_re: a filter for file name acceptance + :return: lexicographically ordered list of notebook file paths + """ + filter_re = re.compile(filter_re or ".*") + + file_paths = [] + + for dir_path, dir_names, file_names in os.walk(os.getcwd()): + # I can't think of a scenario where you'd ever want checkpoints. + if os.path.basename(dir_path) == ".ipynb_checkpoints": + continue + + for file_name in file_names: + if not file_name.endswith(".ipynb"): + continue + + if ignore_underscored and file_name.startswith('_'): + continue + + if not filter_re.match(file_name): + continue + + file_paths.append(os.path.join(dir_path, file_name)) + + return sorted(file_paths) # For lexicographic sorting + + +def parse_plan(args=None): + """ + Parse the command line arguments and produce an execution plan. + """ + parser = argparse.ArgumentParser("Merge a set of notebooks into one.") + + parser.add_argument("files", + help="Paths to files to merge", + nargs="*") + + parser.add_argument("-o", "--output", + help="Write to the specified file") + + parser.add_argument("-f", "--filter-re", + help="Regexp for filename acceptance") + parser.add_argument("-i", "--ignore-underscored", + help="Ignore notebooks with underscore prefix", + action="store_true") + parser.add_argument("-r", "--recursive", + help="Merge all notebooks in subdirectories", + action="store_true") + parser.add_argument("-v", "--verbose", + help="Print progress as processing", + action="store_true") + + args = parser.parse_args(args) + + file_paths = args.files[:] + for file_path in file_paths: + if not os.path.exists(file_path): + print("Notebook `{}` does not exist".format(file_path)) + sys.exit(1) + + if args.recursive: + # If you specify any files, they are added first, in order. + # This is useful for a header notebook of some sort. + file_paths.extend(recursive_find(args.ignore_underscored, + args.filter_re)) + return {'notebooks': file_paths, + 'output_file': args.output, + 'verbose': args.verbose} + + def main(): - notebooks = sys.argv[1:] - if not notebooks: - print("Usage: nbconvert a.ipynb b.ipynb > merged.ipynb", - file=sys.stderr) - sys.exit(1) - - nb = merge_notebooks(notebooks) - write_notebook(nb, sys.stdout) + plan = parse_plan() + + nb = merge_notebooks(plan['notebooks']) + + if plan['output_file'] is None: + # See: + # - http://stackoverflow.com/a/1169209 + # - http://github.com/kynan/nbstripout/commit/8e26f4df + # import codecs + # write_notebook(nb, codecs.getwriter('utf8')(sys.stdout)) + write_notebook(nb, sys.stdout) + else: + with io.open(plan['output_file'], 'w', encoding='utf8') as fp: + write_notebook(nb, fp) diff --git a/tests/fixtures/.ipynb_checkpoints/1_Intro-checkpoint.ipynb b/tests/fixtures/.ipynb_checkpoints/1_Intro-checkpoint.ipynb new file mode 100644 index 0000000..4075c12 --- /dev/null +++ b/tests/fixtures/.ipynb_checkpoints/1_Intro-checkpoint.ipynb @@ -0,0 +1,42 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some markdown." + ] + } + ], + "metadata": { + "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" + }, + "test_meta": { + "title": "Page 1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/fixtures/.ipynb_checkpoints/2_Middle-checkpoint.ipynb b/tests/fixtures/.ipynb_checkpoints/2_Middle-checkpoint.ipynb new file mode 100644 index 0000000..a3d9371 --- /dev/null +++ b/tests/fixtures/.ipynb_checkpoints/2_Middle-checkpoint.ipynb @@ -0,0 +1,101 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook 2" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n9j8Z0Sk7cyZ/MwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nY3fhwoUAIK978+bN8vKvvPIKiAjXXHON/Jx0wps+fTqGDx+Ovn37oqSkBAaDAW63G7NmzQKgvG3r\n6+vx8ccfw+VypeSIG264AQUFBbjnnntQUFCAvn374swzz8QTTzyBxsbGzm6+TjmgTcZmz56NwsJC\nTJgwIeNySmehdHw+H6ZOnYpu3bph9OjRmDt3Lnbv3g0iwvr16zFs2LB274lGo2mbggHJUuPKlSvR\no0cPnH322bjnnnvw5Zdf4txzz8XixYthMpkwatQoHHXUUdi0aVO790+ePBknnngi3n77bWzduhU7\nduzAggULMG/ePJxxxhl4++23FRO+VHIZOXJkxu8slXClpk5S0j377LMxZMgQVFVVIRgMorm5Gf37\n98+4LgA4+uijsWXLFsyfPx/fffcddu7ciVWrVmHZsmWYMWMGPvroI1RXVwNIHqSZTh47duyA2+2G\n2+0GkDxIlyxZkvKdTznlFLz88svy37t27UIwGMSCBQtgt9tRVlaGPn36oLS0FJWVlejWrRsAoKam\nBgDQ0NCATz75BLW1tVi+fDleffVVaLVaTJ8+XV6nTqeTk9zIkSPx4IMP4p577sGRRx6JW2+9FcAv\nJ6+2JdCNGzfihRdewPDhw9G1a1fMmTMH8XgcP/74I7xeL1wul+L3d7vdiiVdKcElEom0CXjHjh0A\nIDfjqq2tBZAsOa5atQp1dXVYvnw5/vnPf4KIcP/997dbxyOPPILa2lo8++yzWL16NdauXQugfdJt\nbW2FIAj73exRSrr7Jiu324133nlHbp4n7ccjRozIuK6dO3e2a643YsQIvPHGG1i7di0GDBiAlStX\nom/fvujfvz+6desmX4USEV566SUMHjwYRx99tPx+6ar0nXfegdFoRGlpKaqqqjB48GCUlZXJzcWk\nfSkcDuPzzz9HU1MTPvvsM7z00kuoq6vDzJkzYTKZ5PV269YNmzdvxvz58/HNN9/gp59+wpdffon3\n338fjzzyCD744AP5Cvh/dqDqKcLhcLsbQErGjh1LJpOpw+UCgQCNHTu2XRMW6fHII4+kfd8xxxxD\nVVVVaV/76quvCABdccUVFI/HyW6308CBA6muro60Wi2de+65RET0pz/9iQRBIK/X22Gce/bsodNO\nO63DOiGpPnTflgltiaJI5eXl1Lt3b/k56QZEZ5sSdUYwGKT77ruPAKQ0c+rVq1fKZ7dVVlaWUudr\nsVjo+OOPpxtuuIEeeOAB+vrrr9vdgS4vL6cTTjihw/gvv/zytL/zkCFD2t05P+aYY+SmZkTJ7Sbd\nsHv99dfl5wDQZZddJi+3a9cuOvbYYxX3qY5u0Bx99NF01FFHpX3tL3/5CwGgmpqatK9ffPHFpNVq\n5ZsykyZNShvD4MGDad26de3ev2TJErmlTNtHcXFxynYfM2YMWa3WjN9F6TuYTCa65ZZb6NZbb6VF\nixa1+91OOeUUcjgcGdeza9cu+Tjb144dO+TWB88//3zKTfFzzjmHysvLSRRF+abjyy+/nPJ+6Tdu\namrK2Ixr7ty5abdTZWUlLViwoFPbIhKJyC1Mhg4d2qn3dMYBq15IVxekJBgMtqvHSufrr7/Gm2++\nCb1ej2OOOQaTJk3Ciy++iC+//BIGg0HxctBmsyEcDqd9TTpLDx06FFqtFkOHDsX69evx/PPPI5FI\nYNy4cQCA/v37g4jwxRdfdBhnly5dMHfuXADABx98oLicVILau3ev4jIff/wxampqMGrUKPm5WCwG\nAIql91/DbDZj6tSpOPbYY1NiPuyww/Ddd9+lrbr5/vvvUVtbi969ewNIlkaCwSBOPvlkzJw5E/fc\ncw/69evXrhF6MBiE0+nssNQllbD3LVH07NkTs2fPRr9+/VKWjUQi8hUAAAiCgOeffx4nnHACLrnk\nEixfvhyCIKSUiAFg8eLFWLduHaxWK0466STcfPPNmDdvnnyZ21EVg8lkald3LJE6qXz55Zdpv9sn\nn3yC6upquYSV7vsedthhmDNnjlwfvq8HHngAkUgEFRUVGDNmDB566CG8//77uPrqq9HQ0CBfIQHJ\nbd6ZK8m2gsEgXC4XnnjiCTz++OMYPXp0u9/N6XQiEAik1Me3NW/ePABI2Y8BoLKyEmVlZfjiiy/w\n4osvwmQy4eKLLwaQvCKrqanB7t278fzzz6OwsBDnn39+yvtDoRAMBgMKCwszdnaQtm2fPn3k48Zi\nseCpp56S6487YjAYcP311+Oss87CJ598kraa6lc5UNk7kUhQ165dqVevXhSNRlNe27JlC40YMUIu\ngQwZMoS6d+/e4TofeOCBtHd3iYgGDBggnxXbOvXUU6mkpCTtOkeMGEEAaMeOHUT0S2sCs9lMBoNB\nbvS/evVqAkB33323/N5FixYplmKkEnSmjgo//vgjCYJAZ599dtq4A4EA9e7dm/R6Pf3444/y851t\ncpXO+vXr290RloRCIerWrRv16NFDfu7ZZ59VLLFLrSikNtKxWIwA0LRp0zLG4HK56Mwzz+wwVqlE\n7/f76bvvvqOzzjqLAMiN6vf9/tXV1WlLnHV1dVRVVUVGo5GWL19OZrOZrrrqKvl1qYXBt99+m/K+\nSCRCBoOBzjrrrIwxnnLKKVReXp72tc2bNyte7b333nsEJNvzSqSScUNDA23evJnOOeccAkBarZam\nTJmS0gqioaGBTCYT9e/fv92+I7XuePXVV+Xnjj/+eKqurs74XdK59NJL6ZBDDsm4jNSu9sEHH0z7\n+o8//kgOh4MqKyvTNrUaM2aM3IZ+36uQt956iwDQ7NmzyWg00i233NLuvWPHjiW9Xt/h93jttdcI\nAC1atIgaGxvplltuIa1WSwDo3HPPpebmZnnZTZs2KbaGiMfj1L9/f3K5XAesg8QBbTJ2//33y5er\nGzdupI0bN9K0adPIYrGkXCr06dOnXZON3bt309y5c+nee++lcDhM4XCYSkpKqKysTG4usi9ph923\nbaUoitTQ0ED9+/cnt9tNixcvpoULF9K7774rH7But5sKCwvl90jNigCkHHChUIh0Op18CRuJREgQ\nBBowYEC7Hk7r16+nXr16kclkatebrC2pLedVV12V0uB/7dq1dMwxx6TdmaXmOb/G8OHDyWKxpLS7\nJEomJ2m9UtMuomQbZpvNRi6XK6Wn05IlS8hisdDw4cPl56Skq9QOVtKjR492zcrSkdpIS21LRVGk\nt99+W26Af9lll8ltiisrK6lXr15p1/Ptt99SUVERmUwm0mg0NHHiRCL65aR3yimnpH3fiSeeSAaD\nIWMPttGjR5PBYFB8fejQoXL7VCnWrVu3Us+ePamgoCClukrqabjvPrNs2TLq0aMHAaDx48fLBRjp\n2Nr3t5L89NNPBCTbxUuOPPLIdtv8559/pldeeYWmTZuW9pgiSibdyspKxe9HlGyH2717d9JqtfTY\nY4/JCUwURXrzzTepoqKCNBqNYicEqe0t2jT9kpoaSm2w01XDTZw4kQBQa2trxhiXLFnS7kT07bff\n0rBhwwgA9evXT97PLr74YtLpdHK7conH45GrgB577LGMn7c/DmjSjUQiNGrUqHb1KH369EnpFdSt\nWzc65JBD6Oqrr6ZRo0ZRz5495WV1Oh1t376dli1blrHe9vPPP09py7hq1SoyGAyKdXXr16+nUChE\nAFLqJBOJhNwTbP78+SmfMWjQIBIEQT4IpY4BVquVTjnlFBo1ahT16tWLgGTX1s7UFfl8Pjr55JPl\nuI444gjq1asXCYJAOp2O7rzzznZn1AsuuKBT7VzT+fe//y23gRw0aBCNHj2aBg8eLJ/1J02a1K4E\n/c4778glkb59+9Lxxx9PGo2GevbsSZs2bZKXk5KuUolHcskll5Ber6fbbruNZsyYQQ888ABNnTqV\nbrnlFrrtttvkxKLUU9Hv99Ppp59OAGjOnDlElCw9S11D0/nPf/4j92iTrlakKyelettnnnmGAOW2\np0REZ5xxBhUVFSm+vm3bNurevTsBoK5du9JJJ51Edrud7HZ7u56D06dPJwApVzVEySuekSNHptR3\nHn744dS1a9eUTgj7Ov7448loNMrJtLKykg499FD5GKuurpb3Ob1eTz/99FPa9Vx66aXUrVs3xe8n\n+eGHH+ReXnq9nvr160eVlZUEJHvsvfLKK4rvlY5ds9mc0jFHup/R9hjdl9SB5sILL6SHH36YHnzw\nQbr33nvpzjvvpKuvvlo+ga1YsSLtSUoURblX5fnnn09ERBs3biSbzUYAaMCAAXTOOefQkCFD5Hwy\nfvx4xZPUr/Gb9Ej76KOPaPLkyXTHHXfQihUr2iWRCy+8MCUhHnLIIXT22WfTo48+Knd/3Lt3L919\n990ZOyE8+eST9K9//YuIkjv72LFj6YorrqD77ruPnnvuOXrxxRfplVdeocWLF1MikaBIJEL9+vVr\n14Pp1VdfpUmTJrXrwvvMM8+Q0WiUS6SiKNIHH3xAl19+OR177LHUs2dPOu200+jxxx/fr+6W8Xic\nli5dShMmTKAePXpQdXU1XXDBBWkb+BMlbzC5XK5Or7+tzZs305133kknnngi9ezZkwYNGkS33357\nu9LvvjweD/3f//0fjR07ls4++2x68MEH014qPvzww+0u1dtav359ykG/78Nms8klpS+++IImTpzY\nrnqKKFm6eu655+TSSb9+/eiee+7J+LmbNm2i8ePHyyeK9evX06OPPqp4mRiLxejWW29tlwT3tXbt\nWlq5cmXGz41Go7Ro0SK65JJLaMSIEXTdddel7fK+fv16uuqqq9Ie0LFYjObMmSPvV3//+98zfu6m\nTZvorrvukr/bBRdc0O4YO+ecc+ixxx5r1xtrXx999BE9//zzGb+fJBAI0EsvvUTDhw+nqqoq6t27\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "import numpy as np\n", + "\n", + "plt.xkcd()\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(1, 1, 1)\n", + "ax.spines['right'].set_color('none')\n", + "ax.spines['top'].set_color('none')\n", + "plt.xticks([])\n", + "plt.yticks([])\n", + "ax.set_ylim([-30, 10])\n", + "\n", + "data = np.ones(100)\n", + "data[70:] -= np.arange(30)\n", + "\n", + "plt.annotate(\n", + " 'THE DAY I REALIZED\\nI COULD COOK BACON\\nWHENEVER I WANTED',\n", + " xy=(70, 1), arrowprops=dict(arrowstyle='->'), xytext=(15, -10))\n", + "\n", + "plt.plot(data)\n", + "\n", + "plt.xlabel('time')\n", + "plt.ylabel('my overall health')\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(1, 1, 1)\n", + "ax.bar([-0.125, 1.0-0.125], [0, 100], 0.25)\n", + "ax.spines['right'].set_color('none')\n", + "ax.spines['top'].set_color('none')\n", + "ax.xaxis.set_ticks_position('bottom')\n", + "ax.set_xticks([0, 1])\n", + "ax.set_xlim([-0.5, 1.5])\n", + "ax.set_ylim([0, 110])\n", + "ax.set_xticklabels(['CONFIRMED BY\\nEXPERIMENT', 'REFUTED BY\\nEXPERIMENT'])\n", + "plt.yticks([])\n", + "\n", + "plt.title(\"CLAIMS OF SUPERNATURAL POWERS\")\n", + "\n", + "plt.show()" + ] + } + ], + "metadata": { + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/fixtures/.ipynb_checkpoints/3_Conclusion-checkpoint.ipynb b/tests/fixtures/.ipynb_checkpoints/3_Conclusion-checkpoint.ipynb new file mode 100644 index 0000000..db90c3f --- /dev/null +++ b/tests/fixtures/.ipynb_checkpoints/3_Conclusion-checkpoint.ipynb @@ -0,0 +1,45 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook 3" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "The end." + ] + } + ], + "metadata": { + "final_answer": 42, + "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" + }, + "test_meta": { + "title": "Page 3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/fixtures/.ipynb_checkpoints/Header-checkpoint.ipynb b/tests/fixtures/.ipynb_checkpoints/Header-checkpoint.ipynb new file mode 100644 index 0000000..5c18b0c --- /dev/null +++ b/tests/fixtures/.ipynb_checkpoints/Header-checkpoint.ipynb @@ -0,0 +1,41 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# In the beginning, there was House Music" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/fixtures/.ipynb_checkpoints/_4_Python_Private-checkpoint.ipynb b/tests/fixtures/.ipynb_checkpoints/_4_Python_Private-checkpoint.ipynb new file mode 100644 index 0000000..01d9ae3 --- /dev/null +++ b/tests/fixtures/.ipynb_checkpoints/_4_Python_Private-checkpoint.ipynb @@ -0,0 +1,41 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hidden, Normally" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/fixtures/01_Just_A_Text_File.txt b/tests/fixtures/01_Just_A_Text_File.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/1_Some_Extras/1_Intro_In_Sub.ipynb b/tests/fixtures/1_Some_Extras/1_Intro_In_Sub.ipynb new file mode 100644 index 0000000..a9bb04a --- /dev/null +++ b/tests/fixtures/1_Some_Extras/1_Intro_In_Sub.ipynb @@ -0,0 +1,41 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sub Notebook" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/fixtures/Header.ipynb b/tests/fixtures/Header.ipynb new file mode 100644 index 0000000..5c18b0c --- /dev/null +++ b/tests/fixtures/Header.ipynb @@ -0,0 +1,41 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# In the beginning, there was House Music" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/fixtures/_4_Python_Private.ipynb b/tests/fixtures/_4_Python_Private.ipynb new file mode 100644 index 0000000..01d9ae3 --- /dev/null +++ b/tests/fixtures/_4_Python_Private.ipynb @@ -0,0 +1,41 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hidden, Normally" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/test_merge.py b/tests/test_merge.py index 3459620..091fdf3 100644 --- a/tests/test_merge.py +++ b/tests/test_merge.py @@ -3,7 +3,7 @@ import unittest from nbformat import reads -from nbmerge import merge_notebooks, main +from nbmerge import merge_notebooks, main, parse_plan SELF_DIR = os.path.abspath(os.path.dirname(__file__)) @@ -14,6 +14,10 @@ for file_name in ("1_Intro", "2_Middle", "3_Conclusion")] +def file_names_from(file_paths): + return [os.path.basename(f) for f in file_paths] + + class TestMerge(unittest.TestCase): def _validate_merged_three(self, merged): self.assertEqual(len(merged.cells), 6) @@ -23,6 +27,19 @@ def _validate_merged_three(self, merged): def test_merge(self): self._validate_merged_three(merge_notebooks(TARGET_NBS)) + def test_parse_plan(self): + header_nb = os.path.join(FIXTURES_DIR, "Header.ipynb") + plan = parse_plan(["-o", "myfile.ipynb", + "-f", "(_|1|2)_.*", + "-i", "-r", "-v", + header_nb]) + + self.assertEqual(file_names_from(plan['notebooks']), + ["Header.ipynb", "1_Intro.ipynb", + "1_Intro_In_Sub.ipynb", "2_Middle.ipynb"]) + self.assertTrue(plan["verbose"]) + self.assertEqual(plan["output_file"], "myfile.ipynb") + def test_main(self): if not hasattr(sys.stdout, "getvalue"): self.fail("need to run in buffered mode")