<div dir="ltr">Thanks for this very nice summary, Roland.<div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Note that all of these rely on the client to do the right thing. With<br>bitbucket you cannot use the pre-receive hooks that git offers to<br>reject commits that contain output (see...</blockquote></div><div><br></div><div>Cool. I have heard of folks adding black (<a href="https://github.com/psf/black">https://github.com/psf/black</a>) hooks to git to ensure that Python codes are consistently formatted at every git push.</div><div><br></div><div>I want NRPy+ development to be as kind as possible to the developer, while maintaining rigorous standards for documentation, modularity, validation tests, CI, etc. Maybe we can discuss further in a future ETK call or offline.</div><div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div style="font-size:12.8px">-Zach</div><div style="font-size:12.8px"><br></div><span style="font-size:12.8px">*     *     *</span><br style="font-size:12.8px"><span style="font-size:12.8px">Prof. Zachariah Etienne</span></div><div dir="ltr">Physics &amp; Astronomy Dept.<br style="font-size:12.8px"><div style="font-size:12.8px">West Virginia University</div><div><a href="http://astro.phys.wvu.edu/zetienne/" target="_blank">http://astro.phys.wvu.edu/zetienne/</a></div><div><a href="http://blackholesathome.net/" target="_blank">http://blackholesathome.net</a><a href="https://blackholesathome.net" style="font-size:12.8px" target="_blank"><br></a><br></div></div></div></div></div></div></div></div></div></div></div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Nov 4, 2019 at 1:30 PM Haas, Roland &lt;<a href="mailto:rhaas@illinois.edu">rhaas@illinois.edu</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello all,<br>
<br>
there has been a lengthy discussion at one point about how to include<br>
jupyter notebooks in repositories.<br>
<br>
You may still be able to find it on the mailing list or in a ticket<br>
(if it indeed happened there, I am not sure).<br>
<br>
In the end, the solution is usually to do what Erik mentioned, i. e.<br>
remove all output before committing to the repository. <br>
<br>
We are (obviously) not the first ones hit by this and there are (more or<br>
less) convenient tools to help with this:<br>
<br>
<a href="https://stackoverflow.com/questions/18734739/using-ipython-notebooks-under-version-control" rel="noreferrer" target="_blank">https://stackoverflow.com/questions/18734739/using-ipython-notebooks-under-version-control</a><br>
<br>
with the most feature-full solution being:<br>
<br>
<a href="https://github.com/kynan/nbstripout" rel="noreferrer" target="_blank">https://github.com/kynan/nbstripout</a><br>
<br>
Note that all of these rely on the client to do the right thing. With<br>
bitbucket you cannot use the pre-receive hooks that git offers to<br>
reject commits that contain output (see<br>
<a href="https://jira.atlassian.com/browse/BCLOUD-10471" rel="noreferrer" target="_blank">https://jira.atlassian.com/browse/BCLOUD-10471</a>).<br>
<br>
Yours,<br>
Roland<br>
<br>
&gt; Hi Erik,<br>
&gt; <br>
&gt; Thanks for the feedback, and sorry to hear about the frustration. Indeed<br>
&gt; BaikalETK is only a proof-of-principle code at the moment, in which the<br>
&gt; second stage of development (copying the code blocks in the Jupyter<br>
&gt; notebook to a proper, callable, git-friendly Python module) hasn&#39;t been<br>
&gt; completed yet. I&#39;m hoping that with more resources to combine ETK &amp; NRPy+<br>
&gt; development, the full modularization of all the ETK Jupyter notebooks can<br>
&gt; be completed.<br>
&gt; <br>
&gt; &gt;  The only way I see is to undo my changes (&quot;git checkout&quot;), and then pull  <br>
&gt; your changes. In this case that&#39;s fine because there are no major changes,<br>
&gt; but if I had made changes I&#39;d be in trouble.<br>
&gt; <br>
&gt; I generally do a `git diff` if `git pull` complains about conflicts, and<br>
&gt; it&#39;s usually easy to see if anything significant has changed (and then do<br>
&gt; `git checkout` if not). Maybe if I chose a standard way of prefixing lines<br>
&gt; that are ignorable comments (e.g., &quot;COMMENT: Finished BSSN symbolic<br>
&gt; expressions in&quot;) a simple script could be written that checks for trivial<br>
&gt; differences like these. Removing all output isn&#39;t a good idea as it would<br>
&gt; wipe away the &quot;standard&quot; output displayed on nbviewer (<br>
&gt; <a href="https://nbviewer.jupyter.org/github/zachetienne/nrpytutorial/blob/master/NRPyPlus_Tutorial.ipynb" rel="noreferrer" target="_blank">https://nbviewer.jupyter.org/github/zachetienne/nrpytutorial/blob/master/NRPyPlus_Tutorial.ipynb</a>)<br>
&gt; in case the user wants only to learn from the Jupyter documentation.<br>
&gt; <br>
&gt; Also if in doubt, one can simply compare the thorn output from the master<br>
&gt; Jupyter notebook with your own version. We&#39;re making it easier to redirect<br>
&gt; all NRPy+ output to whatever directory you like, so that such diffs can be<br>
&gt; made quickly and easily.<br>
&gt; <br>
&gt; -Zach<br>
&gt; <br>
&gt; *     *     *<br>
&gt; Prof. Zachariah Etienne<br>
&gt; Physics &amp; Astronomy Dept.<br>
&gt; West Virginia University<br>
&gt; <a href="http://astro.phys.wvu.edu/zetienne/" rel="noreferrer" target="_blank">http://astro.phys.wvu.edu/zetienne/</a><br>
&gt; <a href="http://blackholesathome.net" rel="noreferrer" target="_blank">http://blackholesathome.net</a><br>
&gt; &lt;<a href="https://blackholesathome.net" rel="noreferrer" target="_blank">https://blackholesathome.net</a>&gt;<br>
&gt; <br>
&gt; <br>
&gt; On Mon, Nov 4, 2019 at 11:56 AM Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt;<br>
&gt; wrote:<br>
&gt; <br>
&gt; &gt; On Mon, Nov 4, 2019 at 8:38 AM Zach Etienne &lt;<br>
&gt; &gt; <a href="mailto:trac-noreply@einsteintoolkit.org" target="_blank">trac-noreply@einsteintoolkit.org</a>&gt; wrote:<br>
&gt; &gt;  <br>
&gt; &gt;&gt; #2064: Add GiRaFFE to the Einstein Toolkit<br>
&gt; &gt;&gt; Reporter: Zach Etienne<br>
&gt; &gt;&gt; Status: open<br>
&gt; &gt;&gt; Milestone: ET_2019_10<br>
&gt; &gt;&gt; Version: development version<br>
&gt; &gt;&gt; Type: enhancement<br>
&gt; &gt;&gt; Priority: minor<br>
&gt; &gt;&gt; Component: EinsteinToolkit thorn<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Comment (by Zach Etienne):<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; @Ian Hinder : Version control with Jupyter is only slightly more<br>
&gt; &gt;&gt; difficult than with plain source code, as its JSON is plaintext.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Is it a good idea to pull the whole code into notebooks? I don’t know how<br>
&gt; &gt;&gt; sustainable it is when you have multiple contributors; merging changes from<br>
&gt; &gt;&gt; different people can become very difficult.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Writing the Jupyter notebook is only the first step in NRPy+ development,<br>
&gt; &gt;&gt; but arguably the most important as it contains the documentation and some<br>
&gt; &gt;&gt; validation checks. I’d liken the Jupyter notebook phase more to<br>
&gt; &gt;&gt; collaboratively writing a journal article with a shared git repo than code<br>
&gt; &gt;&gt; development within such a repo.<br>
&gt; &gt;&gt;  <br>
&gt; &gt;<br>
&gt; &gt; I&#39;d like to add a point to this, out of frustration:<br>
&gt; &gt;<br>
&gt; &gt; A few weeks ago I downloaded and ran Tutorial-BaikalETK.ipynb. Today I try<br>
&gt; &gt; to &quot;git pull&quot;, and it doesn&#39;t work, because there are differences in the<br>
&gt; &gt; output everywhere (e.g. &quot;Finished BSSN symbolic expressions in<br>
&gt; &gt; 1.2987918853759766 seconds&quot;). The only way I see is to undo my changes<br>
&gt; &gt; (&quot;git checkout&quot;), and then pull your changes. In this case that&#39;s fine<br>
&gt; &gt; because there are no major changes, but if I had made changes I&#39;d be in<br>
&gt; &gt; trouble.<br>
&gt; &gt;<br>
&gt; &gt; I think the problem is that the output is stored in the git repo. In the<br>
&gt; &gt; future, you might want to switch to a system where (a) notebooks<br>
&gt; &gt; automatically have all output removed before they are committed, and (b)<br>
&gt; &gt; upon commit, Travis or a similar system creates for-viewing-only notebooks<br>
&gt; &gt; with a standardized output.<br>
&gt; &gt;<br>
&gt; &gt; -erik<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;  <br>
&gt; &gt;&gt; After the notebook has been written, a separate Python module containing<br>
&gt; &gt;&gt; the code developed in the Jupyter notebook is then written. At the bottom<br>
&gt; &gt;&gt; of every NRPy+ Jupyter notebook it is required to include a self-validation<br>
&gt; &gt;&gt; check against the separate Python module (many NRPy+ Jupyter notebooks have<br>
&gt; &gt;&gt; additional validation checks). Further, all NRPy+ Python modules must<br>
&gt; &gt;&gt; include proper unit testing on all symbolic expressions generated, so that<br>
&gt; &gt;&gt; Travis CI can confirm agreement with the trusted version. This has the nice<br>
&gt; &gt;&gt; consequence of often requiring developers to update the documentation any<br>
&gt; &gt;&gt; time the module is updated in order for the Jupyter notebook to pass<br>
&gt; &gt;&gt; self-validation tests, though generally NRPy+ developers prefer updating<br>
&gt; &gt;&gt; the Jupyter notebooks as a first step, then propagating changes to the<br>
&gt; &gt;&gt; module &amp; unit tests. Proper documentation makes our lives much easier and<br>
&gt; &gt;&gt; is the foundation of a sustainable codebase.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; The above approach has worked fine with multiple contributors so far, as<br>
&gt; &gt;&gt; NRPy+ is extremely modular, with 70+ Python modules &amp; about 100 Jupyter<br>
&gt; &gt;&gt; notebooks. Also I generally don’t put multiple students on exactly the same<br>
&gt; &gt;&gt; project (though they certainly do interact and benefit from each others&#39;<br>
&gt; &gt;&gt; documentation). Thus<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; --<br>
&gt; &gt;&gt; Ticket URL:<br>
&gt; &gt;&gt; <a href="https://bitbucket.org/einsteintoolkit/tickets/issues/2064/add-giraffe-to-the-einstein-toolkit" rel="noreferrer" target="_blank">https://bitbucket.org/einsteintoolkit/tickets/issues/2064/add-giraffe-to-the-einstein-toolkit</a><br>
&gt; &gt;&gt; _______________________________________________<br>
&gt; &gt;&gt; Trac mailing list<br>
&gt; &gt;&gt; <a href="mailto:Trac@einsteintoolkit.org" target="_blank">Trac@einsteintoolkit.org</a><br>
&gt; &gt;&gt; <a href="http://lists.einsteintoolkit.org/mailman/listinfo/trac" rel="noreferrer" target="_blank">http://lists.einsteintoolkit.org/mailman/listinfo/trac</a><br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;  <br>
&gt; &gt;<br>
&gt; &gt; --<br>
&gt; &gt; Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt;<br>
&gt; &gt; <a href="http://www.perimeterinstitute.ca/personal/eschnetter/" rel="noreferrer" target="_blank">http://www.perimeterinstitute.ca/personal/eschnetter/</a><br>
&gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; Users mailing list<br>
&gt; &gt; <a href="mailto:Users@einsteintoolkit.org" target="_blank">Users@einsteintoolkit.org</a><br>
&gt; &gt; <a href="http://lists.einsteintoolkit.org/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.einsteintoolkit.org/mailman/listinfo/users</a><br>
&gt; &gt;  <br>
<br>
<br>
<br>
-- <br>
My email is as private as my paper mail. I therefore support encrypting<br>
and signing email messages. Get my PGP key from <a href="http://pgp.mit.edu" rel="noreferrer" target="_blank">http://pgp.mit.edu</a> .<br>
</blockquote></div>