From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <gentoo-commits+bounces-1566841-garchives=archives.gentoo.org@lists.gentoo.org>
Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (2048 bits))
	(No client certificate requested)
	by finch.gentoo.org (Postfix) with ESMTPS id D38D4158089
	for <garchives@archives.gentoo.org>; Tue, 31 Oct 2023 00:06:38 +0000 (UTC)
Received: from pigeon.gentoo.org (localhost [127.0.0.1])
	by pigeon.gentoo.org (Postfix) with SMTP id B83932BC03D;
	Tue, 31 Oct 2023 00:06:37 +0000 (UTC)
Received: from smtp.gentoo.org (mail.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits))
	(No client certificate requested)
	by pigeon.gentoo.org (Postfix) with ESMTPS id 942512BC03D
	for <gentoo-commits@lists.gentoo.org>; Tue, 31 Oct 2023 00:06:37 +0000 (UTC)
Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
	(No client certificate requested)
	by smtp.gentoo.org (Postfix) with ESMTPS id AB290335CD2
	for <gentoo-commits@lists.gentoo.org>; Tue, 31 Oct 2023 00:06:36 +0000 (UTC)
Received: from localhost.localdomain (localhost [IPv6:::1])
	by oystercatcher.gentoo.org (Postfix) with ESMTP id 1EB811302
	for <gentoo-commits@lists.gentoo.org>; Tue, 31 Oct 2023 00:06:35 +0000 (UTC)
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Content-Transfer-Encoding: 8bit
Content-type: text/plain; charset=UTF-8
Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" <sam@gentoo.org>
Message-ID: <1698710741.8d71174864920dc54024aa91d0a70532725e83bd.sam@gentoo>
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-python/ipython/
X-VCS-Repository: repo/gentoo
X-VCS-Files: dev-python/ipython/ipython-8.14.0-r1.ebuild dev-python/ipython/ipython-8.15.0-r1.ebuild dev-python/ipython/ipython-8.16.1-r1.ebuild dev-python/ipython/ipython-8.17.1-r1.ebuild
X-VCS-Directories: dev-python/ipython/
X-VCS-Committer: sam
X-VCS-Committer-Name: Sam James
X-VCS-Revision: 8d71174864920dc54024aa91d0a70532725e83bd
X-VCS-Branch: master
Date: Tue, 31 Oct 2023 00:06:35 +0000 (UTC)
Precedence: bulk
List-Post: <mailto:gentoo-commits@lists.gentoo.org>
List-Help: <mailto:gentoo-commits+help@lists.gentoo.org>
List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org>
List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org>
List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org>
X-BeenThere: gentoo-commits@lists.gentoo.org
X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply
X-Archives-Salt: ca4709a5-6778-4f43-ac4f-8c9cc4a3d588
X-Archives-Hash: aa4f00d443dcd877b82aa7be089c4e47

commit:     8d71174864920dc54024aa91d0a70532725e83bd
Author:     Eli Schwartz <eschwartz93 <AT> gmail <DOT> com>
AuthorDate: Fri Oct 13 04:00:47 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Tue Oct 31 00:05:41 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=8d711748

dev-python/ipython: remove runtime dependency on matplotlib

ipython does not use or rely on matplotlib at runtime in any way. It
does contain imports for it, but these imports are only triggered by the
act of typing `%matplotlib` into the interactive shell, which is an
ipython "magic" that runs matplotlib with some enhanced context.

People who do not use matplotlib don't need to have its installation
forced, and people who do use matplotlib will have it installed before
interactively using it, much as they do when interactively using it with
`import matplotlib`.

It is intentionally not listed as an install requirement in setup.cfg,
although the matplotlib-inline module *is* listed as an install
requirement. (matplotlib-inline contains the actual implementation of
the magic, and is very lightweight, so it is not particularly
advantageous to add a USE flag for it. Users of matplotlib won't
automatically have the -inline module installed.)

Per the way other magic commands work, the correct place to notify users
about the availability of these is using optfeature.

