[Distutils] local development scenarios

Todd Greenwood-Geer tgreenwoodgeer at yahoo.com
Fri Dec 9 06:57:28 CET 2005


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Phillip -

This is great feedback. I wrote this tutorial for myself because, in the
course of writing a more involved application, I realized that I did not
really understand how to use the egg/setuptools functionality. So, the
example is definitely contrived.

So, if I may summarize your guidelines:

1. Add complexity as needed
~ a) keep source in the root dir unless there is a need to differentiate
~ disparate types of files, such as source/docs/tests/etc
~ b) use the svn copy of ez_setup.py rather than checking this in to the
repository

2. Clear use of names
~ a) use different names for packages and modules
~ b) again, nest only as necessary

And, above all else, never admit to having a java background ;o).

Thanks again. I'll re-factor as suggested and throw this at you one more
time.

- -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.
|
|
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFDmRzIz6uXX4lQc/URAsaWAKCXNcWjf7o59m2MgM2B8Nmx1CfLewCgpqOW
wA2wfi08C4RPW151NngP7BU=
=N5e6
-----END PGP SIGNATURE-----


More information about the Distutils-SIG mailing list