At 08:19 PM 9/20/2005 -0500, Ian Bicking wrote:
Phillip J. Eby wrote:
At 02:59 PM 9/20/2005 -0500, Ian Bicking wrote:
I'm a bit confused about name quoting. I have a package with a name "Todo_SQLObject_ZPT", and egg_info writes to "Todo-SQLObject-ZPT.egg-info". Why? I thought -'s were bad, but _'s were okay...?
It's safe to use either, but setuptools considers '-' to be canonical; this was a heuristic decision on my part because '-' appears more frequently used than '_' in the names of projects currently registered with PyPI.
The problem, however, is that PyPI wants your uploaded files to exactly match the registered name. If you used '-' in setup.py, you must have '-' in the filename, and that's something setuptools cannot do. It would probably be best if setuptools ensured the "register" command always used '_', but then this defeats the purpose of having it that way in the first place!
So, the only real fix is to change PyPI to accept files whose pkg_resources.safe_name() match the safe_name() of the project. In the meantime, you can't upload eggs to PyPI for packages with '-' or '_' in their names. (You can upload source distros or other formats, since those can work with ambiguous filenames.) I probably should put in an RFE or proposed patch, but I've been really busy lately.
Richard, would you be able to make this change? It seems pretty reasonable to accept files that closely match project names.
FYI, here are the safe_name/safe_version source:
def safe_name(name): """Convert an arbitrary string to a standard distribution name
Any runs of non-alphanumeric characters are replaced with a single '-'. """ return re.sub('[^A-Za-z0-9]+', '-', name)
def safe_version(version): """Convert an arbitrary string to a standard version string
Spaces become dots, and all other non-alphanumeric characters become dashes, with runs of multiple dashes condensed to a single dash. """ version = version.replace(' ','.') return re.sub('[^A-Za-z0-9.]+', '-', version)
To make an egg filename, these strings are taken and the '-' converted to a '_' so that it isn't confused with the '-' that goes between parts of the name. So given the metadata:
setup( name="To-Do List", version="1.23 alpha!", ... )
The egg filename will be "To_Do_List-1.23.alpha_-py2.4-win32.egg" if generated by Python 2.4 on Windows (and it contains C extensions). Currently, if I understand it correctly, PyPI will reject this name if the name and version used for registration were "To-Do List" and "1.23 alpha!".