Hello, We've been working with yac for a while to get the old twisted.eclass converted to be compliant with distutils-r1 both in design and in spirit. This is the first version we'd like to submit for review.
A few notes: 1. The eclass aims to be less conditional than the old one. Especially we've dropped all the ${CATEGORY}/${PN} checks. The code still sets all the funny defaults for Twisted suite but those aren't incremental and can easily be overrode in ebuilds. And in most cases, they simple are (SRC_URI, LICENSE). 2. The eclass comes with a pure bash-3.2 CamelCase converter for changing PNs like 'twisted-foo' into 'TwistedFoo'. The relevant code can be moved to eutils as portable replacements for bash-4 ${foo^} and friends. 3. The eclass provides a reusable twisted-r1_python_test and sets it as default python_test. If someone needs to override it, he can still call it using the former name. 4. Cache updating hack is based off twisted.eclass. Sadly, it's not something we can do without postrm/postinst. Similarly to the old eclass, TWISTED_PLUGINS needs to list the plugin locations. Since most ebuilds install to twisted.plugins, it defaults to that. If an ebuild does not install plugins at all, it needs to set empty TWISTED_PLUGINS. -- Best regards, Michał Górny
# Copyright 1999-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License, v2 or later # $Header: /var/cvsroot/gentoo-x86/eclass/twisted.eclass,v 1.10 2011/12/27 06:54:23 floppym Exp $ # @ECLASS: twisted-r1.eclass # @MAINTAINER: # Gentoo Python Project <pyt...@gentoo.org> # @AUTHOR: # Author: MichaŠGórny <mgo...@gentoo.org> # Author: Jan Matejka <y...@gentoo.org> # @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_camelcase # @USAGE: <package-name> # @DESCRIPTION: # Convert dash-separated package name to CamelCase. In pure bash. # Really. _twisted_camelcase() { local pn=${1} local save_IFS=${IFS} local IFS=- # IFS=- splits words by -. local w words=( ${pn} ) local IFS=${save_IFS} for w in "${words[@]}"; do local fl=${w:0:1} # obtain octal ASCII code for the first letter. local ord=$(printf '%o' "'${fl}") # check if it's [a-z]. ASCII codes are locale-safe. if [[ ${ord} -ge 141 && ${ord} -le 172 ]]; then # now substract 040 to make it upper-case. # fun fact: in range 0141..0172, decimal '- 40' is fine. local ord=$(( ${ord} - 40)) # and convert it back to the character. fl=$(printf '\'${ord}) fi echo -n "${fl}${w:1}" done } # @ECLASS-VARIABLE: TWISTED_PN # @DESCRIPTION: # The Twisted CamelCase converted form of package name. # # Example: TwistedCore TWISTED_PN=$(_twisted_camelcase ${PN}) # @ECLASS-VARIABLE: TWISTED_P # @DESCRIPTION: # The Twisted CamelCase package name & version. # # Example: TwistedCore-1.2.3 TWISTED_P=${TWISTED_PN}-${PV} HOMEPAGE="http://www.twistedmatrix.com/" SRC_URI="http://twistedmatrix.com/Releases/${TWISTED_PN}" SRC_URI="${SRC_URI}/$(get_version_component_range 1-2 ${PV})" SRC_URI="${SRC_URI}/${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. [[ ${TWISTED_PLUGINS[@]} ]] || TWISTED_PLUGINS=( twisted.plugins ) # @FUNCTION: twisted-r1_python_test # @DESCRIPTION: # The common python_test() implementation that suffices 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 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 and manpages in Twisted packages twisted-r1_src_install() { # TODO: doesn't this accidentially involve installing manpages? ;f if [[ ${CATEGORY}/${PN} == dev-python/twisted* && -d doc ]]; then local HTML_DOCS=( doc/. ) fi distutils-r1_src_install [[ -d doc/man ]] && doman doc/man/*.[[:digit:]] } # @FUNCTION: _twisted-r1_create_caches # @USAGE: <packages>... # @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() { 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}
signature.asc
Description: PGP signature