# Copyright 1999-2018 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # @ECLASS: twisted-r1.eclass # @MAINTAINER: # Gentoo Python Project # @AUTHOR: # Author: Michał Górny # Author: Jan Matejka # @SUPPORTED_EAPIS: 4 5 # @BLURB: Eclass for Twisted packages # @DESCRIPTION: # The twisted eclass defines phase functions for Twisted packages. case "${EAPI:-0}" in 0|1|2|3) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;; 4|5) ;; *) die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;; esac if [[ ! ${_TWISTED_R1} ]]; then inherit distutils-r1 versionator fi # ! ${_TWISTED_R1} EXPORT_FUNCTIONS src_install pkg_postinst pkg_postrm if [[ ! ${_TWISTED_R1} ]]; then # @FUNCTION: _twisted-r1_camelcase # @USAGE: # @DESCRIPTION: # Convert dash-separated to CamelCase name suitable for Twisted. # In pure bash, therefore safe for global scope execution. _twisted-r1_camelcase() { local IFS=- # IFS=- splits words by -. local words=( ${1} ) # we can't keep '-' as it collides with [a-z] check # and '' is used by bash-4 words[*], so let's just set globally IFS= if [[ ${BASH_VERSINFO[0]} -ge 4 ]]; then echo "${words[*]^}" return fi local w LC_COLLATE=C uc='ABCDEFGHIJKLMNOPQRSTUVWXYZ' local out for w in "${words[@]}"; do local fl=${w:0:1} # Danger: magic starts here. Please close your eyes. # In base 36, a..z represents digits 10..35. We substract 10 # and get array subscripts for uc. [[ ${fl} == [a-z] ]] && fl=${uc:36#${fl} - 10:1} out+=${fl}${w:1} done echo "${out}" } # @ECLASS-VARIABLE: TWISTED_PN # @DESCRIPTION: # The real package name. Default to camel-case conversion of ${PN}. # # Example: TwistedCore : ${TWISTED_PN:=$(_twisted-r1_camelcase ${PN})} # @ECLASS-VARIABLE: TWISTED_P # @DESCRIPTION: # The real package name with version appended. # # It is used to build the default SRC_URI and S values. # # Example: TwistedCore-1.2.3 : ${TWISTED_P:=${TWISTED_PN}-${PV}} # @ECLASS-VARIABLE: TWISTED_RELEASE # @DESCRIPTION: # The 'release' of Twisted. Defaults to the major & minor version # number from ${PV}. # # It is used to build the default SRC_URI. It may be also used # in dependencies against other Twisted packages. # # Example: 1.2 : ${TWISTED_RELEASE:=$(get_version_component_range 1-2 ${PV})} HOMEPAGE="https://www.twistedmatrix.com/trac/" SRC_URI="https://twistedmatrix.com/Releases/${TWISTED_PN#Twisted}" SRC_URI="${SRC_URI}/${TWISTED_RELEASE}/${TWISTED_P}.tar.bz2" LICENSE="MIT" SLOT="0" IUSE="" S=${WORKDIR}/${TWISTED_P} # @ECLASS-VARIABLE: TWISTED_PLUGINS # @DESCRIPTION: # An array of Twisted plugins, whose cache is regenerated # in pkg_postinst() and pkg_postrm() phases. # # If no plugins are installed, set to empty array. declare -p TWISTED_PLUGINS &>/dev/null || TWISTED_PLUGINS=( twisted.plugins ) # @FUNCTION: twisted-r1_python_test # @DESCRIPTION: # The common python_test() implementation that suffices for Twisted # packages. twisted-r1_python_test() { local sitedir=$(python_get_sitedir) # Copy modules of other Twisted packages from site-packages # directory to the temporary directory. local libdir=${BUILD_DIR}/test/lib mkdir -p "${libdir}" || die cp -r "${ROOT}${sitedir}"/twisted "${libdir}" || die # Drop the installed module in case previous version conflicts with # the new one somehow. rm -fr "${libdir}/${PN/-//}" || die distutils_install_for_testing || die if [[ ${TEST_DIR} != ${BUILD_DIR}/test ]]; then eerror "twisted-r1 integrity check failed." eerror "TEST_DIR: ${TEST_DIR}" eerror "expected: ${BUILD_DIR}/test" die "TEST_DIR integrity check failed" fi cd "${TEST_DIR}"/lib || die trial ${PN/-/.} || die "Tests fail with ${EPYTHON}" } # @FUNCTION: python_test # @DESCRIPTION: # Default python_test() for Twisted packages. If you need to override # it, you can access the original implementation # via twisted-r1_python_test. python_test() { twisted-r1_python_test } # @FUNCTION: twisted-r1_src_install # @DESCRIPTION: # Default src_install() for Twisted packages. Automatically handles HTML # docs (unless HTML_DOCS is set explicitly) and manpages in Twisted # packages. twisted-r1_src_install() { [[ -d doc ]] && local HTML_DOCS=( "${HTML_DOCS[@]:-doc/.}" ) [[ -d doc/man ]] && doman doc/man/*.[[:digit:]] distutils-r1_src_install } # @FUNCTION: _twisted-r1_create_caches # @USAGE: ... # @DESCRIPTION: # Create dropin.cache for plugins in specified packages. The packages # are to be listed in standard dotted Python syntax. _twisted-r1_create_caches() { # http://twistedmatrix.com/documents/current/core/howto/plugin.html "${PYTHON}" -c \ "import sys sys.path.insert(0, '${ROOT}$(python_get_sitedir)') fail = False try: from twisted.plugin import getPlugins, IPlugin except ImportError as e: if '${EBUILD_PHASE}' == 'postinst': raise else: for module in sys.argv[1:]: try: __import__(module, globals()) except ImportError as e: if '${EBUILD_PHASE}' == 'postinst': raise else: list(getPlugins(IPlugin, sys.modules[module])) " \ "${@}" || die "twisted plugin cache update failed" } # @FUNCTION: twisted-r1_update_plugin_cache # @DESCRIPTION: # Update and clean up plugin caches for packages listed # in TWISTED_PLUGINS. twisted-r1_update_plugin_cache() { [[ ${TWISTED_PLUGINS[@]} ]] || return local subdirs=( "${TWISTED_PLUGINS[@]//.//}" ) local paths=( "${subdirs[@]/#/${ROOT}$(python_get_sitedir)/}" ) local caches=( "${paths[@]/%//dropin.cache}" ) # First, delete existing (possibly stray) caches. rm -f "${caches[@]}" || die # Now, let's see which ones we can regenerate. _twisted-r1_create_caches "${TWISTED_PLUGINS[@]}" # Finally, drop empty parent directories. rmdir -p "${paths[@]}" 2>/dev/null } # @FUNCTION: twisted-r1_pkg_postinst # @DESCRIPTION: # Post-installation hook for twisted-r1. Updates plugin caches. twisted-r1_pkg_postinst() { _distutils-r1_run_foreach_impl twisted-r1_update_plugin_cache } # @FUNCTION: twisted-r1_pkg_postrm # @DESCRIPTION: # Post-removal hook for twisted-r1. Updates plugin caches. twisted-r1_pkg_postrm() { _distutils-r1_run_foreach_impl twisted-r1_update_plugin_cache } _TWISTED_R1=1 fi # ! ${_TWISTED_R1}