This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Give clear error messages for invalid types used for setup.py params (e.g. tuple for classifiers)
Type: enhancement Stage: resolved
Components: Distutils Versions: Python 3.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: berker.peksag Nosy List: Marco Sulla, berker.peksag, cryvate, eric.araujo, nascheme, ncoghlan, ned.deily, pitrou, serhiy.storchaka, tarek
Priority: normal Keywords: needs review

Created on 2013-11-15 11:24 by berker.peksag, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
setup.py berker.peksag, 2013-11-15 11:24
fix-upload-cmd.diff berker.peksag, 2013-11-15 11:25 review
issue19610.diff berker.peksag, 2013-11-17 08:46 review
issue19610_catch_distribution.diff berker.peksag, 2014-05-16 15:56 review
issue19610_v2.diff berker.peksag, 2014-11-01 09:54 review
issue19610_v3.diff berker.peksag, 2015-03-23 12:40 review
issue19610_v4.diff berker.peksag, 2015-04-08 06:15 review
pip-errors.txt nascheme, 2017-12-02 21:47
Pull Requests
URL Status Linked Edit
PR 4519 merged berker.peksag, 2017-11-23 13:12
PR 4685 merged nascheme, 2017-12-03 04:55
Messages (47)
msg202938 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2013-11-15 11:24
Python 3.4:

$ ../cpython/./python setup.py sdist upload -r test --show-response
...
...
Traceback (most recent call last):
  File "setup.py", line 24, in <module>
    'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)',
  File "/home/berker/projects/cpython/Lib/distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/home/berker/projects/cpython/Lib/distutils/dist.py", line 930, in run_commands
    self.run_command(cmd)
  File "/home/berker/projects/cpython/Lib/distutils/dist.py", line 949, in run_command
    cmd_obj.run()
  File "/home/berker/projects/cpython/Lib/distutils/command/upload.py", line 65, in run
    self.upload_file(command, pyversion, filename)
  File "/home/berker/projects/cpython/Lib/distutils/command/upload.py", line 165, in upload_file
    body.write(value)
TypeError: 'str' does not support the buffer interface


Python 3.3:

$ python3.3 setup.py sdist upload -r test --show-response
...
...
Traceback (most recent call last):
  File "setup.py", line 24, in <module>
    'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)',
  File "/usr/local/lib/python3.3/distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/usr/local/lib/python3.3/distutils/dist.py", line 917, in run_commands
    self.run_command(cmd)
  File "/usr/local/lib/python3.3/distutils/dist.py", line 936, in run_command
    cmd_obj.run()
  File "/usr/local/lib/python3.3/distutils/command/upload.py", line 66, in run
    self.upload_file(command, pyversion, filename)
  File "/usr/local/lib/python3.3/distutils/command/upload.py", line 155, in upload_file
    body.write(value)
TypeError: 'str' does not support the buffer interface

I also attached my setup.py.
msg202941 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2013-11-15 11:51
I never undersood why, but classifiers must be a list, not a tuple. This is a bug in my opinion.

upload.upload_file() doesn't check if the tuple contains exactly 2 items. If the value is a tuple, it doesn't encode the value. This is another bug. I don't know in which cases a value should be a (key, value) tuple.
msg202943 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2013-11-15 11:52
> upload.upload_file() ... doesn't encode the value.

fix-upload-cmd.diff should fix this specific bug, but the first bug (accept tuple for classifiers) should be fixed before or you will get an unexpected behaviour (only send 1 classifier?).
msg203130 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2013-11-17 08:44
> [...] but the first bug (accept tuple for classifiers) should be fixed
> before or you will get an unexpected behaviour (only send 1
> classifier?).

Here is a new patch that accepts tuple for classifiers.

