# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/dev-python/pyopenssl/pyopenssl-0.13.1.ebuild,v 1.13 2014/03/31 21:22:01 mgorny Exp $

EAPI=5

PYTHON_COMPAT=( python{2_6,2_7,3_2,3_3} pypy pypy2_0 )

inherit distutils-r1 flag-o-matic

MY_PN="pyOpenSSL"
MY_P="${MY_PN}-${PV}"

DESCRIPTION="Python interface to the OpenSSL library"
HOMEPAGE="http://pyopenssl.sourceforge.net/ https://launchpad.net/pyopenssl http://pypi.python.org/pypi/pyOpenSSL"
SRC_URI="mirror://pypi/${MY_PN:0:1}/${MY_PN}/${MY_P}.tar.gz"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="*"
IUSE="doc"

RDEPEND=">=dev-libs/openssl-0.9.6g"
DEPEND="${RDEPEND}
	doc? ( >=dev-tex/latex2html-2002.2[gif,png] )"

# pypy* won't fit since CPython 3 is 'better' than it
REQUIRED_USE="doc? ( || ( $(python_gen_useflags python2*) ) )"

S="${WORKDIR}/${MY_P}"

python_prepare_all() {
	sed \
		-e "s/test_set_tlsext_host_name_wrong_args/_&/" \
		-i OpenSSL/test/test_ssl.py || die "test_ssl sed failed"

	distutils-r1_python_prepare_all
}

python_compile() {
	local CFLAGS=${CFLAGS} CXXFLAGS=${CXXFLAGS}
	[[ ${EPYTHON} != python3* ]] && append-flags -fno-strict-aliasing

	distutils-r1_python_compile
}

python_compile_all() {
	if use doc; then
		addwrite /var/cache/fonts

		cd doc || die
		emake -j1 html ps dvi
	fi
}

python_test() {
	cd "${BUILD_DIR}"/lib/OpenSSL/test || die

	local t
	for t in test_*.py; do
		"${PYTHON}" "${t}" || die "Test ${t} fails with ${EPYTHON}"
	done
}

python_install_all() {
	distutils-r1_python_install_all

	if use doc; then
		dohtml -r doc/html/.
		dodoc doc/pyOpenSSL.*
	fi

	dodoc -r examples
	docompress -x /usr/share/doc/${PF}/examples
}
