[setuptools] How to maintain version strings?

Annoying little issue: I have version strings here and there in my projects, and would prefer to keep the version in a single place. In particular, I have __version__ strings in module code, and also in setup.py.
I also want to avoid importing code from setup.py, because people sometimes want to install using a Python executable other than the one with which they intend to import the package (I assume that's sensible & possible with setuptools packages), and imports in setup.py have broken that in the past.
Seems I can't just open('mymodule.py') and find the version string with a regexp, I assume because of setuptools' "sandbox". So, I just have to have my release script check that I remembered to update both. No big deal, but it annoys me :-)
Anybody have a way of doing this (or a slap to my forehead to teach me the simple way to do it ;-)?
John

At 02:47 PM 12/18/2005 +0000, John J Lee wrote:
I also want to avoid importing code from setup.py, because people sometimes want to install using a Python executable other than the one with which they intend to import the package (I assume that's sensible & possible with setuptools packages), and imports in setup.py have broken that in the past.
It's also a big problem if you have dependencies that you import; setuptools doesn't install your dependencies until after the setup script has effectively run to completion, so you might be trying to import stuff that's not yet installed.
Seems I can't just open('mymodule.py') and find the version string with a regexp, I assume because of setuptools' "sandbox".
I don't see why not; the sandbox should only restrict *writing* to files, not reading them, and in any case it only restricts writing *outside* the subdirectory tree where the setup script is located.
Anybody have a way of doing this (or a slap to my forehead to teach me the simple way to do it ;-)?
The 'networkx' project on PyPI does this by having a 'release.py' inside the main package that contains all the variables that need to be shared between the package and the setup script. The setup script uses execfile('packagename/release.py') to obtain the variables, while the package does a 'from release import *'. Thus, the variables are in a single file.
I use a slightly different technique myself; PEAK includes a tool called 'version' that can automatically edit a variety of files and update the included version numbers in a variety of user-defined formats. When I bump setuptools alpha versions, I just run "version incr build" to bump the micro number. When I move from say, 0.6 to 0.7, I run "version incr minor". Anyway, it basically works by having a configuration file describing what to search for and edit in each file that contains the version number, as well as what parts there are in my versioning scheme and the different formats for "spelling" that versioning scheme. The configuration file itself has a "#!peak version-config" line that makes it executable, so I just run it to update my release scripts, setup.py, __version__ variables, etc.
I believe there is at least one other tool out there that does something similar on SourceForge, but I don't remember its name.
participants (2)
-
John J Lee
-
Phillip J. Eby