Thanks for the review, Victor.
msg206821 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2013-12-22 17:18
I don't think accepting a tuple for classifiers is a bugfix. Furthermore, the latest patch is much too intrusive and may break legitimate uses.
msg206828 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2013-12-22 19:57
Classifiers have always been documented as a list; I don’t think a tuple makes more sense here (even if it does no harm), but more importantly I think it’s a bad idea to have a setup.py that would work in 3.5 and not in 3.2-3.4.  I suggest rejecting this.
msg214799 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2014-03-25 09:28
I’m open to a patch that would make it clear in the docs that classifiers must be a list.

A patch to detect bad type for classifiers in the check command would also be acceptable for 3.5, or to catch it earlier, a check in the Distribution class.
msg214810 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2014-03-25 11:25
> A patch to detect bad type for classifiers in the check command would also be acceptable for 3.5, or to catch it earlier, a check in the Distribution class.

Why only in Python 3.5? Does it make sense to pass something different
than a list in older Python versions?

I would prefer to see a fix the bug fixed in Python 2.7, 3.4 and 3.5.
msg214915 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2014-03-26 21:32
You seem to misunderstand me Victor: There is no bug here, classifiers should be a list and are documented as such.  It is possible to make this clearer in the docs for all versions.  In addition, we could make this easier for users who don’t see that part of the docs by warning them (in the check command, or from the Distribution class), but as a new feature this would go in 3.5 only.
msg218673 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2014-05-16 15:56
> A patch to detect bad type for classifiers in the check command would
> also be acceptable for 3.5, or to catch it earlier, a check in the
> Distribution class.

Thanks for the idea, Éric. New patch attached.
msg230443 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2014-11-01 09:54
Updated patch. I've tweaked tests and documentation a bit. Alternatively, I can leave Doc/distutils/setupscript.rst untouched and add a whatsnew entry to Doc/whatsnew/3.5.rst.
msg237395 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-03-06 22:54
Does current code work with None or empty tuple?
msg237425 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2015-03-07 07:27
> Does current code work with None or empty tuple?

Yes, it works with both None and ().
msg237447 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-03-07 13:43
The patch changes this.
msg237590 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2015-03-09 03:30
I think the change is acceptable.
msg237596 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-03-09 06:52
What about other list parameters? platform, keywords, provides, requires, obsoletes?
msg237597 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-03-09 06:53
> I don't know in which cases a value should be a (key, value) tuple.

I think this is for field 'content' only.
msg237648 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2015-03-09 13:42
I think classifiers and keywords are the only commonly used fields.  This issue could be limited to classifiers, or also include other list fields.
msg237789 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-03-10 18:07
I think it should include other list fields if we don't want to open separate issues for every list field.
msg239014 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2015-03-23 12:40
Here is a new patch. I didn't touched provides, requires and obsoletes fields since they are not used much in the setuptools era.

Distribution.finalize_options() already converts string types to lists for platforms and keywords fields. I didn't changed that behavior.
msg239915 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2015-04-02 14:16
Thanks, reviewed.

When running a setup.py that uses a tuple for classifiers, is the error message in the terminal user-friendly, or do we get a full traceback?
msg240250 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2015-04-08 06:15
Thanks for the review, Éric. New patch attached.

> When running a setup.py that uses a tuple for classifiers, is the error message in the terminal user-friendly, or do we get a full traceback?

A full traceback:

Traceback (most recent call last):
  File "setup.py", line 37, in <module>
    platforms=('Windows', 'Any'),
  File "/home/berker/projects/cpython/default/Lib/distutils/core.py", line 108, in setup
    _setup_distribution = dist = klass(attrs)
  File "/home/berker/projects/cpython/default/Lib/distutils/dist.py", line 253, in __init__
    getattr(self.metadata, "set_" + key)(val)
  File "/home/berker/projects/cpython/default/Lib/distutils/dist.py", line 1212, in set_platforms
    raise TypeError(msg % type(value).__name__)
