Upload the filter and install script

This commit is contained in:
Gijs Vermariën 2019-07-01 13:19:39 +02:00
commit 68f0df96a9
3 changed files with 118 additions and 0 deletions

1
README.md Normal file
View File

@ -0,0 +1 @@
A tool for scrubbing .ipynb files before each git commands applies to them

11
install.sh Normal file
View File

@ -0,0 +1,11 @@
TARGETDIR=~/.scripts/
SCRIPT=ipynb_drop_output.py
mkdir $TARGETDIR
cp ./${SCRIPT} $TARGETDIR
chmod +x $TARGETDIR$SCRIPT
touch ~/.gitattributes
echo "*.ipynb filter=clean_ipynb" > ~/.gitattributes
git config --global core.attributesfile ~/.gitattributes
git config --global filter.clean_ipynb.clean $TARGETDIR$SCRIPT
git config --global filter.clean_ipynb.smudge cat
echo "installed the ipynb filter"

106
ipynb_drop_output.py Executable file
View File

@ -0,0 +1,106 @@
#!/usr/bin/env python
"""
Suppress output and prompt numbers in git version control.
This script will tell git to ignore prompt numbers and cell output
when looking at ipynb files if their metadata contains:
"git" : { "suppress_output" : true }
The notebooks themselves are not changed.
See also this blogpost: http://pascalbugnion.net/blog/ipython-notebooks-and-git.html.
Usage instructions
==================
Make a .sh file of the following lines, and run this in order to enable the filter
--------------
TARGETDIR=~/.scripts/
SCRIPT=ipynb_drop_output.py
mkdir $TARGETDIR
cp ./${SCRIPT} $TARGETDIR
chmod +x $TARGETDIR$SCRIPT
touch ~/.gitattributes
echo "*.ipynb filter=clean_ipynb" > ~/.gitattributes
git config --global core.attributesfile ~/.gitattributes
git config --global filter.clean_ipynb.clean $TARGETDIR$SCRIPT
git config --global filter.clean_ipynb.smudge cat
echo "installed the ipynb filter"
To tell git to ignore the output and prompts for a notebook,
open the notebook's metadata (Edit > Edit Notebook Metadata). A
panel should open containing the lines:
--------------
Or by hand:
1. create ~/.scripts and paste the ipynb_drop_output.py into it
2. Give it execution permission with chmod +x ~/.scripts/ipynb_drop_output.py
3. Create ~/.gitattributes and paste the following text into it: "*.ipynb filter=clean_ipynb"
4. Execute the following commands:
git config --global core.attributesfile ~/.gitattributes
git config --global filter.clean_ipynb.clean ~/.scripts/ipynb_drop_output.py
git config --global filter.clean_ipynb.smudge cat
Your outputs should now be filtered!
{
"name" : "",
"signature" : "some very long hash"
}
Add an extra line so that the metadata now looks like:
{
"name" : "",
"signature" : "don't change the hash, but add a comma at the end of the line",
"git" : { "suppress_outputs" : true }
}
You may need to "touch" the notebooks for git to actually register a change, if
your notebooks are already under version control.
Notes
=====
This script is inspired by http://stackoverflow.com/a/20844506/827862, but
lets the user specify whether the ouptut of a notebook should be suppressed
in the notebook's metadata, and works for IPython v3.0.
"""
import sys
import json
nb = sys.stdin.read()
json_in = json.loads(nb)
nb_metadata = json_in["metadata"]
suppress_output = False
#if "git" in nb_metadata:
# if "suppress_outputs" in nb_metadata["git"] and nb_metadata["git"]["suppress_outputs"]:
# suppress_output = True
#if not suppress_output:
# sys.stdout.write(nb)
# exit()
ipy_version = int(json_in["nbformat"])-1 # nbformat is 1 more than actual version.
def strip_output_from_cell(cell):
if "outputs" in cell:
cell["outputs"] = []
if "prompt_number" in cell:
del cell["prompt_number"]
if "execution_count" in cell:
cell["execution_count"] = None
if ipy_version == 2:
for sheet in json_in["worksheets"]:
for cell in sheet["cells"]:
strip_output_from_cell(cell)
else:
for cell in json_in["cells"]:
strip_output_from_cell(cell)
json.dump(json_in, sys.stdout, sort_keys=True, indent=1, separators=(",",": "))