Упаковка Python: получение статуса разработки из строки версии

#python #packaging #setuptools

#python #упаковка #setuptools

Вопрос:

Необходимо предоставить функции установки в файле setup.py как строка версии, так и статус разработки (см. https://python-packaging-user-guide.readthedocs.org/en/latest/tutorial.html и проект, приведенный в качестве примера https://github.com/pypa/sampleproject/blob/master/setup.py )

Вот более простой пример:

 from setuptools import setup

import os
here = os.path.abspath(os.path.dirname(__file__))

# Get the version from the relevant file 
with open(os.path.join(here, 'namepackage/_version.py')) as f: 
    exec(f.read()) 

# In namepackage/_version.py, there is just something like
# __version__= '1.1a2', where 'a' means alpha (see
# http://legacy.python.org/dev/peps/pep-0386/).

setup(
    name='namepackage',
    version=__version__,
    # skip arguments for clarity
    classifiers=[
        # How mature is this project? Common values are
        # 3 - Alpha
        # 4 - Beta
        # 5 - Production/Stable
        'Development Status :: 4 - Beta'
        ]
)
  

В этом случае строка версии записывается в файле namepackage/_version .py и он также содержит информацию о статусе разработки, поэтому должен быть способ получить статус разработки в виде строки (‘3 — Alpha’ в этом примере) из строки версии. В противном случае необходимо последовательно изменять оба _version .py и setup.py , что кажется не очень умным (и это так легко забыть, что привело бы к противоречивой информации, как в примере!).

Есть ли функция для этого в стандартной библиотеке Python? В противном случае, что было бы разумным способом сделать это?

Ответ №1:

Не существует реального стандарта для обозначения альфа- или бета-версии в строке версии, и классификатор не требуется для корреляции. 0.x Например, я мог бы отметить статус бета-версии или даже альфа-версии, потому что я все еще хотел развивать API-интерфейсы и не переходить на производство / стабильность до 1.x .

Таким образом, это зависит от ваших собственных политик выпуска проекта, когда переключать классификаторы, и если это соотносится со строкой версии, реализовать некоторый синтаксический анализ строки самостоятельно.

Это может быть так просто, как:

 devstatus = ''Development Status :: 5 - Production/Stable'
if 'b' in __version__:
    devstatus = ''Development Status :: 4 - Beta'
elif 'a' in __version__:
    devstatus = ''Development Status :: 3 - Alpha'
  

Комментарии:

1. Спасибо за ответ. В предлагаемом коде их слишком много, но в противном случае это сработало бы. Если бы мне пришлось реализовать это самому, я бы сделал что-нибудь более безопасное from pkg_resources import parse_version . Я все еще думаю, что странно, что можно использовать ‘Development Status :: 5 — Production / Stable’ со строкой версии, которая явно является альфа или бета, как определено в PEP 386.

2. parse_version отлично подходит для сортировки версий, но не более полезен для тестирования альфа- или бета-статуса, опять же, если в вашем проекте нет политики в отношении того, какую терминологию использовать. any(p.startswith('*a') for p on parse_version(__version__)) чувствовал себя слишком подробным, когда могло быть достаточно простого удержания строки.