TypeError: 'platforms' should be a 'list', not 'tuple'
msg242974 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2015-05-12 14:28
Éric, could you please take a look at issue19610_v4.diff? I'd like to commit the patch this weekend. Thanks!
msg306750 - (view) Author: Henk-Jaap Wagenaar (cryvate) * Date: 2017-11-22 19:36
This is still present, and also silently affects Python 2.7 as evidenced here: https://github.com/pypa/setuptools/issues/1163

I am happy to adapt Berker Peksags patch to a PR, if he is?
msg306753 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2017-11-22 19:42
Latest patch seems good.  Berker, would you have the time to adapt for 3.7 and submit as a PR?
msg306755 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-11-22 19:51
Thanks for the ping and for the review! I will open a PR this week.
msg306818 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-11-23 13:28
Éric and Henk-Jaap: I've now opened PR 4519.
msg306853 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-11-23 18:34
New changeset dcaed6b2d954786eb5369ec2e8dfdeefe3cdc6ae by Berker Peksag in branch 'master':
bpo-19610: setup() now raises TypeError for invalid types (GH-4519)
https://github.com/python/cpython/commit/dcaed6b2d954786eb5369ec2e8dfdeefe3cdc6ae
msg307450 - (view) Author: Neil Schemenauer (nascheme) * (Python committer) Date: 2017-12-02 19:34
I don't see a good reason to add this check.  I would guess there could be lots of 3rd party packages that are no uninstallable on Python 3.7.  E.g. 

python3 -m pip install exifread
...
TypeError: 'classifiers' should be a 'list', not 'tuple'

If people are determined to add extra type checking, make it a warning for 3.7 so setup.py files can be fixed.
msg307455 - (view) Author: Neil Schemenauer (nascheme) * (Python committer) Date: 2017-12-02 20:34
I tried building the top packages from python3wos.appspot.com.  Only simplejson-3.13.2.tar.gz fails to build due to this change.  However, given that it is the top downloaded module, I think think making a change to Python that makes it uninstallable by "pip" is a bad idea.  There needs to be a transition process.  I'm setting priority to "release blocker".  People can downgrade if they disagree with me.

I tried changing the TypeError raises with Deprecation warnings.  That doesn't have any effect because DeprecationWarning is filtered by default.  Enabling it still has no effect because apparently pip filters it out.

So, I think some other way to warn people would need to be implemented.  E.g. have distutils print to stderr.  Change pip to warn as well.
msg307457 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-12-02 20:55
Classifiers were always documented as lists (msg214915) and passing a non-list type was raised a cryptic exception message as already reported in my first message, https://github.com/pypa/setuptools/issues/1163 and https://reinbach.com/blog/setuptools-classifiers-upload-python3-5/

