diff --git a/dev-python/cffi-python2/cffi-python2-1.14.0-r2.ebuild b/dev-python/cffi-python2/cffi-python2-1.14.0-r3.ebuild similarity index 96% rename from dev-python/cffi-python2/cffi-python2-1.14.0-r2.ebuild rename to dev-python/cffi-python2/cffi-python2-1.14.0-r3.ebuild index 912054989..7888fc5fc 100644 --- a/dev-python/cffi-python2/cffi-python2-1.14.0-r2.ebuild +++ b/dev-python/cffi-python2/cffi-python2-1.14.0-r3.ebuild @@ -25,7 +25,7 @@ RESTRICT="test" DEPEND="dev-libs/libffi:=" RDEPEND="${DEPEND} !dev-python/cffi[python_targets_python2_7] - dev-python/pycparser[${PYTHON_USEDEP}]" + dev-python/pycparser-python2[${PYTHON_USEDEP}]" BDEPEND="${RDEPEND} virtual/pkgconfig" diff --git a/dev-python/faulthandler-python2/Manifest b/dev-python/faulthandler-python2/Manifest new file mode 100644 index 000000000..61405407f --- /dev/null +++ b/dev-python/faulthandler-python2/Manifest @@ -0,0 +1 @@ +DIST faulthandler-3.0.tar.gz 55577 BLAKE2B 8c4157393eb912d3f0e42ab6b942390a0ba2c068559ab8b66e6e3d961a2f7750f9cab000429feba46c0f9cc0a81ac2c8570d092ead1dcec8ea4e76e555cd1a8b SHA512 9e31682338e572e77e22a510637877c3e27440bc451854a898c5e58238d28a1bbf824cb2b44d1f1f11d8a4f491ddc299982a3d452eebec38bc2a03a824bac392 diff --git a/dev-python/faulthandler-python2/faulthandler-python2-3.0.ebuild b/dev-python/faulthandler-python2/faulthandler-python2-3.0.ebuild new file mode 100644 index 000000000..734cba92b --- /dev/null +++ b/dev-python/faulthandler-python2/faulthandler-python2-3.0.ebuild @@ -0,0 +1,32 @@ +# Copyright 1999-2018 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 + +PYTHON_COMPAT=( python2_7 ) + +inherit distutils-r1 + +MY_PN=faulthandler +MY_P=$MY_PN-$PV +DESCRIPTION="functions to dump Python tracebacks explicitly (on fault, user signal, timeout)" +HOMEPAGE="https://github.com/haypo/faulthandler https://pypi.org/project/faulthandler/" +SRC_URI="mirror://pypi/${MY_PN:0:1}/${MY_PN}/${MY_P}.tar.gz" + +LICENSE="BSD-2" +SLOT="0" +KEYWORDS="amd64 ppc ppc64 x86" +IUSE="" +RESTRICT="test" + +DEPEND="dev-python/setuptools[${PYTHON_USEDEP}]" +RDEPEND=" + !dev-python/${MY_PN}[python_targets_python2_7] +" + +S="${WORKDIR}/${MY_PN}-${PV}" + +python_install_all() { + distutils-r1_python_install_all + rm -r ${D}/usr/share +} diff --git a/dev-python/faulthandler-python2/metadata.xml b/dev-python/faulthandler-python2/metadata.xml new file mode 100644 index 000000000..f284f1fa6 --- /dev/null +++ b/dev-python/faulthandler-python2/metadata.xml @@ -0,0 +1,11 @@ + + + + + maintainer-wanted + + + haypo/faulthandler + faulthandler + + diff --git a/dev-python/ply-python2/Manifest b/dev-python/ply-python2/Manifest new file mode 100644 index 000000000..d81f6c1fe --- /dev/null +++ b/dev-python/ply-python2/Manifest @@ -0,0 +1 @@ +DIST ply-3.11.tar.gz 159130 BLAKE2B 58c50b9dad445ad83a64aaa8174ed4602b36f5c8df33a7d62590a92388c4a21c9800599c1d4e4db6f02630e8dee4c8482611e26498e4aa8ccdb2cf3453ae1db4 SHA512 37e39a4f930874933223be58a3da7f259e155b75135f1edd47069b3b40e5e96af883ebf1c8a1bbd32f914a9e92cfc12e29fec05cf61b518f46c1d37421b20008 diff --git a/dev-python/ply-python2/files/3.6-picklefile-IOError.patch b/dev-python/ply-python2/files/3.6-picklefile-IOError.patch new file mode 100644 index 000000000..85b39494a --- /dev/null +++ b/dev-python/ply-python2/files/3.6-picklefile-IOError.patch @@ -0,0 +1,24 @@ +From f50768b0b2176998675e728d84ac05f0eef19614 Mon Sep 17 00:00:00 2001 +From: Mike Gilbert +Date: Sun, 17 May 2015 12:14:16 -0400 +Subject: [PATCH] Catch/ignore IOError when opening picklefile for reading in + yacc.yacc() + +Should resolve #66. +--- + ply/yacc.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/ply/yacc.py b/ply/yacc.py +index eb02cc2..2835c90 100644 +--- a/ply/yacc.py ++++ b/ply/yacc.py +@@ -3265,6 +3265,8 @@ def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, star + errorlog.warning(str(e)) + except ImportError: + pass ++ except IOError: ++ pass + + if debuglog is None: + if debug: diff --git a/dev-python/ply-python2/metadata.xml b/dev-python/ply-python2/metadata.xml new file mode 100644 index 000000000..d8c3132d3 --- /dev/null +++ b/dev-python/ply-python2/metadata.xml @@ -0,0 +1,23 @@ + + + + + maintainer-wanted + + +PLY is a Python-only implementation of the popular compiler construction +tools lex and yacc. The implementation borrows ideas from a number of +previous efforts; most notably John Aycock's SPARK toolkit. However, +the overall flavor of the implementation is more closely modeled after +the C version of lex and yacc. The other significant feature of PLY is +that it provides extensive input validation and error reporting--much +more so than other Python parsing tools. + + +PLYはLexとYaccの有名なコンパイラ・コンストラクション・ツールのPython言語実装です +。この実装は以前の試みから幾つものアイディアを借りています。そのほとんどがJohn AycockのSPARKツールキットからです。しかしながら、実装の全体像はC言語によるLexとYaccにより近いモデルです。PLYの他の重要点は幅広い入力バリデーションとエラー報告を提供する点です。 -- その二点は他のPython言語パーサーより優れています。 + + + ply + + diff --git a/dev-python/ply-python2/ply-python2-3.11.ebuild b/dev-python/ply-python2/ply-python2-3.11.ebuild new file mode 100644 index 000000000..2e5ed1263 --- /dev/null +++ b/dev-python/ply-python2/ply-python2-3.11.ebuild @@ -0,0 +1,32 @@ +# Copyright 1999-2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 + +PYTHON_COMPAT=( python2_7 ) + +inherit distutils-r1 + +MY_PN=ply +MY_P=$MY_PN-$PV +DESCRIPTION="Python Lex-Yacc library" +HOMEPAGE="http://www.dabeaz.com/ply/ https://pypi.org/project/ply/" +SRC_URI="mirror://pypi/${MY_PN:0:1}/${MY_PN}/${MY_P}.tar.gz" + +LICENSE="BSD" +SLOT="0/$PV" +KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~m68k ~mips ppc ppc64 ~riscv s390 sparc x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris" +RESTRICT="test" + +PATCHES=( "${FILESDIR}/3.6-picklefile-IOError.patch" ) + +RDEPEND=" + !dev-python/ply[python_targets_python2_7] +" + +S="${WORKDIR}/${MY_PN}-${PV}" + +python_install_all() { + distutils-r1_python_install_all + rm -r ${D}/usr/share +} diff --git a/dev-python/pycairo-python2/Manifest b/dev-python/pycairo-python2/Manifest new file mode 100644 index 000000000..131b894f4 --- /dev/null +++ b/dev-python/pycairo-python2/Manifest @@ -0,0 +1 @@ +DIST pycairo-1.18.2.tar.gz 200462 BLAKE2B 1f755dc90fe3ee50aa68273a0816752312f144831ff857709e1a4695a58646ffe6be518733480ed37231c213a11d4e5aaf8dfd1cfa68104873bc7d4192435b89 SHA512 279ea80413ba55d493d51455685da09afa1f5c45e2930c3fca3e417a8afe6645a0d8131201f79482de59e5ec56cfef62eac65ed88fe88866bfcc06503dcc59e0 diff --git a/dev-python/pycairo-python2/files/pycairo-1.19.1-py39.patch b/dev-python/pycairo-python2/files/pycairo-1.19.1-py39.patch new file mode 100644 index 000000000..97b20227c --- /dev/null +++ b/dev-python/pycairo-python2/files/pycairo-1.19.1-py39.patch @@ -0,0 +1,26 @@ +From 3ecf0a4060d6de3b92a77a393ece663455cf6add Mon Sep 17 00:00:00 2001 +From: Christoph Reiter +Date: Sun, 10 May 2020 11:22:40 +0200 +Subject: [PATCH] tests: Fix syntax issue with Python 3.9 + +https://bugs.python.org/issue40246 + +I haven't actually tested with 3.9 yet, so this is just what I found +with grep. +--- + tests/test_enums.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/test_enums.py b/tests/test_enums.py +index 4bc2e3d..02756d0 100644 +--- a/tests/test_enums.py ++++ b/tests/test_enums.py +@@ -79,7 +79,7 @@ def get_prefix(t): + # special case.. + if name == "PathDataType": + name = "Path" +- return"_".join([s.upper() for s in re.findall('[A-Z][^A-Z]*', name)]) ++ return "_".join([s.upper() for s in re.findall('[A-Z][^A-Z]*', name)]) + + for t in types_: + for name in dir(t): diff --git a/dev-python/pycairo-python2/metadata.xml b/dev-python/pycairo-python2/metadata.xml new file mode 100644 index 000000000..0f3e9f1dd --- /dev/null +++ b/dev-python/pycairo-python2/metadata.xml @@ -0,0 +1,7 @@ + + + + + maintainer-wanted + + diff --git a/dev-python/pycairo-python2/pycairo-python2-1.18.2.ebuild b/dev-python/pycairo-python2/pycairo-python2-1.18.2.ebuild new file mode 100644 index 000000000..979d581a7 --- /dev/null +++ b/dev-python/pycairo-python2/pycairo-python2-1.18.2.ebuild @@ -0,0 +1,44 @@ +# Copyright 1999-2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI="7" + +PYTHON_COMPAT=( python2_7 ) +PYTHON_REQ_USE="threads(+)" + +inherit distutils-r1 + +MY_PN=pycairo +MY_P=$MY_PN-$PV +DESCRIPTION="Python bindings for the cairo library" +HOMEPAGE="https://www.cairographics.org/pycairo/ https://github.com/pygobject/pycairo" +SRC_URI="https://github.com/pygobject/${MY_PN}/releases/download/v${PV}/${MY_P}.tar.gz" + +LICENSE="|| ( LGPL-2.1 MPL-1.1 )" +SLOT="0" +KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 s390 sparc x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos" +IUSE="" +RESTRICT="test" + +RDEPEND=" + !dev-python/${MY_PN}[python_targets_python2_7] + >=x11-libs/cairo-1.13.1[svg] +" +DEPEND="${RDEPEND}" +S="${WORKDIR}/${MY_PN}-${PV}" + +distutils_enable_sphinx docs \ + dev-python/sphinx_rtd_theme +distutils_enable_tests setup.py + +python_install() { + distutils-r1_python_install \ + install_pkgconfig --pkgconfigdir="${EPREFIX}/usr/$(get_libdir)/pkgconfig" +} + +python_install_all() { + distutils-r1_python_install_all + rm -r ${D}/usr/share + rm -r ${D}/usr/lib*/pkgconfig + rm -r ${D}/usr/include +} diff --git a/dev-python/pycparser-python2/Manifest b/dev-python/pycparser-python2/Manifest new file mode 100644 index 000000000..5ec1265d1 --- /dev/null +++ b/dev-python/pycparser-python2/Manifest @@ -0,0 +1 @@ +DIST pycparser-2.20.tar.gz 161330 BLAKE2B 9a114e4b73e6c3c495bd78c393957146ec425eb5b15d72266cbf424f15e8d2e2e6402ef36d60a9dff41b393aab80fe1356befd25549517f398e129836a76b037 SHA512 ff0853c9f981b43b4f2e879350715c07b02cf9dab223d4980d8fe0a3138c98041b5f848a9355ae4f1cb45e7f137c03a88843008e18d77af9250e0d9c55f5ca1b diff --git a/dev-python/pycparser-python2/metadata.xml b/dev-python/pycparser-python2/metadata.xml new file mode 100644 index 000000000..c70d9f1fc --- /dev/null +++ b/dev-python/pycparser-python2/metadata.xml @@ -0,0 +1,11 @@ + + + + + maintainer-wanted + + + pycparser + eliben/pycparser + + diff --git a/dev-python/pycparser-python2/pycparser-python2-2.20.ebuild b/dev-python/pycparser-python2/pycparser-python2-2.20.ebuild new file mode 100644 index 000000000..1c7e54e38 --- /dev/null +++ b/dev-python/pycparser-python2/pycparser-python2-2.20.ebuild @@ -0,0 +1,55 @@ +# Copyright 1999-2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +PYTHON_COMPAT=( python2_7 ) + +inherit distutils-r1 + +MY_PN=pycparser +MY_P=$MY_PN-$PV +DESCRIPTION="C parser and AST generator written in Python" +HOMEPAGE="https://github.com/eliben/pycparser" +SRC_URI="mirror://pypi/${MY_PN:0:1}/${MY_PN}/${MY_P}.tar.gz" + +LICENSE="BSD" +SLOT="0" +KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~m68k ~mips ppc ppc64 ~riscv s390 sparc x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris" +RESTRICT="test" +S="${WORKDIR}/${MY_PN}-${PV}" + +RDEPEND=" + !dev-python/${MY_PN}[python_targets_python2_7] + dev-python/ply-python2:=[${PYTHON_USEDEP}]" +BDEPEND="${RDEPEND} + dev-python/setuptools[${PYTHON_USEDEP}]" + +python_prepare_all() { + # remove the original files to guarantee their regen + rm pycparser/{c_ast,lextab,yacctab}.py || die + + # kill sys.path manipulations to force the tests to use built files + sed -i -e '/sys\.path/d' tests/*.py || die + + distutils-r1_python_prepare_all +} + +python_compile() { + distutils-r1_python_compile + + # note: tables built by py3.5+ are incompatible with older versions + # because of 100 group limit of 're' module -- just generate them + # separately optimized for each target instead + pushd "${BUILD_DIR}"/lib/pycparser > /dev/null || die + "${PYTHON}" _build_tables.py || die + popd > /dev/null || die +} + +python_install() { + distutils-r1_python_install + + # setup.py generates {c_ast,lextab,yacctab}.py with bytecode disabled. + python_optimize + rm -r ${D}/usr/share +} diff --git a/dev-python/pyopengl-python2/Manifest b/dev-python/pyopengl-python2/Manifest new file mode 100644 index 000000000..a80860670 --- /dev/null +++ b/dev-python/pyopengl-python2/Manifest @@ -0,0 +1 @@ +DIST PyOpenGL-3.1.0.tar.gz 1172688 BLAKE2B 9865a10e8b5d2756192077b4b079658c680b9f47bdaccb33285fb1942bc678b29f6a69359a1486ec023b1a73d714a7e0209b2f57776fe8b5e4a5e2d0803dba4f SHA512 f748017ab3734c7672c3fdbedcea80df297a91a78b111533e260feb0868ebb02935666c041f77db03841ee8f90057d9c53c53b00b097aae4cf67a52c7fc9c2eb diff --git a/dev-python/pyopengl-python2/metadata.xml b/dev-python/pyopengl-python2/metadata.xml new file mode 100644 index 000000000..d7a43d08a --- /dev/null +++ b/dev-python/pyopengl-python2/metadata.xml @@ -0,0 +1,11 @@ + + + + + maintainer-wanted + + + PyOpenGL + pyopengl + + diff --git a/dev-python/pyopengl-python2/pyopengl-python2-3.1.0.ebuild b/dev-python/pyopengl-python2/pyopengl-python2-3.1.0.ebuild new file mode 100644 index 000000000..0d2426dbc --- /dev/null +++ b/dev-python/pyopengl-python2/pyopengl-python2-3.1.0.ebuild @@ -0,0 +1,33 @@ +# Copyright 1999-2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=5 +PYTHON_COMPAT=( python2_7 ) + +inherit distutils-r1 + +ORIG_PN=pyopengl +MY_PN="PyOpenGL" +MY_P="${MY_PN}-${PV}" + +DESCRIPTION="Python OpenGL bindings" +HOMEPAGE="http://pyopengl.sourceforge.net/ https://pypi.org/project/PyOpenGL/" +SRC_URI="mirror://pypi/${MY_PN:0:1}/${MY_PN}/${MY_P}.tar.gz" +# mirror://sourceforge/pyopengl/${MY_P}.tar.gz" # broken mirror for this release +LICENSE="BSD" + +SLOT="0" +KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 sparc x86 ~amd64-linux ~x86-linux" +RESTRICT="test" +IUSE="" + +RDEPEND=" + !dev-python/${ORIG_PN}[python_targets_python2_7] + media-libs/freeglut + virtual/opengl + x11-libs/libXi + x11-libs/libXmu" +DEPEND="${RDEPEND} + dev-python/setuptools[${PYTHON_USEDEP}]" + +S="${WORKDIR}/${MY_P}" diff --git a/dev-python/wxpython2/Manifest b/dev-python/wxpython2/Manifest new file mode 100644 index 000000000..00c2abfef --- /dev/null +++ b/dev-python/wxpython2/Manifest @@ -0,0 +1 @@ +DIST wxPython-src-3.0.2.0.tar.bz2 58304944 BLAKE2B 1144acf2cfa0a18aa2f90aabe81aaeca54d3fe6139818267dbc031accbae38035478a64ec084fe8bb8b89126fb70ff96e68981026df8ad3fc82e81c6d0e22d1a SHA512 a3798e89ff19344253aac7d771971e519f7fa9723e82bd97e98f16fd7f1572e513170b02295b872dae0b1ae3fa95efc4ef34d078045b839694b4fdad3a27c9e4 diff --git a/dev-python/wxpython2/files/wxpython-2.8-no-preservatives-added.patch b/dev-python/wxpython2/files/wxpython-2.8-no-preservatives-added.patch new file mode 100644 index 000000000..5e4221d51 --- /dev/null +++ b/dev-python/wxpython2/files/wxpython-2.8-no-preservatives-added.patch @@ -0,0 +1,16 @@ +Portage preserve-libs removes the linker name (.so) of a library but leaves +the soname (.so.4) and realname (.so.4.0) installed. findLib searches for +mywxlibname.* and returns true if anything is found. Disaster ensues. + + +--- a/wxPython/config.py ++++ b/wxPython/config.py +@@ -612,7 +612,7 @@ def findLib(name, libdirs): + dirs = libdirs[:] + for d in dirs: + p = os.path.join(d, name) +- if glob.glob(p+'*') != []: ++ if glob.glob(p+'*.so') != []: + return True + return False + diff --git a/dev-python/wxpython2/files/wxpython-2.8.11-drop-editra.patch b/dev-python/wxpython2/files/wxpython-2.8.11-drop-editra.patch new file mode 100644 index 000000000..9555bb57e --- /dev/null +++ b/dev-python/wxpython2/files/wxpython-2.8.11-drop-editra.patch @@ -0,0 +1,48 @@ +--- a/wxPython/setup.py ++++ b/wxPython/setup.py +@@ -887,13 +887,6 @@ WX_PKGLIST = [ 'wx', + 'wx.tools', + 'wx.tools.XRCed', + 'wx.tools.XRCed.plugins', +- 'wx.tools.Editra', +- 'wx.tools.Editra.src', +- 'wx.tools.Editra.src.autocomp', +- 'wx.tools.Editra.src.eclib', +- 'wx.tools.Editra.src.ebmlib', +- 'wx.tools.Editra.src.extern', +- 'wx.tools.Editra.src.syntax', + ] + + if not EGGing: +@@ -920,7 +913,6 @@ else: + opj('scripts/pywrap'), + opj('scripts/pywxrc'), + opj('scripts/xrced'), +- opj('scripts/editra'), + ] + if os.name == 'nt': + SCRIPTS.append( opj('scripts/genaxmodule') ) +@@ -934,15 +926,6 @@ DATA_FILES += find_data_files('wx/tools/XRCed', '*.txt', '*.xrc', '*.htb') + DATA_FILES += find_data_files('wx/tools/XRCed/plugins', '*.crx') + DATA_FILES += find_data_files('wx/tools/XRCed/plugins/bitmaps', '*.png') + +-DATA_FILES += find_data_files('wx/tools/Editra/docs', '*.txt') +-DATA_FILES += find_data_files('wx/tools/Editra/locale', '*.mo') +-DATA_FILES += find_data_files('wx/tools/Editra/pixmaps', +- '*.png', '*.icns', '*.ico', 'README', 'AUTHORS', 'COPYING') +-DATA_FILES += find_data_files('wx/tools/Editra/plugins', '*.egg') +-DATA_FILES += find_data_files('wx/tools/Editra/src', 'README') +-DATA_FILES += find_data_files('wx/tools/Editra/styles', '*.ess') +-DATA_FILES += find_data_files('wx/tools/Editra/tests/syntax', '*') +-DATA_FILES += find_data_files('wx/tools/Editra', '[A-Z]*', recursive=False) + + + ## import pprint +@@ -993,7 +976,6 @@ if EGGing: + 'pyshell = wx.py.PyShell:main', + 'pywrap = wx.py.PyWrap:main', + 'helpviewer = wx.tools.helpviewer:main', +- 'editra = wx.tools.Editra.launcher:main', + 'xrced = wx.tools.XRCed.xrced:main', + ], + }, diff --git a/dev-python/wxpython2/files/wxpython-2.8.12.1-disable-egging-mode.patch b/dev-python/wxpython2/files/wxpython-2.8.12.1-disable-egging-mode.patch new file mode 100644 index 000000000..1497a2c70 --- /dev/null +++ b/dev-python/wxpython2/files/wxpython-2.8.12.1-disable-egging-mode.patch @@ -0,0 +1,34 @@ +From c4072ed7bc923039e544319f52d0761b7a4600a4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= +Date: Mon, 22 Apr 2013 18:02:37 +0200 +Subject: [PATCH] Trigger 'EGGing' mode only by 'bdist_egg' and not 'egg_info'. + +We use the 'egg_info' command to explicitly enforce temporary EGG file +location outside the source tree on Gentoo. As a result, our build +command activates the 'EGGing' mode and wxPython is not installed +properly. + +I believe that the 'EGGing' mode should be activated only by an explicit +call to 'bdist_egg' command where the expected files are actually +created. The 'egg_info' command is a more broad one and is often used +implicitly, e.g. by the 'install' command. +--- + config.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/config.py b/config.py +index 4fbd83f..b45707d 100644 +--- a/config.py ++++ b/config.py +@@ -23,7 +23,7 @@ + import sys, os, glob, fnmatch, tempfile + import subprocess + +-EGGing = 'bdist_egg' in sys.argv or 'egg_info' in sys.argv ++EGGing = 'bdist_egg' in sys.argv + if not EGGing: + from distutils.core import setup, Extension + else: +-- +1.8.1.5 + diff --git a/dev-python/wxpython2/files/wxpython-3.0-wxversion-demo.patch b/dev-python/wxpython2/files/wxpython-3.0-wxversion-demo.patch new file mode 100644 index 000000000..a4f6b0b07 --- /dev/null +++ b/dev-python/wxpython2/files/wxpython-3.0-wxversion-demo.patch @@ -0,0 +1,10 @@ +--- demo/demo.org ++++ demo/demo.py +@@ -1,4 +1,7 @@ + #!/usr/bin/env python + ++import wxversion ++wxversion.select("3.0") ++ + import Main + Main.main() diff --git a/dev-python/wxpython2/files/wxpython-3.0.0.0-wxversion-scripts.patch b/dev-python/wxpython2/files/wxpython-3.0.0.0-wxversion-scripts.patch new file mode 100644 index 000000000..9f0cb8922 --- /dev/null +++ b/dev-python/wxpython2/files/wxpython-3.0.0.0-wxversion-scripts.patch @@ -0,0 +1,211 @@ +--- a/distrib/PyAlaMode.desktop ++++ b/distrib/PyAlaMode.desktop +@@ -1,8 +1,8 @@ + [Desktop Entry] +-Name=PyAlaMode ++Name=PyAlaMode (3.0) + Comment=GUI Python Shell with Filling and editor windows +-Exec=pyalamode +-Icon=PyCrust ++Exec=pyalamode-3.0 ++Icon=PyCrust-3.0 + Terminal=false + Type=Application + Categories=Development; +--- a/distrib/PyCrust.desktop ++++ b/distrib/PyCrust.desktop +@@ -1,8 +1,8 @@ + [Desktop Entry] +-Name=PyCrust ++Name=PyCrust (3.0) + Comment=GUI Python Shell with Filling +-Exec=pycrust +-Icon=PyCrust ++Exec=pycrust-3.0 ++Icon=PyCrust-3.0 + Terminal=false + Type=Application + Categories=Development; +--- a/distrib/PyShell.desktop ++++ b/distrib/PyShell.desktop +@@ -1,8 +1,8 @@ + [Desktop Entry] +-Name=PyShell ++Name=PyShell (3.0) + Comment=GUI Python Shell +-Exec=pyshell +-Icon=PyCrust ++Exec=pyshell-3.0 ++Icon=PyCrust-3.0 + Terminal=false + Type=Application + Categories=Development; +--- a/distrib/PySlices.desktop ++++ b/distrib/PySlices.desktop +@@ -1,8 +1,8 @@ + [Desktop Entry] +-Name=PySlices ++Name=PySlices (3.0) + Comment=GUI Python Shell with Filling +-Exec=pyslices +-Icon=PySlices ++Exec=pyslices-3.0 ++Icon=PySlices-3.0 + Terminal=false + Type=Application + Categories=Development; +--- a/distrib/PySlicesShell.desktop ++++ b/distrib/PySlicesShell.desktop +@@ -1,9 +1,8 @@ +- + [Desktop Entry] +-Name=PySlicesShell ++Name=PySlicesShell (3.0) + Comment=GUI Python Shell +-Exec=pysliceshell +-Icon=PySlices ++Exec=pysliceshell-3.0 ++Icon=PySlices-3.0 + Terminal=false + Type=Application + Categories=Development; +--- a/distrib/XRCed.desktop ++++ b/distrib/XRCed.desktop +@@ -1,8 +1,8 @@ + [Desktop Entry] +-Name=XRCed ++Name=XRCed (3.0) + Comment=wxPython XRC resource editor +-Exec=xrced +-Icon=XRCed ++Exec=xrced-3.0 ++Icon=XRCed-3.0 + Terminal=false + Type=Application + Categories=Development; +--- a/scripts/genaxmodule ++++ b/scripts/genaxmodule +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.tools.genaxmodule import main + main() +--- a/scripts/helpviewer ++++ b/scripts/helpviewer +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.tools.helpviewer import main + main() +--- a/scripts/img2png ++++ b/scripts/img2png +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.tools.img2png import main + main() +--- a/scripts/img2py ++++ b/scripts/img2py +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.tools.img2py import main + main() +--- a/scripts/img2xpm ++++ b/scripts/img2xpm +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.tools.img2xpm import main + main() +--- a/scripts/pyalacarte ++++ b/scripts/pyalacarte +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.py.PyAlaCarte import main + main() +--- a/scripts/pyalamode ++++ b/scripts/pyalamode +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.py.PyAlaMode import main + main() +--- a/scripts/pycrust ++++ b/scripts/pycrust +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.py.PyCrust import main + main() +--- a/scripts/pyshell ++++ b/scripts/pyshell +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.py.PyShell import main + main() +--- a/scripts/pyslices ++++ b/scripts/pyslices +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.py.PySlices import main + main() +--- a/scripts/pysliceshell ++++ b/scripts/pysliceshell +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.py.PySlicesShell import main + main() +--- a/scripts/pywrap ++++ b/scripts/pywrap +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.py.PyWrap import main + main() +--- a/scripts/pywxrc ++++ b/scripts/pywxrc +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.tools.pywxrc import main + main() +--- a/scripts/xrced ++++ b/scripts/xrced +@@ -1,4 +1,6 @@ + #!/usr/bin/env python ++import wxversion ++wxversion.select("3.0") + + from wx.tools.XRCed.xrced import main + main() diff --git a/dev-python/wxpython2/files/wxpython-4.0.6-no-webkit.patch b/dev-python/wxpython2/files/wxpython-4.0.6-no-webkit.patch new file mode 100644 index 000000000..795de3a93 --- /dev/null +++ b/dev-python/wxpython2/files/wxpython-4.0.6-no-webkit.patch @@ -0,0 +1,27 @@ +diff -ru wxPython-4.0.5-orig/wscript wxPython-4.0.5/wscript +--- wxPython-4.0.5-orig/wscript 2019-05-18 22:03:12.000000000 -0400 ++++ wxPython-4.0.5/wscript 2019-05-22 07:59:46.522966555 -0400 +@@ -230,15 +230,6 @@ + uselib_store='WXGL', mandatory=True, + msg='Finding libs for WXGL') + +- if cfg.checkSetup(wxConfigDir, 'wxUSE_WEBVIEW'): +- wv_libs = '--libs webview,core,net' +- else: +- wv_libs = '--libs core,net' +- conf.check_cfg(path=conf.options.wx_config, package='', +- args='--cxxflags ' + wv_libs + rpath, +- uselib_store='WXWEBVIEW', mandatory=True, +- msg='Finding libs for WXWEBVIEW') +- + if isDarwin: + conf.check_cfg(path=conf.options.wx_config, package='', + args='--cxxflags --libs core,net' + rpath, +@@ -591,7 +582,6 @@ + makeETGRule(bld, 'etg/_stc.py', '_stc', 'WXSTC') + makeETGRule(bld, 'etg/_html.py', '_html', 'WXHTML') + makeETGRule(bld, 'etg/_glcanvas.py', '_glcanvas', 'WXGL') +- makeETGRule(bld, 'etg/_html2.py', '_html2', 'WXWEBVIEW') + makeETGRule(bld, 'etg/_xml.py', '_xml', 'WXXML') + makeETGRule(bld, 'etg/_xrc.py', '_xrc', 'WXXRC') + makeETGRule(bld, 'etg/_richtext.py', '_richtext', 'WXHTML WXRICHTEXT') diff --git a/dev-python/wxpython2/files/wxpython-4.0.6-skip-broken-tests.patch b/dev-python/wxpython2/files/wxpython-4.0.6-skip-broken-tests.patch new file mode 100644 index 000000000..22a561627 --- /dev/null +++ b/dev-python/wxpython2/files/wxpython-4.0.6-skip-broken-tests.patch @@ -0,0 +1,91 @@ +diff -ru wxPython-4.0.6-orig/unittests/test_frame.py wxPython-4.0.6/unittests/test_frame.py +--- wxPython-4.0.6-orig/unittests/test_frame.py 2019-05-21 19:12:12.000000000 -0400 ++++ wxPython-4.0.6/unittests/test_frame.py 2019-05-24 10:15:51.350004356 -0400 +@@ -50,7 +50,7 @@ + f.Close() + + +- def test_frameRestore(self): ++ def xtest_frameRestore(self): + f = wx.Frame(self.frame, title="Title", pos=(50,50), size=(100,100)) + f.Show() + f.Maximize() +diff -ru wxPython-4.0.6-orig/unittests/test_graphics.py wxPython-4.0.6/unittests/test_graphics.py +--- wxPython-4.0.6-orig/unittests/test_graphics.py 2019-05-21 19:12:12.000000000 -0400 ++++ wxPython-4.0.6/unittests/test_graphics.py 2019-05-24 10:16:06.520256643 -0400 +@@ -23,7 +23,7 @@ + gc = wx.GraphicsContext.Create(img) + self.assertTrue(gc.IsOk()) + +- def test_gcCreate4(self): ++ def xtest_gcCreate4(self): + class MyPanel(wx.Panel): + def __init__(self, parent): + super(MyPanel, self).__init__(parent) +diff -ru wxPython-4.0.6-orig/unittests/test_lib_pubsub_provider.py wxPython-4.0.6/unittests/test_lib_pubsub_provider.py +--- wxPython-4.0.6-orig/unittests/test_lib_pubsub_provider.py 2019-05-21 19:12:12.000000000 -0400 ++++ wxPython-4.0.6/unittests/test_lib_pubsub_provider.py 2019-05-24 10:16:49.649969339 -0400 +@@ -49,7 +49,7 @@ + + class lib_pubsub_Except(wtc.PubsubTestCase): + +- def test1(self): ++ def xtest1(self): + + self.pub.addTopicDefnProvider(my_topics, self.pub.TOPIC_TREE_FROM_CLASS) + +diff -ru wxPython-4.0.6-orig/unittests/test_lib_pubsub_topicmgr.py wxPython-4.0.6/unittests/test_lib_pubsub_topicmgr.py +--- wxPython-4.0.6-orig/unittests/test_lib_pubsub_topicmgr.py 2019-05-21 19:12:12.000000000 -0400 ++++ wxPython-4.0.6/unittests/test_lib_pubsub_topicmgr.py 2019-05-24 10:17:18.276438743 -0400 +@@ -215,7 +215,7 @@ + assert 1 == topicMgr.getNumDefnProviders() + topicMgr.clearDefnProviders() + +- def test20_UseProvider(self): ++ def xtest20_UseProvider(self): + # + # Test the use of definition providers for topics. We create + # two so we can check that more than one can work together. +diff -ru wxPython-4.0.6-orig/unittests/test_sizer.py wxPython-4.0.6/unittests/test_sizer.py +--- wxPython-4.0.6-orig/unittests/test_sizer.py 2019-05-21 19:12:12.000000000 -0400 ++++ wxPython-4.0.6/unittests/test_sizer.py 2019-05-24 10:18:03.937181671 -0400 +@@ -71,7 +71,7 @@ + self.assertTrue(items[1].IsSpacer()) + self.assertTrue(items[2].Border == 5) + +- def test_iter(self): ++ def xtest_iter(self): + bs = wx.BoxSizer() + widgetlist = [wx.Panel(self.frame) for _ in range(5)] + +diff -ru wxPython-4.0.6-orig/unittests/test_utils.py wxPython-4.0.6/unittests/test_utils.py +--- wxPython-4.0.6-orig/unittests/test_utils.py 2019-05-21 19:12:12.000000000 -0400 ++++ wxPython-4.0.6/unittests/test_utils.py 2019-05-24 11:14:09.399035368 -0400 +@@ -34,7 +34,7 @@ + with wx.BusyCursor(): + self.myYield() + +- def test_utilsSomeOtherStuff(self): ++ def xtest_utilsSomeOtherStuff(self): + wx.GetBatteryState() + wx.GetPowerType() + wx.GetKeyState(wx.WXK_F1) +diff -ru wxPython-4.0.6-orig/unittests/test_windowid.py wxPython-4.0.6/unittests/test_windowid.py +--- wxPython-4.0.6-orig/unittests/test_windowid.py 2019-05-21 19:12:12.000000000 -0400 ++++ wxPython-4.0.6/unittests/test_windowid.py 2019-05-24 10:18:24.158508491 -0400 +@@ -28,12 +28,12 @@ + assert isinstance(ref, wx.WindowIDRef) + + +- def test_newIdRef03(self): ++ def xtest_newIdRef03(self): + """Check that Auto ID Management is enabled (--enable-autoidman)""" + # This test is expected to fail if autoID mangagement is turned on +- # because a reference to the ID is not being saved, so it will be ++ # because a reference to the ID is not being saved, so it will be + # unreserved when the first widget is destroyed. +- ++ + id = wx.Window.NewControlId() + b = wx.Button(self.frame, id, 'button') + b.Destroy() diff --git a/dev-python/wxpython2/metadata.xml b/dev-python/wxpython2/metadata.xml new file mode 100644 index 000000000..869a1180b --- /dev/null +++ b/dev-python/wxpython2/metadata.xml @@ -0,0 +1,17 @@ + + + + + maintainer-wanted + + + python@gentoo.org + Python + + + Install interactive demo module browser and sample applets. + + + wxWidgets/Phoenix + + diff --git a/dev-python/wxpython2/wxpython2-3.0.2.0.ebuild b/dev-python/wxpython2/wxpython2-3.0.2.0.ebuild new file mode 100644 index 000000000..3a24bdb41 --- /dev/null +++ b/dev-python/wxpython2/wxpython2-3.0.2.0.ebuild @@ -0,0 +1,141 @@ +# Copyright 1999-2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=5 + +PYTHON_COMPAT=( python2_7 ) +WX_GTK_VER="3.0" + +inherit alternatives distutils-r1 eutils fdo-mime flag-o-matic wxwidgets + +ORIG_PN="wxpython" +MY_PN="wxPython-src" + +DESCRIPTION="A blending of the wxWindows C++ class library with Python" +HOMEPAGE="http://www.wxpython.org/" +SRC_URI=" + mirror://sourceforge/wxpython/${MY_PN}-${PV}.tar.bz2" + +LICENSE="wxWinLL-3" +SLOT="3.0" +KEYWORDS="~alpha amd64 arm arm64 ppc ppc64 ~sparc x86" +IUSE="cairo libnotify opengl" +RESTRICT="test" + +RDEPEND=" + !dev-python/${ORIG_PN}[python_targets_python2_7] + dev-lang/python-exec:2[${PYTHON_USEDEP}] + >=x11-libs/wxGTK-${PV}:${WX_GTK_VER}=[libnotify=,opengl?,tiff,X] + dev-libs/glib:2 + dev-python/setuptools[${PYTHON_USEDEP}] + media-libs/libpng:0= + media-libs/tiff:0 + virtual/jpeg + x11-libs/gtk+:2 + x11-libs/pango[X] + cairo? ( >=dev-python/pycairo-python2-1.8.4[${PYTHON_USEDEP}] ) + opengl? ( dev-python/pyopengl-python2[${PYTHON_USEDEP}] )" + +DEPEND="${RDEPEND} + virtual/pkgconfig" + +S="${WORKDIR}/${MY_PN}-${PV}/wxPython" +DOC_S="${WORKDIR}/wxPython-${PV}" + +# The hacky build system seems to be broken with out-of-source builds, +# and installs 'wx' package globally. +DISTUTILS_IN_SOURCE_BUILD=1 + +python_prepare_all() { + sed -i "s:cflags.append('-O3'):pass:" config.py || die "sed failed" + + cd "${S}" + local PATCHES=( + "${FILESDIR}"/${ORIG_PN}-3.0.0.0-wxversion-scripts.patch + # drop editra - we have it as a separate package now + "${FILESDIR}"/${ORIG_PN}-2.8.11-drop-editra.patch + "${FILESDIR}"/${ORIG_PN}-2.8-no-preservatives-added.patch + # fix handling egg_info command + "${FILESDIR}"/${ORIG_PN}-2.8.12.1-disable-egging-mode.patch + ) + + distutils-r1_python_prepare_all +} + +src_configure() { + need-wxwidgets unicode + + mydistutilsargs=( + WX_CONFIG="${WX_CONFIG}" + WXPORT=gtk2 + UNICODE=1 + BUILD_GLCANVAS=$(usex opengl 1 0) + ) +} + +python_compile() { + # We need to have separate libdirs due to hackery, bug #455332. + distutils-r1_python_compile \ + build --build-purelib "${BUILD_DIR}"/lib.common +} + +python_install() { + distutils-r1_python_install \ + build --build-purelib "${BUILD_DIR}"/lib.common + + # adjust the filenames for wxPython slots. + local file + for file in "${D}$(python_get_sitedir)"/wx{version.*,.pth}; do + mv "${file}" "${file}-${SLOT}" || die + done + cd "${ED}"usr/lib/python-exec/"${EPYTHON}" || die + for file in *; do + mv "${file}" "${file}-${SLOT}" || die + + # wrappers are common to all impls, so a parallel run may + # move it for us. ln+rm is more failure-proof. + ln -fs ../lib/python-exec/python-exec2 "${ED}usr/bin/${file}-${SLOT}" || die + rm -f "${ED}usr/bin/${file}" + done +} + +python_install_all() { + dodoc docs/{CHANGES,PyManual,README,wxPackage,wxPythonManual}.txt + + for x in {Py{AlaMode,Crust,Shell},XRCed}; do + newmenu distrib/${x}.desktop ${x}-${SLOT}.desktop + done + newicon wx/py/PyCrust_32.png PyCrust-${SLOT}.png + newicon wx/py/PySlices_32.png PySlices-${SLOT}.png + newicon wx/tools/XRCed/XRCed_32.png XRCed-${SLOT}.png + + distutils-r1_python_install_all + + rm -r ${D}/usr/share +} + +pkg_postinst() { + fdo-mime_desktop_database_update + + create_symlinks() { + alternatives_auto_makesym "$(python_get_sitedir)/wx.pth" "$(python_get_sitedir)/wx.pth-[0-9].[0-9]" + alternatives_auto_makesym "$(python_get_sitedir)/wxversion.py" "$(python_get_sitedir)/wxversion.py-[0-9].[0-9]" + } + python_foreach_impl create_symlinks + + echo + elog "Gentoo uses the Multi-version method for SLOT'ing." + elog "Developers, see this site for instructions on using" + elog "it with your apps:" + elog "http://wiki.wxpython.org/MultiVersionInstalls" +} + +pkg_postrm() { + fdo-mime_desktop_database_update + + update_symlinks() { + alternatives_auto_makesym "$(python_get_sitedir)/wx.pth" "$(python_get_sitedir)/wx.pth-[0-9].[0-9]" + alternatives_auto_makesym "$(python_get_sitedir)/wxversion.py" "$(python_get_sitedir)/wxversion.py-[0-9].[0-9]" + } + python_foreach_impl update_symlinks +} diff --git a/media-gfx/displaycal/displaycal-3.8.9.3-r2.ebuild b/media-gfx/displaycal/displaycal-3.8.9.3-r3.ebuild similarity index 86% rename from media-gfx/displaycal/displaycal-3.8.9.3-r2.ebuild rename to media-gfx/displaycal/displaycal-3.8.9.3-r3.ebuild index a5744f4f0..57cf50637 100644 --- a/media-gfx/displaycal/displaycal-3.8.9.3-r2.ebuild +++ b/media-gfx/displaycal/displaycal-3.8.9.3-r3.ebuild @@ -20,21 +20,16 @@ IUSE="" DEPEND=" >=media-gfx/argyllcms-1.1.0 - dev-python/wxpython:3.0[${PYTHON_USEDEP}] + dev-python/wxpython2:3.0[${PYTHON_USEDEP}] >=x11-libs/libX11-1.3.3 >=x11-apps/xrandr-1.3.2 >=x11-libs/libXxf86vm-1.1.0 >=x11-libs/libXinerama-1.1 " RDEPEND="${DEPEND} - dev-python/faulthandler[${PYTHON_USEDEP}] - || ( - dev-python/numpy-python2[${PYTHON_USEDEP}] - >=dev-python/numpy-1.2.1[${PYTHON_USEDEP}] - ) - || ( - dev-python/dbus-python2[${PYTHON_USEDEP}] - ) + dev-python/faulthandler-python2[${PYTHON_USEDEP}] + dev-python/numpy-python2[${PYTHON_USEDEP}] + dev-python/dbus-python2[${PYTHON_USEDEP}] " # Just in case someone renames the ebuild diff --git a/profiles/default/package.use/python b/profiles/default/package.use/python index 32b819322..4b2262fed 100644 --- a/profiles/default/package.use/python +++ b/profiles/default/package.use/python @@ -12,6 +12,8 @@ dev-python/dbus-python -python_targets_python2_7 dev-python/dbus-python -python_targets_python2_7 dev-python/defcon -python_targets_python2_7 dev-python/elasticsearch-py -python_targets_python2_7 +dev-python/faulthandler-python2 python_targets_python2_7 +dev-python/faulthandler -python_targets_python2_7 dev-python/flask-migrate -python_targets_python2_7 dev-python/flask-restful -python_targets_python2_7 dev-python/flask-sphinx-themes -python_targets_python2_7 @@ -25,6 +27,8 @@ dev-python/nbsphinx -python_targets_python2_7 dev-python/numpydoc -python_targets_python2_7 dev-python/pexpect-python2 python_targets_python2_7 dev-python/pexpect -python_targets_python2_7 +dev-python/ply-python2 python_targets_python2_7 +dev-python/ply -python_targets_python2_7 dev-python/pockets -python_targets_python2_7 dev-python/ptyprocess-python2 python_targets_python2_7 dev-python/ptyprocess -python_targets_python2_7 @@ -32,8 +36,14 @@ dev-python/pyasn1-modules-python2 python_targets_python2_7 dev-python/pyasn1-modules -python_targets_python2_7 dev-python/pyasn1-python2 python_targets_python2_7 dev-python/pyasn1 -python_targets_python2_7 +dev-python/pycairo-python2 python_targets_python2_7 +dev-python/pycairo -python_targets_python2_7 +dev-python/pycparser-python2 python_targets_python2_7 +dev-python/pycparser -python_targets_python2_7 dev-python/pygame_sdl2 -python_targets_python2_7 dev-python/pygobject -python_targets_python2_7 +dev-python/pyopengl-python2 python_targets_python2_7 +dev-python/pyopengl -python_targets_python2_7 dev-python/pyopenssl-python2 python_targets_python2_7 dev-python/pyopenssl -python_targets_python2_7 dev-python/pytest-shutil -python_targets_python2_7 @@ -64,6 +74,8 @@ dev-python/sphinx python_targets_python2_7 dev-python/sphinx-testing -python_targets_python2_7 dev-python/stestr -python_targets_python2_7 dev-python/urllib3 -python_targets_python2_7 +dev-python/wxpython2 python_targets_python2_7 +dev-python/wxpython -python_targets_python2_7 mail-client/claws-mail -python_single_target_python2_7 media-gfx/gimp -python -python_single_target_python2_7 net-mail/notmuch -python_targets_python2_7