Signed-off-by: Eli Schwartz <eschwartz93 <AT> gmail.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 dev-python/ipython/ipython-8.14.0-r1.ebuild | 160 ++++++++++++++++++++++++++++
 dev-python/ipython/ipython-8.15.0-r1.ebuild | 160 ++++++++++++++++++++++++++++
 dev-python/ipython/ipython-8.16.1-r1.ebuild | 160 ++++++++++++++++++++++++++++
 dev-python/ipython/ipython-8.17.1-r1.ebuild | 159 +++++++++++++++++++++++++++
 4 files changed, 639 insertions(+)

diff --git a/dev-python/ipython/ipython-8.14.0-r1.ebuild b/dev-python/ipython/ipython-8.14.0-r1.ebuild
new file mode 100644
index 000000000000..901a9eba1d5f
--- /dev/null
+++ b/dev-python/ipython/ipython-8.14.0-r1.ebuild
@@ -0,0 +1,160 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{10..11} )
+PYTHON_REQ_USE='readline,sqlite,threads(+)'
+
+inherit distutils-r1 optfeature pypi virtualx
+
+DESCRIPTION="Advanced interactive shell for Python"
+HOMEPAGE="
+	https://ipython.org/
+	https://github.com/ipython/ipython/
+	https://pypi.org/project/ipython/
+"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~arm64-macos ~x64-macos"
+IUSE="doc examples notebook nbconvert qt5 +smp test"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	dev-python/backcall[${PYTHON_USEDEP}]
+	dev-python/decorator[${PYTHON_USEDEP}]
+	>=dev-python/jedi-0.16[${PYTHON_USEDEP}]
+	dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+	>=dev-python/pexpect-4.3[${PYTHON_USEDEP}]
+	dev-python/pickleshare[${PYTHON_USEDEP}]
+	>=dev-python/prompt-toolkit-3.0.38[${PYTHON_USEDEP}]
+	<dev-python/prompt-toolkit-3.1[${PYTHON_USEDEP}]
+	>=dev-python/pygments-2.4.0[${PYTHON_USEDEP}]
+	dev-python/setuptools[${PYTHON_USEDEP}]
+	dev-python/stack-data[${PYTHON_USEDEP}]
+	>=dev-python/traitlets-5.0[${PYTHON_USEDEP}]
+	$(python_gen_cond_dep '
+		dev-python/exceptiongroup[${PYTHON_USEDEP}]
+	' 3.10)
+"
+
+BDEPEND="
+	test? (
+		app-text/dvipng[truetype]
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+		dev-python/nbformat[${PYTHON_USEDEP}]
+		>=dev-python/numpy-1.21[${PYTHON_USEDEP}]
+		dev-python/requests[${PYTHON_USEDEP}]
+		dev-python/testpath[${PYTHON_USEDEP}]
+	)
+	doc? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		>=dev-python/sphinx-2[${PYTHON_USEDEP}]
+		dev-python/sphinx-rtd-theme[${PYTHON_USEDEP}]
+	)
+"
+
+distutils_enable_tests pytest
+
+RDEPEND+="
+	nbconvert? (
+		dev-python/nbconvert[${PYTHON_USEDEP}]
+	)
+"
+PDEPEND="
+	notebook? (
+		dev-python/notebook[${PYTHON_USEDEP}]
+		dev-python/ipywidgets[${PYTHON_USEDEP}]
+		dev-python/widgetsnbextension[${PYTHON_USEDEP}]
+	)
+	qt5? ( dev-python/qtconsole[${PYTHON_USEDEP}] )
+	smp? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		>=dev-python/ipyparallel-6.2.3[${PYTHON_USEDEP}]
+	)
+"
+
+PATCHES=( "${FILESDIR}"/2.1.0-substitute-files.patch )
+
+python_prepare_all() {
+	# Remove out of date insource files
+	#rm IPython/extensions/cythonmagic.py || die
+	#rm IPython/extensions/rmagic.py || die
+
+	# Prevent un-needed download during build
+	if use doc; then
+		sed -e "/^    'sphinx.ext.intersphinx',/d" -i docs/source/conf.py || die
+	fi
+
+	# Rename the test directory to reduce sys.path pollution
+	# https://github.com/ipython/ipython/issues/12892
+	mv IPython/extensions/{,ipython_}tests || die
+
+	distutils-r1_python_prepare_all
+}
+
+python_compile_all() {
+	if use doc; then
+		emake -C docs html_noapi
+		HTML_DOCS=( docs/build/html/. )
+	fi
+}
+
+src_test() {
+	virtx distutils-r1_src_test
+}
+
+python_test() {
+	local -x IPYTHON_TESTING_TIMEOUT_SCALE=20
+	local EPYTEST_DESELECT=(
+		# TODO: looks to be a regression due to a newer dep
+		IPython/core/tests/test_oinspect.py::test_class_signature
+		IPython/core/tests/test_oinspect.py::test_render_signature_long
+		IPython/terminal/tests/test_shortcuts.py::test_modify_shortcut_with_filters
+	)
+	# nonfatal implied by virtx
+	nonfatal epytest || die "Tests failed with ${EPYTHON}"
+}
+
+python_install() {
+	distutils-r1_python_install
+
+	# Create ipythonX.Y symlinks.
+	# TODO:
+	# 1. do we want them for pypy? No.  pypy has no numpy
+	# 2. handle it in the eclass instead (use _python_ln_rel).
+	# With pypy not an option the dosym becomes unconditional
+	dosym ../lib/python-exec/${EPYTHON}/ipython \
+		/usr/bin/ipython${EPYTHON#python}
+}
+
+python_install_all() {
+	distutils-r1_python_install_all
+
+	if use examples; then
+		dodoc -r examples
+		docompress -x /usr/share/doc/${PF}/examples
+	fi
+}
+
+pkg_postinst() {
+	optfeature "code formatting" dev-python/black
+	optfeature "sympyprinting" dev-python/sympy
+	optfeature "cythonmagic" dev-python/cython
+	optfeature "%lprun magic command" dev-python/line-profiler
+	optfeature "%matplotlib magic command" dev-python/matplotlib
+	optfeature "%mprun magic command" dev-python/memory-profiler
+
+	if use nbconvert; then
+		if ! has_version virtual/pandoc ; then
+			einfo "Node.js will be used to convert notebooks to other formats"
+			einfo "like HTML. Support for that is still experimental. If you"
+			einfo "encounter any problems, please use app-text/pandoc instead."
+		fi
+	fi
+}

diff --git a/dev-python/ipython/ipython-8.15.0-r1.ebuild b/dev-python/ipython/ipython-8.15.0-r1.ebuild
new file mode 100644
index 000000000000..901a9eba1d5f
--- /dev/null
+++ b/dev-python/ipython/ipython-8.15.0-r1.ebuild
@@ -0,0 +1,160 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{10..11} )
+PYTHON_REQ_USE='readline,sqlite,threads(+)'
+
+inherit distutils-r1 optfeature pypi virtualx
+
+DESCRIPTION="Advanced interactive shell for Python"
+HOMEPAGE="
+	https://ipython.org/
+	https://github.com/ipython/ipython/
+	https://pypi.org/project/ipython/
+"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~arm64-macos ~x64-macos"
+IUSE="doc examples notebook nbconvert qt5 +smp test"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	dev-python/backcall[${PYTHON_USEDEP}]
+	dev-python/decorator[${PYTHON_USEDEP}]
+	>=dev-python/jedi-0.16[${PYTHON_USEDEP}]
+	dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+	>=dev-python/pexpect-4.3[${PYTHON_USEDEP}]
+	dev-python/pickleshare[${PYTHON_USEDEP}]
+	>=dev-python/prompt-toolkit-3.0.38[${PYTHON_USEDEP}]
+	<dev-python/prompt-toolkit-3.1[${PYTHON_USEDEP}]
+	>=dev-python/pygments-2.4.0[${PYTHON_USEDEP}]
+	dev-python/setuptools[${PYTHON_USEDEP}]
+	dev-python/stack-data[${PYTHON_USEDEP}]
+	>=dev-python/traitlets-5.0[${PYTHON_USEDEP}]
+	$(python_gen_cond_dep '
+		dev-python/exceptiongroup[${PYTHON_USEDEP}]
+	' 3.10)
+"
+
+BDEPEND="
+	test? (
+		app-text/dvipng[truetype]
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+		dev-python/nbformat[${PYTHON_USEDEP}]
+		>=dev-python/numpy-1.21[${PYTHON_USEDEP}]
+		dev-python/requests[${PYTHON_USEDEP}]
+		dev-python/testpath[${PYTHON_USEDEP}]
+	)
+	doc? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		>=dev-python/sphinx-2[${PYTHON_USEDEP}]
+		dev-python/sphinx-rtd-theme[${PYTHON_USEDEP}]
+	)
+"
+
+distutils_enable_tests pytest
+
+RDEPEND+="
+	nbconvert? (
+		dev-python/nbconvert[${PYTHON_USEDEP}]
+	)
+"
+PDEPEND="
+	notebook? (
+		dev-python/notebook[${PYTHON_USEDEP}]
+		dev-python/ipywidgets[${PYTHON_USEDEP}]
+		dev-python/widgetsnbextension[${PYTHON_USEDEP}]
+	)
+	qt5? ( dev-python/qtconsole[${PYTHON_USEDEP}] )
+	smp? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		>=dev-python/ipyparallel-6.2.3[${PYTHON_USEDEP}]
+	)
+"
+
+PATCHES=( "${FILESDIR}"/2.1.0-substitute-files.patch )
+
+python_prepare_all() {
+	# Remove out of date insource files
+	#rm IPython/extensions/cythonmagic.py || die
+	#rm IPython/extensions/rmagic.py || die
+
+	# Prevent un-needed download during build
+	if use doc; then
+		sed -e "/^    'sphinx.ext.intersphinx',/d" -i docs/source/conf.py || die
+	fi
+
+	# Rename the test directory to reduce sys.path pollution
+	# https://github.com/ipython/ipython/issues/12892
+	mv IPython/extensions/{,ipython_}tests || die
+
+	distutils-r1_python_prepare_all
+}
+
+python_compile_all() {
+	if use doc; then
+		emake -C docs html_noapi
+		HTML_DOCS=( docs/build/html/. )
+	fi
+}
+
+src_test() {
+	virtx distutils-r1_src_test
+}
+
+python_test() {
+	local -x IPYTHON_TESTING_TIMEOUT_SCALE=20
+	local EPYTEST_DESELECT=(
+		# TODO: looks to be a regression due to a newer dep
+		IPython/core/tests/test_oinspect.py::test_class_signature
+		IPython/core/tests/test_oinspect.py::test_render_signature_long
+		IPython/terminal/tests/test_shortcuts.py::test_modify_shortcut_with_filters
+	)
+	# nonfatal implied by virtx
+	nonfatal epytest || die "Tests failed with ${EPYTHON}"
+}
+
+python_install() {
+	distutils-r1_python_install
+
+	# Create ipythonX.Y symlinks.
+	# TODO:
+	# 1. do we want them for pypy? No.  pypy has no numpy
+	# 2. handle it in the eclass instead (use _python_ln_rel).
+	# With pypy not an option the dosym becomes unconditional
+	dosym ../lib/python-exec/${EPYTHON}/ipython \
+		/usr/bin/ipython${EPYTHON#python}
+}
+
+python_install_all() {
+	distutils-r1_python_install_all
+
+	if use examples; then
+		dodoc -r examples
+		docompress -x /usr/share/doc/${PF}/examples
+	fi
+}
+
+pkg_postinst() {
+	optfeature "code formatting" dev-python/black
+	optfeature "sympyprinting" dev-python/sympy
+	optfeature "cythonmagic" dev-python/cython
+	optfeature "%lprun magic command" dev-python/line-profiler
+	optfeature "%matplotlib magic command" dev-python/matplotlib
+	optfeature "%mprun magic command" dev-python/memory-profiler
+
+	if use nbconvert; then
+		if ! has_version virtual/pandoc ; then
+			einfo "Node.js will be used to convert notebooks to other formats"
+			einfo "like HTML. Support for that is still experimental. If you"
+			einfo "encounter any problems, please use app-text/pandoc instead."
+		fi
+	fi
+}

diff --git a/dev-python/ipython/ipython-8.16.1-r1.ebuild b/dev-python/ipython/ipython-8.16.1-r1.ebuild
new file mode 100644
index 000000000000..901a9eba1d5f
--- /dev/null
+++ b/dev-python/ipython/ipython-8.16.1-r1.ebuild
@@ -0,0 +1,160 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{10..11} )
+PYTHON_REQ_USE='readline,sqlite,threads(+)'
+
+inherit distutils-r1 optfeature pypi virtualx
+
+DESCRIPTION="Advanced interactive shell for Python"
+HOMEPAGE="
+	https://ipython.org/
+	https://github.com/ipython/ipython/
+	https://pypi.org/project/ipython/
+"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~arm64-macos ~x64-macos"
+IUSE="doc examples notebook nbconvert qt5 +smp test"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	dev-python/backcall[${PYTHON_USEDEP}]
+	dev-python/decorator[${PYTHON_USEDEP}]
+	>=dev-python/jedi-0.16[${PYTHON_USEDEP}]
+	dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+	>=dev-python/pexpect-4.3[${PYTHON_USEDEP}]
+	dev-python/pickleshare[${PYTHON_USEDEP}]
+	>=dev-python/prompt-toolkit-3.0.38[${PYTHON_USEDEP}]
+	<dev-python/prompt-toolkit-3.1[${PYTHON_USEDEP}]
+	>=dev-python/pygments-2.4.0[${PYTHON_USEDEP}]
+	dev-python/setuptools[${PYTHON_USEDEP}]
+	dev-python/stack-data[${PYTHON_USEDEP}]
+	>=dev-python/traitlets-5.0[${PYTHON_USEDEP}]
+	$(python_gen_cond_dep '
+		dev-python/exceptiongroup[${PYTHON_USEDEP}]
+	' 3.10)
+"
+
+BDEPEND="
+	test? (
+		app-text/dvipng[truetype]
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+		dev-python/nbformat[${PYTHON_USEDEP}]
+		>=dev-python/numpy-1.21[${PYTHON_USEDEP}]
+		dev-python/requests[${PYTHON_USEDEP}]
+		dev-python/testpath[${PYTHON_USEDEP}]
+	)
+	doc? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		>=dev-python/sphinx-2[${PYTHON_USEDEP}]
+		dev-python/sphinx-rtd-theme[${PYTHON_USEDEP}]
+	)
+"
+
+distutils_enable_tests pytest
+
+RDEPEND+="
+	nbconvert? (
+		dev-python/nbconvert[${PYTHON_USEDEP}]
+	)
+"
+PDEPEND="
+	notebook? (
+		dev-python/notebook[${PYTHON_USEDEP}]
+		dev-python/ipywidgets[${PYTHON_USEDEP}]
+		dev-python/widgetsnbextension[${PYTHON_USEDEP}]
+	)
+	qt5? ( dev-python/qtconsole[${PYTHON_USEDEP}] )
+	smp? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		>=dev-python/ipyparallel-6.2.3[${PYTHON_USEDEP}]
+	)
+"
+
+PATCHES=( "${FILESDIR}"/2.1.0-substitute-files.patch )
+
+python_prepare_all() {
+	# Remove out of date insource files
+	#rm IPython/extensions/cythonmagic.py || die
+	#rm IPython/extensions/rmagic.py || die
+
+	# Prevent un-needed download during build
+	if use doc; then
+		sed -e "/^    'sphinx.ext.intersphinx',/d" -i docs/source/conf.py || die
+	fi
+
+	# Rename the test directory to reduce sys.path pollution
+	# https://github.com/ipython/ipython/issues/12892
+	mv IPython/extensions/{,ipython_}tests || die
+
+	distutils-r1_python_prepare_all
+}
+
+python_compile_all() {
+	if use doc; then
+		emake -C docs html_noapi
+		HTML_DOCS=( docs/build/html/. )
+	fi
+}
+
+src_test() {
+	virtx distutils-r1_src_test
+}
+
+python_test() {
+	local -x IPYTHON_TESTING_TIMEOUT_SCALE=20
+	local EPYTEST_DESELECT=(
+		# TODO: looks to be a regression due to a newer dep
+		IPython/core/tests/test_oinspect.py::test_class_signature
+		IPython/core/tests/test_oinspect.py::test_render_signature_long
+		IPython/terminal/tests/test_shortcuts.py::test_modify_shortcut_with_filters
+	)
+	# nonfatal implied by virtx
+	nonfatal epytest || die "Tests failed with ${EPYTHON}"
+}
+
+python_install() {
+	distutils-r1_python_install
+
+	# Create ipythonX.Y symlinks.
+	# TODO:
+	# 1. do we want them for pypy? No.  pypy has no numpy
+	# 2. handle it in the eclass instead (use _python_ln_rel).
+	# With pypy not an option the dosym becomes unconditional
+	dosym ../lib/python-exec/${EPYTHON}/ipython \
+		/usr/bin/ipython${EPYTHON#python}
+}
+
+python_install_all() {
+	distutils-r1_python_install_all
+
+	if use examples; then
+		dodoc -r examples
+		docompress -x /usr/share/doc/${PF}/examples
+	fi
+}
+
+pkg_postinst() {
+	optfeature "code formatting" dev-python/black
+	optfeature "sympyprinting" dev-python/sympy
+	optfeature "cythonmagic" dev-python/cython
+	optfeature "%lprun magic command" dev-python/line-profiler
+	optfeature "%matplotlib magic command" dev-python/matplotlib
+	optfeature "%mprun magic command" dev-python/memory-profiler
+
+	if use nbconvert; then
+		if ! has_version virtual/pandoc ; then
+			einfo "Node.js will be used to convert notebooks to other formats"
+			einfo "like HTML. Support for that is still experimental. If you"
+			einfo "encounter any problems, please use app-text/pandoc instead."
+		fi
+	fi
+}

diff --git a/dev-python/ipython/ipython-8.17.1-r1.ebuild b/dev-python/ipython/ipython-8.17.1-r1.ebuild
new file mode 100644
index 000000000000..08d9459f3351
--- /dev/null
+++ b/dev-python/ipython/ipython-8.17.1-r1.ebuild
@@ -0,0 +1,159 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{10..12} )
+PYTHON_REQ_USE='readline,sqlite,threads(+)'
+
+inherit distutils-r1 optfeature pypi virtualx
+
+DESCRIPTION="Advanced interactive shell for Python"
+HOMEPAGE="
+	https://ipython.org/
+	https://github.com/ipython/ipython/
+	https://pypi.org/project/ipython/
+"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~arm64-macos ~x64-macos"
+IUSE="doc examples notebook nbconvert qt5 +smp test"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	dev-python/decorator[${PYTHON_USEDEP}]
+	>=dev-python/jedi-0.16[${PYTHON_USEDEP}]
+	dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+	>=dev-python/pexpect-4.3[${PYTHON_USEDEP}]
+	>=dev-python/prompt-toolkit-3.0.38[${PYTHON_USEDEP}]
+	<dev-python/prompt-toolkit-3.1[${PYTHON_USEDEP}]
+	>=dev-python/pygments-2.4.0[${PYTHON_USEDEP}]
+	dev-python/setuptools[${PYTHON_USEDEP}]
+	dev-python/stack-data[${PYTHON_USEDEP}]
+	>=dev-python/traitlets-5.0[${PYTHON_USEDEP}]
+	$(python_gen_cond_dep '
+		dev-python/exceptiongroup[${PYTHON_USEDEP}]
+	' 3.10)
+"
+
+BDEPEND="
+	test? (
+		app-text/dvipng[truetype]
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		dev-python/matplotlib-inline[${PYTHON_USEDEP}]
+		dev-python/nbformat[${PYTHON_USEDEP}]
+		>=dev-python/numpy-1.22[${PYTHON_USEDEP}]
+		dev-python/pickleshare[${PYTHON_USEDEP}]
+		dev-python/requests[${PYTHON_USEDEP}]
+		dev-python/testpath[${PYTHON_USEDEP}]
+	)
+	doc? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		dev-python/matplotlib[${PYTHON_USEDEP}]
+		>=dev-python/sphinx-2[${PYTHON_USEDEP}]
+		dev-python/sphinx-rtd-theme[${PYTHON_USEDEP}]
+	)
+"
+
+distutils_enable_tests pytest
+
+RDEPEND+="
+	nbconvert? (
+		dev-python/nbconvert[${PYTHON_USEDEP}]
+	)
+"
+PDEPEND="
+	notebook? (
+		dev-python/notebook[${PYTHON_USEDEP}]
+		dev-python/ipywidgets[${PYTHON_USEDEP}]
+		dev-python/widgetsnbextension[${PYTHON_USEDEP}]
+	)
+	qt5? ( dev-python/qtconsole[${PYTHON_USEDEP}] )
+	smp? (
+		>=dev-python/ipykernel-5.1.0[${PYTHON_USEDEP}]
+		>=dev-python/ipyparallel-6.2.3[${PYTHON_USEDEP}]
+	)
+"
+
+PATCHES=( "${FILESDIR}"/2.1.0-substitute-files.patch )
+
+python_prepare_all() {
+	# Remove out of date insource files
+	#rm IPython/extensions/cythonmagic.py || die
+	#rm IPython/extensions/rmagic.py || die
+
+	# Prevent un-needed download during build
+	if use doc; then
+		sed -e "/^    'sphinx.ext.intersphinx',/d" -i docs/source/conf.py || die
+	fi
+
+	# Rename the test directory to reduce sys.path pollution
+	# https://github.com/ipython/ipython/issues/12892
+	mv IPython/extensions/{,ipython_}tests || die
+
+	distutils-r1_python_prepare_all
+}
+
+python_compile_all() {
+	if use doc; then
+		emake -C docs html_noapi
+		HTML_DOCS=( docs/build/html/. )
+	fi
+}
+
+src_test() {
+	virtx distutils-r1_src_test
+}
+
+python_test() {
+	local -x IPYTHON_TESTING_TIMEOUT_SCALE=20
+	local EPYTEST_DESELECT=(
+		# TODO: looks to be a regression due to a newer dep
+		IPython/core/tests/test_oinspect.py::test_class_signature
+		IPython/core/tests/test_oinspect.py::test_render_signature_long
+		IPython/terminal/tests/test_shortcuts.py::test_modify_shortcut_with_filters
+	)
+	# nonfatal implied by virtx
+	nonfatal epytest || die "Tests failed with ${EPYTHON}"
+}
+
+python_install() {
+	distutils-r1_python_install
+
+	# Create ipythonX.Y symlinks.
+	# TODO:
+	# 1. do we want them for pypy? No.  pypy has no numpy
+	# 2. handle it in the eclass instead (use _python_ln_rel).
+	# With pypy not an option the dosym becomes unconditional
+	dosym ../lib/python-exec/${EPYTHON}/ipython \
+		/usr/bin/ipython${EPYTHON#python}
+}
+
+python_install_all() {
+	distutils-r1_python_install_all
+
+	if use examples; then
+		dodoc -r examples
+		docompress -x /usr/share/doc/${PF}/examples
+	fi
+}
+
+pkg_postinst() {
+	optfeature "code formatting" dev-python/black
+	optfeature "sympyprinting" dev-python/sympy
+	optfeature "cythonmagic" dev-python/cython
+	optfeature "%lprun magic command" dev-python/line-profiler
+	optfeature "%matplotlib magic command" dev-python/matplotlib-inline
+	optfeature "%mprun magic command" dev-python/memory-profiler
+
+	if use nbconvert; then
+		if ! has_version virtual/pandoc ; then
+			einfo "Node.js will be used to convert notebooks to other formats"
+			einfo "like HTML. Support for that is still experimental. If you"
+			einfo "encounter any problems, please use app-text/pandoc instead."
+		fi
+	fi
+}