Any usage of classifiers=(...,) is already broken in Python 3 in some way (see the setup.py I attached or https://reinbach.com/blog/setuptools-classifiers-upload-python3-5/ for a quick reproducer) since they can't upload a new release.

Also, this is only an issue when sdist is the only way to install the project. exifread only provides a wheel for Python 2. I cloned it and add

    [wheel]
    universal = 1

then I created a universal wheel and tried to install it in Python 3.7.0a2+:

    Processing /home/berker/projects/test/exif-py/dist/ExifRead-2.1.2-py2.py3-none-any.whl
    Installing collected packages: ExifRead
    Successfully installed ExifRead-2.1.2
msg307458 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-12-02 20:57
(Sorry, I messed up fields in the issue.)
msg307463 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2017-12-02 21:37
In simplejson classifiers is a result of filter(). This is a list in Python 2 and an iterator in Python 3. It can be uploaded using Python 2.
msg307464 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2017-12-02 21:46
Filed a bug https://github.com/simplejson/simplejson/issues/198 for simplejson.
msg307465 - (view) Author: Neil Schemenauer (nascheme) * (Python committer) Date: 2017-12-02 21:47
> Classifiers were always documented as lists (msg214915) and passing a non-list type was raised a cryptic exception message as already reported in my first message

That doesn't matter.  You can't break a bunch of packages in a 3.x release with no warning just because people are doing something against what the documentation says.  That's not how we develop Python. How is a user of a 3rd party package going to fix this?  They have to ask the 3rd party package author to fix their setup.py code.  Until then, they cannot use Python 3.7.  This patch needs to be reverted and reworked, IMHO.

I trying installing the top packages listed on https://pythonwheels.com .  A number of them fail because of this change, see attached text file.
msg307468 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-12-02 22:07
> Filed a bug https://github.com/simplejson/simplejson/issues/198 for
> simplejson.

I've opened https://github.com/simplejson/simplejson/pull/197 to make CLASSIFIERS a list.

I've also opened https://github.com/ianare/exif-py/pull/80 to create a universal wheel for exifread.

> That's not how we develop Python.

Thank you, but I don't need a lecture from you. Feel free to propose your solution in the form of pull request instead of acting like a project manager and telling people what to do.
msg307475 - (view) Author: Neil Schemenauer (nascheme) * (Python committer) Date: 2017-12-02 22:48
> Thank you, but I don't need a lecture from you. Feel free to propose our solution in the form of pull request instead of acting like a project manager and telling people what to do.

I'm sorry you are offended.  My pull request would consist of the patch being reverted.  It is not ready to go in.  If a change breaks a significant amount of previously working Python code, it needs very careful consideration and should be introduced in a way to minimize breakage and allow people time to fix their code.

Repeatably pointing to the documentation and saying that existing code is broken because it doesn't respect documented requirements is not okay.
msg307483 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2017-12-03 02:20
I'd prefer to see this change go in the other direction: instead of enforcing eager type checks, we should be unconditionally wrapping the given values in a "list(arg)" call, such that more typical iterable duck-typing behaviour applies.

That will transparently fix any code that isn't already passing a list, will ensure that internal code can safely assume that the instance *attributes* are always lists (no matter what the caller passes in), and means that even when the caller is passing in a list, the instance will have its own copy (rather than retaining a reference to the caller's copy).
msg307486 - (view) Author: Neil Schemenauer (nascheme) * (Python committer) Date: 2017-12-03 04:57
I like Nick's idea of calling list() to fix the argument.  I've created a PR that implements it.  I also generate a RuntimeWarning since if we document them as needing to be lists, we should at least warn for invalid types.  The RuntimeWarning will be seen if you call setup.py directly which should have the effect of eventually pushing package authors to fix their code.
msg307488 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2017-12-03 06:31
Perhaps it is worth to backport warnings to 2.7 in Py3k mode. This could help to detect some issues earlier.

In 3.6 fields could be converted to lists silently, without warnings.
msg307495 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2017-12-03 09:27
Le 03/12/2017 à 05:57, Neil Schemenauer a écrit :
> 
> I like Nick's idea of calling list() to fix the argument.

I don't think that's a good idea.  Suppose someone is passing a string
by mistake:

setup(...,
      classifiers='Programming Language :: Python :: 3 :: Only',
      )
msg307514 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2017-12-03 13:40
Prohibiting strings and bytes on the grounds of "Yes they're iterable, but are more likely intended as atomic here, so treat them as ambiguous and refuse to guess" would be fine. (Although I'll also note the classifier case will already fail on upload, since they won't be valid classifiers)

The only part I'm not OK with is upgrading a historically unenforced type restriction that only sometimes causes problems into an eagerly enforced one that breaks currently working code.
msg307521 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2017-12-03 19:28
I am sorry this snowballed.  The intent in my messages here and in my PR review was to exchange a late, unfriendly traceback with a clear, early message, but only for package authors.  I forgot that a Python 3.7 could execute an invalid setup.py from an existing tarball, as Neil pointed with the pip install exifread example.  Even if these packages get PRs to build wheels, it’s still bad to break existing sdists.  +1 to reverting the patch, +1 to reverting the breakage and also fixing the original problem with a warning and explicit conversion.
msg307588 - (view) Author: Neil Schemenauer (nascheme) * (Python committer) Date: 2017-12-04 18:14
Don't be sorry.  We are all passionate about making Python better.  distutils will be better once we gets this sorted out.  Berker deserves credit for seeing an issue and developing on a fix for it.  The collaboration between all the core developers is making the final fix better than what any one of us could make.

