[Distutils] Easy Install / Setup Tools Example

Todd Greenwood-Geer tgreenwoodgeer at yahoo.com
Thu Dec 15 07:00:49 CET 2005


I've taken to heart your suggestions. The result is what I hope is a 
very simple example / tutorial that demonstrates:

  * the file structure of a project destined to be an egg
  * how to use doctests and unit tests with setuptools / eggs
  * how to build and deploy an egg
  * how to register with pypi
  * how to (and not to) generate wrapper scripts
  * how to write documentation using restructured text

Instructions:
$ easy_install SimpleExampleEgg

That's it. You have now installed v 0.2. The tutorial docs
are the egg:

/usr/lib/python2.4/site-packages/SimpleExampleEgg-0.2-py2.4.egg:fruit/docs/readme.html

Could I get a quick review of this? I'm attaching the readme.html.

-Todd

Phillip J. Eby wrote:
> At 08:27 PM 12/8/2005 -0800, Todd Greenwood-Geer wrote:
> small_unittest.py::
> 
>>         import small
>>         import unittest
>>         import doctest
>>
>>         def getTestSuite():
>>                 suite = unittest.TestSuite()
>>                 for mod in small,:
>>                         suite.addTest(doctest.DocTestSuite(mod))
>>                 return suite
>>
>>         runner = unittest.TextTestRunner()
>>         runner.run(getTestSuite())
> 
> If 'small.small_unittest' is the actual name of the module, then doing this:
> 
>    python -c "from unittest import main; main(None)" 
> small.small_unittest.getTestSuite
> 
> will run the test, even if it's inside an egg.  No unzipping is 
> necessary.  If the egg wasn't installed with a .pth file (i.e. 
> --multi-version or to a non-standard location), you'll need to make sure 
> it's on PYTHONPATH, along with its dependencies.
> 
>> Here is what the src tree for the simple example looks like:
>>
>> dir listing::
>>
>>         small/src/small/test/test.txt
>>         small/src/small/small2.py
>>         small/src/small/small.py
>>         small/src/small/small_unittest.pyc
>>         small/src/small/__init__.py
>>         small/src/small/small_unittest.py
>>         small/src/small_unittest.py
> 
> This looks like a duplicate.  I'm also not sure why you have a small2, or 
> why you bother having a separate test subdirectory.  Indeed, for this 
> "small" of an example, a src/ directory is probably overkill.  For clarity, 
> I'd also suggest calling the topmost directory something like SmallExample 
> to help distinguish your project name (SmallExample) from your package name 
> (small).
> 
>>         small/setup_mult.py
> 
> What's this file for?
> 
> 
>>         small/ez_setup.py
> 
> If you're using Subversion, btw, you can use the svn:externals trick so 
> that you don't have to manually maintain this file; see the setuptools 
> manual under:
> 
> http://peak.telecommunity.com/DevCenter/setuptools#using-setuptools-without-bundling-it
> 
> 
> 
>> The thing to note here is how small.small and small.small2 are referenced::
>>
>>         from small import small as s1
>>         from small import small2 as s2
>>
>> For some reason, this gave me plenty of problems.
> 
> It's generally not a good idea to name a module the same as a package, and 
> definitely not the same as a class within the module, or else it gets 
> unclear in code which one you're talking about.  In a language like Java, 
> there's no such ambiguity because syntactically you can't refer to a class 
> where a package should be or vice versa, but in Python there are only 
> objects, so you should not name them all the same thing or you (and/or the 
> interpreter) will be confused.  :)
> 
> Similarly, I suspect that your example has way too many files perhaps 
> because you have a Java background?  It really isn't necessary to split 
> Python projects up into so many small pieces; it just makes more work for 
> you and doesn't get you any benefit until the files get too large to 
> conveniently work with.
> 
> 
>> Complex Case
>> ------------
>>
>> The complex case splits out the test modules into a nested package 
>> hierarchy like this:
> ...
>> Package Hierarchy
>> +++++++++++++++++
>>
>> package hierarchy::
>>
>>         small/src/
>>         small/src/size/
>>         small/src/size/small
>>         small/src/size/large
> 
> Ouch.  I thought the previous example was the complex one.  ;)  Seriously, 
> your simple example is way more complex than it needs to be.  This bigger 
> one makes my head hurt, so I'm not going to try to comment on it further, 
> except to suggest that its top-level directory should be named 
> "small-mult-test" since that's your project name.  Also, I'm guessing you 
> mean your package hiearchy is size, size.small, and size.large.  The 
> small/src stuff isn't part of the package hierarchy, just the directory 
> hierarchy.
> 
> By the way, the only reason to have a 'src' directory under your main 
> project directory is if you have a bunch of stuff that's *not* source code 
> there.  Such as documentation, documentation directories, test directories, 
> examples, etc.  Your projects here have none of those things, only a setup 
> script, so there's no reason to have a 'src' subdirectory; you could just 
> put the 'small' or 'size' package directly under the project directory, and 
> in fact this is the most common layout for published Python packages.  The 
> 'src' or 'lib' subdirectory approach is mainly used by large projects with 
> a lot of other things in their project directory, and by people who got 
> used to that format by working on large projects.  :)
> 
> 
>>         from size.small import small
>>         from size.large import large
> 
> I said I wasn't going to comment further, but this is technically a 
> repetition of my earlier comment: please don't name packages and modules 
> the same thing, you will confuse yourself and everyone else who will never 
> be sure if 'small' means 'size.small' or 'size.small.small' or worse, 
> 'size.small.small.small'.  Eeek!
> 
> 
>>  * url : need to see if that works for downloading dependencies (next 
>> tutorial, not this one)
> 
> Yes, it does, *if* you register your package with PyPI.  The URL given will 
> be scanned for download links when and if easy_install looks for your 
> package on PyPI.
> 
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/distutils-sig/attachments/20051214/12eb0df8/readme-0001.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: OpenPGP digital signature
Url : http://mail.python.org/pipermail/distutils-sig/attachments/20051214/12eb0df8/signature-0001.pgp


More information about the Distutils-SIG mailing list