From 4a74938e510c0dad732ae4c48f815dd0f0cabb46 Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Mon, 13 Feb 2023 08:16:09 +0000 Subject: gentoo auto-resync : 13:02:2023 - 08:16:09 --- eclass/pypi.eclass | 126 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 105 insertions(+), 21 deletions(-) (limited to 'eclass/pypi.eclass') diff --git a/eclass/pypi.eclass b/eclass/pypi.eclass index e9d3eec1268b..182b0b6b8c3e 100644 --- a/eclass/pypi.eclass +++ b/eclass/pypi.eclass @@ -11,12 +11,21 @@ # @DESCRIPTION: # The pypi.eclass can be used to easily obtain URLs for artifacts # uploaded to PyPI.org. When inherited, the eclass defaults SRC_URI -# to fetch ${P}.tar.gz sdist. +# and S to fetch .tar.gz sdist. The project filename is normalized +# by default (unless PYPI_NO_NORMALIZE is set prior to inheriting +# the eclass), and the version is translated using +# pypi_translate_version. # -# If necessary, SRC_URI can be overriden by the ebuild. Two helper -# functions, pypi_sdist_url and pypi_wheel_url are provided to generate -# URLs to artifacts of specified type, with customizable project name. -# Additionally, pypi_wheel_name can be used to generate wheel filename. +# If necessary, SRC_URI and S can be overriden by the ebuild. Two +# helper functions, pypi_sdist_url and pypi_wheel_url are provided +# to generate URLs to artifacts of specified type, with customizable +# URL components. Additionally, pypi_wheel_name can be used to generate +# wheel filename. +# +# pypi_normalize_name can be used to normalize an arbitrary project name +# according to sdist/wheel normalization rules. pypi_translate_version +# can be used to translate a Gentoo version string into its PEP 440 +# equivalent. # # @EXAMPLE: # @CODE@ @@ -34,31 +43,91 @@ esac if [[ ! ${_PYPI_ECLASS} ]]; then _PYPI_ECLASS=1 -SRC_URI=" - https://files.pythonhosted.org/packages/source/${PN::1}/${PN}/${P}.tar.gz -" +# @ECLASS_VARIABLE: PYPI_NO_NORMALIZE +# @PRE_INHERIT +# @DEFAULT_UNSET +# @DESCRIPTION: +# When set to a non-empty value, disables project name normalization +# for the default SRC_URI and S values. + +# @FUNCTION: pypi_normalize_name +# @USAGE: +# @DESCRIPTION: +# Normalize the project name according to sdist/wheel normalization +# rules. That is, convert to lowercase and replace runs of [._-] +# with a single underscore. +# +# Based on the spec, as of 2023-02-10: +# https://packaging.python.org/en/latest/specifications/#package-distribution-file-formats +pypi_normalize_name() { + [[ ${#} -ne 1 ]] && die "Usage: ${FUNCNAME} " + + local name=${1} + local shopt_save=$(shopt -p extglob) + shopt -s extglob + name=${name//+([._-])/_} + ${shopt_save} + echo "${name,,}" +} + +# @FUNCTION: pypi_translate_version +# @USAGE: +# @DESCRIPTION: +# Translate the specified Gentoo version into the usual Python +# counterpart. Assumes PEP 440 versions. +# +# Note that we do not have clear counterparts for the epoch segment, +# nor for development release segment. +pypi_translate_version() { + [[ ${#} -ne 1 ]] && die "Usage: ${FUNCNAME} " + + local version=${1} + version=${version/_alpha/a} + version=${version/_beta/b} + version=${version/_rc/rc} + version=${version/_p/.post} + echo "${version}" +} # @FUNCTION: pypi_sdist_url -# @USAGE: [ [ []]] +# @USAGE: [--no-normalize] [ [ []]] # @DESCRIPTION: # Output the URL to PyPI sdist for specified project/version tuple. # -# If is unspecified, it defaults to ${PN}. +# The `--no-normalize` option disables project name normalization +# for sdist filename. This may be necessary when dealing with distfiles +# generated using build systems that did not follow PEP 625 +# (i.e. the sdist name contains uppercase letters, hyphens or dots). +# +# If is unspecified, it defaults to ${PN}. The package name +# is normalized according to the specification unless `--no-normalize` +# is passed. # -# If is unspecified, it defaults to ${PV}. +# If is unspecified, it defaults to ${PV} translated +# via pypi_translate_version. If it is specified, then it is used +# verbatim (the function can be called explicitly to translate custom +# version number). # # If is unspecified, it defaults to ".tar.gz". Another valid # value is ".zip" (please remember to add a BDEPEND on app-arch/unzip). pypi_sdist_url() { + local normalize=1 + if [[ ${1} == --no-normalize ]]; then + normalize= + shift + fi + if [[ ${#} -gt 3 ]]; then - die "Usage: ${FUNCNAME} [ []]" + die "Usage: ${FUNCNAME} [--no-normalize] [ []]" fi local project=${1-"${PN}"} - local version=${2-"${PV}"} + local version=${2-"$(pypi_translate_version "${PV}")"} local suffix=${3-.tar.gz} + local fn_project=${project} + [[ ${normalize} ]] && fn_project=$(pypi_normalize_name "${project}") printf "https://files.pythonhosted.org/packages/source/%s" \ - "${project::1}/${project}/${project}-${version}${suffix}" + "${project::1}/${project}/${fn_project}-${version}${suffix}" } # @FUNCTION: pypi_wheel_name @@ -66,9 +135,13 @@ pypi_sdist_url() { # @DESCRIPTION: # Output the wheel filename for the specified project/version tuple. # -# If is unspecified, it defaults to ${PN}. +# If is unspecified, it defaults to ${PN}. The package name +# is normalized according to the wheel specification. # -# If is unspecified, it defaults to ${PV}. +# If is unspecified, it defaults to ${PV} translated +# via pypi_translate_version. If it is specified, then it is used +# verbatim (the function can be called explicitly to translate custom +# version number). # # If is unspecified, it defaults to "py3". It can also be # "py2.py3", or a specific version in case of non-pure wheels. @@ -81,8 +154,8 @@ pypi_wheel_name() { die "Usage: ${FUNCNAME} [ [ []]]" fi - local project=${1-"${PN}"} - local version=${2-"${PV}"} + local project=$(pypi_normalize_name "${1-"${PN}"}") + local version=${2-"$(pypi_translate_version "${PV}")"} local pytag=${3-py3} local abitag=${4-none-any} echo "${project}-${version}-${pytag}-${abitag}.whl" @@ -101,7 +174,10 @@ pypi_wheel_name() { # # If is unspecified, it defaults to ${PN}. # -# If is unspecified, it defaults to ${PV}. +# If is unspecified, it defaults to ${PV} translated +# via pypi_translate_version. If it is specified, then it is used +# verbatim (the function can be called explicitly to translate custom +# version number). # # If is unspecified, it defaults to "py3". It can also be # "py2.py3", or a specific version in case of non-pure wheels. @@ -117,12 +193,12 @@ pypi_wheel_url() { fi if [[ ${#} -gt 4 ]]; then - die "Usage: ${FUNCNAME} [ [ []]]" + die "Usage: ${FUNCNAME} [--unpack] [ [ []]]" fi local filename=$(pypi_wheel_name "${@}") local project=${1-"${PN}"} - local version=${2-"${PV}"} + local version=${2-"$(pypi_translate_version "${PV}")"} local pytag=${3-py3} printf "https://files.pythonhosted.org/packages/%s" \ "${pytag}/${project::1}/${project}/${filename}" @@ -132,4 +208,12 @@ pypi_wheel_url() { fi } +if [[ ${PYPI_NO_NORMALIZE} ]]; then + SRC_URI="$(pypi_sdist_url --no-normalize)" + S="${WORKDIR}/${PN}-$(pypi_translate_version "${PV}")" +else + SRC_URI="$(pypi_sdist_url)" + S="${WORKDIR}/$(pypi_normalize_name "${PN}")-$(pypi_translate_version "${PV}")" +fi + fi -- cgit v1.2.3