The process is working quite well IMHO.  I had a small patch a few days ago that I was considering just committing without reviews.  I went through the review process though and the patch was better as a result of the review feedback I got.

The documentation says that the argument needs to be a list of strings or a string.  So, unless we change the documentation, a string must be accepted without warnings or errors.  The current PR works pretty well.  Figuring out how to best warn is the trickiest bit.  Sometimes it seems like DepreciationWarning doesn't work as we would like, since it often gets suppressed.  It seems pip is especially "good" at hiding it.
msg307622 - (view) Author: Neil Schemenauer (nascheme) * (Python committer) Date: 2017-12-05 02:58
New changeset 8837dd092fe5ad5184889104e8036811ed839f98 by Neil Schemenauer in branch 'master':
bpo-19610: Warn if distutils is provided something other than a list to some fields (#4685)
https://github.com/python/cpython/commit/8837dd092fe5ad5184889104e8036811ed839f98
msg307645 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-12-05 05:44
Thank you for fixing this, Neil. Can we close this issue now?
msg363385 - (view) Author: Marco Sulla (Marco Sulla) * Date: 2020-03-04 19:52
This is IMHO broken.

1. _ensure_list() allows strings, because, documentation says, they are split in finalize_options(). But finalize_options() does only split keywords and platforms. It does _not_ split classifiers.

2. there's no need that keywords, platforms and classifiers must be a list. keywords and platforms can be any iterable, and classifiers can be any non text-like iterable. 

Indeed, keywords are written to file using ','.join(), and platforms and classifiers are written using DistributionMetadata._write_list(). They both accepts any iterable, so I do not understand why such a strict requirement.
History
Date User Action Args
2022-04-11 14:57:53adminsetgithub: 63809
2020-03-04 19:52:23Marco Sullasetnosy: + Marco Sulla
messages: + msg363385
2017-12-05 17:27:01naschemesetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2017-12-05 05:44:21berker.peksagsetpriority: release blocker -> normal

messages: + msg307645
2017-12-05 02:58:15naschemesetmessages: + msg307622
2017-12-04 18:14:16naschemesetmessages: + msg307588
2017-12-04 17:07:08vstinnersetnosy: - vstinner
2017-12-03 19:28:53eric.araujosetmessages: + msg307521
2017-12-03 13:40:49ncoghlansetmessages: + msg307514
2017-12-03 09:27:21pitrousetmessages: + msg307495
2017-12-03 06:31:13serhiy.storchakasetmessages: + msg307488
2017-12-03 04:57:58naschemesetkeywords: + needs review, - patch

messages: + msg307486
2017-12-03 04:55:06naschemesetstage: resolved -> patch review
pull_requests: + pull_request4598
2017-12-03 02:20:55ncoghlansetmessages: + msg307483
2017-12-02 22:48:15naschemesetmessages: + msg307475
2017-12-02 22:07:46berker.peksagsetmessages: + msg307468
2017-12-02 21:47:09naschemesetfiles: + pip-errors.txt

messages: + msg307465
2017-12-02 21:46:31serhiy.storchakasetmessages: + msg307464
2017-12-02 21:37:19serhiy.storchakasetmessages: + msg307463
2017-12-02 21:09:12ned.deilysetnosy: + ncoghlan
2017-12-02 20:57:00berker.peksagsetpriority: normal -> release blocker
nosy: + ned.deily
messages: + msg307458

2017-12-02 20:55:55berker.peksagsetpriority: release blocker -> normal
nosy: - ned.deily
messages: + msg307457

2017-12-02 20:34:02naschemesetpriority: normal -> release blocker
nosy: + ned.deily
messages: + msg307455

2017-12-02 19:34:17naschemesetstatus: closed -> open

nosy: + nascheme
messages: + msg307450

resolution: fixed -> (no value)
2017-11-23 18:34:50berker.peksagsetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2017-11-23 18:34:22berker.peksagsetmessages: + msg306853
2017-11-23 13:28:46berker.peksagsetmessages: + msg306818
2017-11-23 13:12:22berker.peksagsetpull_requests: + pull_request4456
2017-11-22 19:51:16berker.peksagsetmessages: + msg306755
versions: - Python 3.6
2017-11-22 19:42:54eric.araujosetmessages: + msg306753
2017-11-22 19:36:15cryvatesetnosy: + cryvate

messages: + msg306750
versions: + Python 3.6, Python 3.7, - Python 3.5
2015-05-12 14:28:08berker.peksagsetmessages: + msg242974
2015-04-08 06:15:31berker.peksagsetfiles: + issue19610_v4.diff

messages: + msg240250
2015-04-02 14:16:49eric.araujosetmessages: + msg239915
title: setup.py does not allow a tuple for classifiers -> Give clear error messages for invalid types used for setup.py params (e.g. tuple for classifiers)
2015-03-23 12:40:51berker.peksagsetfiles: + issue19610_v3.diff

messages: + msg239014
2015-03-10 18:07:48serhiy.storchakasetmessages: + msg237789
2015-03-09 13:42:57eric.araujosetmessages: + msg237648
2015-03-09 06:53:54serhiy.storchakasetmessages: + msg237597
2015-03-09 06:52:16serhiy.storchakasetmessages: + msg237596
2015-03-09 03:30:55eric.araujosetmessages: + msg237590
2015-03-07 13:43:02serhiy.storchakasetmessages: + msg237447
2015-03-07 07:27:34berker.peksagsetmessages: + msg237425
2015-03-06 22:54:25serhiy.storchakasetnosy: + serhiy.storchaka
messages: + msg237395
2014-11-01 09:54:55berker.peksagsetfiles: + issue19610_v2.diff

messages: + msg230443
2014-09-26 12:50:11berker.peksagsetassignee: berker.peksag
2014-05-16 15:56:25berker.peksagsetfiles: + issue19610_catch_distribution.diff

stage: needs patch -> patch review
messages: + msg218673
versions: - Python 2.7, Python 3.4
2014-03-26 21:32:34eric.araujosetmessages: + msg214915
2014-03-25 11:25:21vstinnersetmessages: + msg214810
2014-03-25 09:28:24eric.araujosettitle: setup.py should allow a tuple for classifiers -> setup.py does not allow a tuple for classifiers
messages: + msg214799
versions: + Python 2.7, Python 3.5
2013-12-22 19:57:38eric.araujosetmessages: + msg206828
2013-12-22 17:51:08pitrousettitle: TypeError in distutils.command.upload -> setup.py should allow a tuple for classifiers
stage: patch review -> needs patch
type: behavior -> enhancement
versions: - Python 3.3
2013-12-22 17:18:09pitrousetnosy: + pitrou
messages: + msg206821
2013-11-17 08:46:07berker.peksagsetfiles: + issue19610.diff
2013-11-17 08:44:55berker.peksagsetmessages: + msg203130
2013-11-15 11:52:39vstinnersetmessages: + msg202943
2013-11-15 11:51:22vstinnersetnosy: + eric.araujo, tarek, vstinner
messages: + msg202941
2013-11-15 11:25:13berker.peksagsetfiles: + fix-upload-cmd.diff
keywords: + patch
2013-11-15 11:24:52berker.peksagcreate