<div dir="ltr"><div class="gmail_default"><div class="gmail_default"><font face="trebuchet ms, sans-serif">Actually, Bread's setup is fine; it's not doing anything interesting.</font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif">It's Jam's setup that's the problem.</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">Robert's mention of `setup_requires` led me to</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><a href="http://stackoverflow.com/a/12061891/6364">http://stackoverflow.com/a/12061891/6364</a>, which gave me the hint</font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif">I needed: create a separate `Distribution` object before calling `setup`</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">which defines the `setup_requires` entries.</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">Jam's `setup.py` now looks like:</font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">     </span>from setuptools import setup, dist</font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">     </span>dist.Distribution(dict(setup_requires='Bread'))</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">  </span>from bread.setup_topping import *</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">  </span>setup(</font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">         </span>name='Jam',</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">             </span>version='0.2',</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>long_description=open('README.md').read(),</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>**topping_setup_options</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">      </span>)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre"> </span># Remove *.egg left by bootstrapping Bread</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">      </span>cleanup_bread_bootstrap()</font></div>
<div class="gmail_default"><span class="" style="white-space:pre"><font face="trebuchet ms, sans-serif">      </font></span></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif">And `bread/setup_topping.py` looks like:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">   </span>from setuptools.command.bdist_egg import bdist_egg as _bdist_egg</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">      </span>import os, fnmatch, glob, shutil</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br>
</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">     </span>def recursive_data_files(treeroot, pattern):</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">            </span>results = []</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>for base, dirs, files in os.walk(treeroot):</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                     </span>goodfiles = fnmatch.filter(files, pattern)</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>if goodfiles:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                           </span>results.append((base, [os.path.join(base, f) for f in goodfiles]))</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>return results</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">      </span>def make_data_files(output='output'):</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">           </span>return (</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>[('', ['bread.yaml'])]</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                  </span>+ recursive_data_files(output, '*')</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre"> </span>class bdist_egg(_bdist_egg):</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">            </span>def initialize_options(self):</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>bake_bread()    # build files to './output'</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                   </span>self.distribution.data_files = make_data_files()</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>_bdist_egg.initialize_options(self)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br>
</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">     </span>topping_setup_options = dict(</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">           </span>cmdclass={</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>'bdist_egg': bdist_egg,</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">         </span>},</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>install_requires=[</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>'Bread',</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>],</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">              </span>zip_safe=False,</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">      </span>)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default">
<font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre"> </span>def cleanup_bread_bootstrap(root='.'):</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">          </span>for f in glob.glob(os.path.join(os.path.abspath(root), '*.egg')):</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>if os.path.isdir(f):</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                            </span>shutil.rmtree(f)  # Egg directory</font></div>
<div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                      </span>else:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><span class="" style="white-space:pre">                           </span>os.remove(f)      # Zipped Egg</font></div>
<div style="font-family:'trebuchet ms',sans-serif"><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, May 29, 2013 at 2:48 PM, zooko <span dir="ltr"><<a href="mailto:zooko@zooko.com" target="_blank">zooko@zooko.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Here is my explanation of why it can be problematic if you import Bread in<br>
Bread's setup.py:<br>
<br>
<a href="https://bugs.launchpad.net/nevow/+bug/812537/comments/3" target="_blank">https://bugs.launchpad.net/nevow/+bug/812537/comments/3</a><br>
<br>
If you do want to import dependencies of Bread in Bread's setup.py, and if your<br>
build tool (e.g. setuptools) supports it, then you could add the dependencies<br>
to the "setup_requires" list.<br>
<br>
If possible, maybe you could move some of this work from setup.py-time (whether<br>
build-time or install-time) to "first time I run" or a custom "initialize me<br>
now" command of Bread. I think setup.py is a sub-optimal place to do stuff,<br>
because there are a lot of complicated things going then and there, and because<br>
it is very inconvenient to write unit tests of setup.py behavior.<br>
<br>
Regards,<br>
<br>
Zooko<br>
</blockquote></div><br></div>