<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div><br></div><blockquote type="cite"> <div><br></div><div>1. What would you consider to be a good "API"?</div><div>          well-documented, intuitive, best guess works, pythonic, do people have any examples of what they consider a good API/project?</div></blockquote><div><br class="webkit-block-placeholder"></div><div>If you are going with a Python API, then the zope.interface and zope.schema packages provides a good way of formally describing a Python API:</div><div><br class="webkit-block-placeholder"></div><div> - <a href="http://pypi.python.org/pypi/zope.interface">http://pypi.python.org/pypi/zope.interface</a></div><div><br class="webkit-block-placeholder"></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica"> - <a href="http://pypi.python.org/pypi/zope.schema">http://pypi.python.org/pypi/zope.schema</a></font></div></div><div><br class="webkit-block-placeholder"></div><div>If you have a formally described data schema for your applications input/ouptut objects used by your API (e.g. input = "Integer named 'foo' whose value is &gt; 0 and &lt; 10", output = "Float name 'result'"), then it's not too hard to automatically map those to a web service API or set of HTML views. It's also a convention with these packages that those interfaces that are stable are put into a file named 'interfaces.py', e.g. the new plone4bio interfaces:</div><div><br class="webkit-block-placeholder"></div><div><a href="http://www.plone4bio.org/trac/browser/plone4bio.base/trunk/plone4bio/base/interfaces.py">http://www.plone4bio.org/trac/browser/plone4bio.base/trunk/plone4bio/base/interfaces.py</a></div><div><br class="webkit-block-placeholder"></div><div>Also, if doing the Python API route and using more than just plain Python, it's invaluable to have a build tool that can be used to compile and configure all of the moving parts of your application. You can use this to make it much easier for end users to install the software on whatever platform they happen to be running, as well as to bring new developers on your team quickly up to speed. As a sysadmin it sucks to have a bioinformatician ask for some software to be made available on our servers and realize that the project only has an error-filled 12 page INSTALL.txt file (even if the INSTALL.txt continually re-assures the frustrated sysadmin that "CPAN is great")!</div><div><br class="webkit-block-placeholder"></div><div>For example, the PrimaGIS guys depend upon *a lot* of stuff, so they maintain a "buildout" project that will compile and configure all of the parts required to run their system:</div><div><br class="webkit-block-placeholder"></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica"><a href="http://trac.gispython.org/projects/PrimaGIS/wiki/PrimaGISBuildout">http://trac.gispython.org/projects/PrimaGIS/wiki/PrimaGISBuildout</a></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br class="webkit-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">I've used both BuildIt and zc.buildout, both are good products - the PrimaGIS project is a good example of complex buildout using BuildIt. zc.buildout is a fairly new project, but it's being used by the Zope/Plone folks so there are already a lot of "recipes" that can be used to install assorted parts that your app might depend upon:</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br class="webkit-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica"> - <a href="http://agendaless.com/Members/chrism/software/buildit/">http://agendaless.com/Members/chrism/software/buildit/</a></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br class="webkit-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica"> - <a href="http://pypi.python.org/pypi/zc.buildout">http://pypi.python.org/pypi/zc.buildout</a></font></div></div></div></div><div><br class="webkit-block-placeholder"></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica"> - zc.buildout recipes: <a href="http://pypi.python.org/pypi?:action=browse&amp;c=512">http://pypi.python.org/pypi?:action=browse&amp;c=512</a></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br class="webkit-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "> - zc.buildout "configure; make; make install" recipe: <a href="http://pypi.python.org/pypi/zc.recipe.cmmi/">http://pypi.python.org/pypi/zc.recipe.cmmi/</a></div></div><div><br class="webkit-block-placeholder"></div><div><br></div><blockquote type="cite"> </blockquote></body></html>