python - test - Cómo especificar múltiples autor(es)/correo electrónico(es) en setup.py
test pypi (2)
Escribimos un pequeño contenedor a una aplicación de Twitter y publicamos esta información en http://pypi.python.org . Pero setup.py solo contenía un solo campo para especificar el correo electrónico / nombre del autor. ¿Cómo especifico la lista de contribuyentes múltiples / correo electrónico en los siguientes campos, ya que nos gustaría que este paquete aparezca en la lista con nuestros nombres, de forma similar a como se muestra en http://rubygems.org .
author=''foo'',
author_email=''[email protected]'',
En cierto modo estoy utilizando la respuesta de @mocache, en caso de que quieras algunos detalles.
A lo largo de esta respuesta, me referiré a una versión FOO-PYTHON-ENV/Lib/distutils/dist.py
archivo FOO-PYTHON-ENV/Lib/distutils/dist.py
Para reiterar, no puedes usar una lista en el campo del author
. Este es el por qué:
Spoiler: Dos métodos que pertenecen a la clase DistributionMetadata
son el motivo:
def _read_field(name):
value = msg[name]
if value == ''UNKNOWN'':
return None
return value
def _read_list(name):
values = msg.get_all(name, None)
if values == []:
return None
return values
Aquí es donde aparecerá un error si intenta incluir una lista en el campo del author
:
class DistributionMetadata:
#*...(R E D A C T E D)...*#
def read_pkg_file(self, file):
"""Reads the metadata values from a file object."""
#*...(R E D A C T E D)...*#
# ####################################
# Note the usage of _read_field() here
# ####################################
self.name = _read_field(''name'')
self.version = _read_field(''version'')
self.description = _read_field(''summary'')
# we are filling author only.
self.author = _read_field(''author'')
self.maintainer = None
self.author_email = _read_field(''author-email'')
self.maintainer_email = None
self.url = _read_field(''home-page'')
self.license = _read_field(''license'')
#*...(R E D A C T E D)...*#
# ###################################
# Note the usage of _read_list() here
# ###################################
self.platforms = _read_list(''platform'')
self.classifiers = _read_list(''classifier'')
#*...(R E D A C T E D)...*#
& Aquí está todo:
class DistributionMetadata:
"""Dummy class to hold the distribution meta-data: name, version,
author, and so forth.
"""
_METHOD_BASENAMES = ("name", "version", "author", "author_email",
"maintainer", "maintainer_email", "url",
"license", "description", "long_description",
"keywords", "platforms", "fullname", "contact",
"contact_email", "classifiers", "download_url",
# PEP 314
"provides", "requires", "obsoletes",
)
def __init__(self, path=None):
if path is not None:
self.read_pkg_file(open(path))
else:
self.name = None
self.version = None
self.author = None
self.author_email = None
self.maintainer = None
self.maintainer_email = None
self.url = None
self.license = None
self.description = None
self.long_description = None
self.keywords = None
self.platforms = None
self.classifiers = None
self.download_url = None
# PEP 314
self.provides = None
self.requires = None
self.obsoletes = None
def read_pkg_file(self, file):
"""Reads the metadata values from a file object."""
msg = message_from_file(file)
def _read_field(name):
value = msg[name]
if value == ''UNKNOWN'':
return None
return value
def _read_list(name):
values = msg.get_all(name, None)
if values == []:
return None
return values
metadata_version = msg[''metadata-version'']
self.name = _read_field(''name'')
self.version = _read_field(''version'')
self.description = _read_field(''summary'')
# we are filling author only.
self.author = _read_field(''author'')
self.maintainer = None
self.author_email = _read_field(''author-email'')
self.maintainer_email = None
self.url = _read_field(''home-page'')
self.license = _read_field(''license'')
if ''download-url'' in msg:
self.download_url = _read_field(''download-url'')
else:
self.download_url = None
self.long_description = _read_field(''description'')
self.description = _read_field(''summary'')
if ''keywords'' in msg:
self.keywords = _read_field(''keywords'').split('','')
self.platforms = _read_list(''platform'')
self.classifiers = _read_list(''classifier'')
# PEP 314 - these fields only exist in 1.1
if metadata_version == ''1.1'':
self.requires = _read_list(''requires'')
self.provides = _read_list(''provides'')
self.obsoletes = _read_list(''obsoletes'')
else:
self.requires = None
self.provides = None
self.obsoletes = None
Hasta donde yo sé, setuptools
no admite el uso de una lista de cadenas para especificar múltiples autores. Su mejor opción es hacer una lista de los autores en una sola cadena:
author=''Foo Bar, Spam Eggs'',
author_email=''[email protected], [email protected]'',
No estoy seguro de si PyPI valida el campo author_email
, por lo que puede tener problemas con ese. En cualquier caso, recomendaría que limitase esto a un único autor y mencione a todos los colaboradores en la documentación o descripción.
[Editar] Algunas fuentes:
Esto se ha registrado como un error , en realidad, pero parece que no se implementó el soporte para múltiples autores. Here hay una solución alternativa. Here hay una idea de cómo proporcionar un correo electrónico de contacto para un proyecto con múltiples autores.