diff options
author | 2018-04-05 19:44:29 +0300 | |
---|---|---|
committer | 2018-04-05 20:45:30 +0300 | |
commit | 6b4c897174a7089836a3a221f38482594c5bc2b2 (patch) | |
tree | bfbd5d4f32c5d1a7ebbe9e72b3b2cee604b88a8f | |
parent | gnome-extra/gnome-builder: add python3.6 compat (diff) | |
download | gentoo-6b4c897174a7089836a3a221f38482594c5bc2b2.tar.gz gentoo-6b4c897174a7089836a3a221f38482594c5bc2b2.tar.bz2 gentoo-6b4c897174a7089836a3a221f38482594c5bc2b2.zip |
gnome-extra/gnome-builder: fix jedi-0.10.x compat for Python autocompletion
gnome-builder-3.24 was compatible with jedi 0.9 or older. Add patches to make
it compatible with 0.10.x instead, which is still available in main tree at least.
It is still incompatible with 0.11+
Package-Manager: Portage-2.3.28, Repoman-2.3.9
4 files changed, 383 insertions, 0 deletions
diff --git a/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-1.patch b/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-1.patch new file mode 100644 index 000000000000..399811bb0eac --- /dev/null +++ b/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-1.patch @@ -0,0 +1,28 @@ +From 294920f6b932992e9da8864ca96ae35fe2402406 Mon Sep 17 00:00:00 2001 +From: Christian Hergert <chergert@redhat.com> +Date: Fri, 30 Jun 2017 21:19:41 -0700 +Subject: [PATCH] jedi: silence xml parser warning + +https://bugzilla.gnome.org/show_bug.cgi?id=784327 +--- + +diff --git a/plugins/jedi/jedi_plugin.py b/plugins/jedi/jedi_plugin.py +index 7be46f2..d257680 100644 +--- a/plugins/jedi/jedi_plugin.py ++++ b/plugins/jedi/jedi_plugin.py +@@ -298,7 +298,11 @@ class DocumentationDB(object): + cursor.execute('UPDATE girfiles SET last_modified=? WHERE file=?', (mtime, filename)) + parser = lxml.etree.XMLParser(recover=True) + tree = lxml.etree.parse(filename, parser=parser) +- namespace = tree.find('core:namespace', namespaces=ns) ++ try: ++ namespace = tree.find('core:namespace', namespaces=ns) ++ except: ++ print("Failed to parse", filename) ++ continue + library_version = namespace.attrib['version'] + for node in namespace.findall('core:class', namespaces=ns): + doc = node.find('core:doc', namespaces=ns) +-- +libgit2 0.26.0 + diff --git a/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-2.patch b/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-2.patch new file mode 100644 index 000000000000..de8397a57a00 --- /dev/null +++ b/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-2.patch @@ -0,0 +1,25 @@ +From 1d7c6fa60faf9e81f2fa0f93898f8e1cc68da6d4 Mon Sep 17 00:00:00 2001 +From: Christian Hergert <chergert@redhat.com> +Date: Thu, 6 Jul 2017 14:32:52 -0700 +Subject: [PATCH] jedi: ignore non-gir files + +The rnc file is now shipped here, so ignore that when going +through the directory contents. +--- + +diff --git a/plugins/jedi/jedi_plugin.py b/plugins/jedi/jedi_plugin.py +index d257680..25ade14 100644 +--- a/plugins/jedi/jedi_plugin.py ++++ b/plugins/jedi/jedi_plugin.py +@@ -280,6 +280,8 @@ class DocumentationDB(object): + # I would use scandir for better performance, but it requires newer Python + for gir_path in GIR_PATH_LIST: + for gir_file in os.listdir(gir_path): ++ if not gir_file.endswith('.gir'): ++ continue + if gir_file in processed_gir_files: + continue + processed_gir_files[gir_file] = None +-- +libgit2 0.26.0 + diff --git a/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-3.patch b/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-3.patch new file mode 100644 index 000000000000..484341ad1155 --- /dev/null +++ b/gnome-extra/gnome-builder/files/3.24.2-jedi-fixes-3.patch @@ -0,0 +1,197 @@ +From 8bf74c787af082102958de7498a9b4f4248788cc Mon Sep 17 00:00:00 2001 +From: Elad Alfassa <elad@fedoraproject.org> +Date: Wed, 9 Aug 2017 17:39:07 +0300 +Subject: [PATCH] jedi: adapt to jedi 0.10.0 + +https://bugzilla.gnome.org/show_bug.cgi?id=778708 +--- + +diff --git a/plugins/jedi/jedi_plugin.py b/plugins/jedi/jedi_plugin.py +index 25ade14..8898b69 100644 +--- a/plugins/jedi/jedi_plugin.py ++++ b/plugins/jedi/jedi_plugin.py +@@ -55,7 +55,6 @@ from gi.repository import GtkSource + from gi.repository import Ide + from gi.types import GObjectMeta + from gi.types import StructMeta +- + _ = Ide.gettext + + gi_importer = DynamicImporter('gi.repository') +@@ -91,22 +90,31 @@ _ICONS = { + try: + import jedi + from jedi.evaluate.compiled import CompiledObject ++ from jedi.evaluate.compiled import get_special_object + from jedi.evaluate.compiled import _create_from_name +- from jedi.evaluate.compiled import builtin ++ from jedi.evaluate.context import Context + from jedi.evaluate.docstrings import _evaluate_for_statement_string + from jedi.evaluate.imports import Importer + + class PatchedJediCompiledObject(CompiledObject): + "A modified version of Jedi CompiledObject to work with GObject Introspection modules" ++ ++ def __init__(self, evaluator, obj, parent_context=None, faked_class=None): ++ # we have to override __init__ to change super(CompiledObject, self) ++ # to Context, in order to prevent an infinite recursion ++ Context.__init__(self, evaluator, parent_context) ++ self.obj = obj ++ self.tree_node = faked_class ++ + def _cls(self): + if self.obj.__class__ == IntrospectionModule: + return self + else: +- return super()._cls() ++ return super()._cls(self) + + @property + def py__call__(self): +- def actual(evaluator, params): ++ def actual(params): + # Parse the docstring to find the return type: + ret_type = '' + if '->' in self.obj.__doc__: +@@ -115,18 +123,21 @@ try: + if ret_type.startswith('iter:'): + ret_type = ret_type[len('iter:'):] # we don't care if it's an iterator + +- if ret_type in __builtins__: ++ if hasattr(__builtins__, ret_type): + # The function we're inspecting returns a builtin python type, that's easy +- obj = _create_from_name(builtin, builtin, ret_type) +- return evaluator.execute(obj, params) ++ # (see test/test_evaluate/test_compiled.py in the jedi source code for usage) ++ builtins = get_special_object(self.evaluator, 'BUILTINS') ++ builtin_obj = builtins.py__getattribute__(ret_type) ++ obj = _create_from_name(self.evaluator, builtins, builtin_obj, "") ++ return self.evaluator.execute(obj, params) + else: + # The function we're inspecting returns a GObject type +- parent = self.parent.obj.__name__ ++ parent = self.parent_context.obj.__name__ + if parent.startswith('gi.repository'): + parent = parent[len('gi.repository.'):] + else: + # a module with overrides, such as Gtk, behaves differently +- parent_module = self.parent.obj.__module__ ++ parent_module = self.parent_context.obj.__module__ + if parent_module.startswith('gi.overrides'): + parent_module = parent_module[len('gi.overrides.'):] + parent = '%s.%s' % (parent_module, parent) +@@ -138,22 +149,28 @@ try: + # A pygobject type in a different module + return_type_parent = ret_type.split('.', 1)[0] + ret_type = 'from gi.repository import %s\n%s' % (return_type_parent, ret_type) +- result = _evaluate_for_statement_string(evaluator, ret_type, self.parent) +- return result ++ result = _evaluate_for_statement_string(self.parent_context, ret_type) ++ return set(result) + if type(self.obj) == FunctionInfo: + return actual + return super().py__call__ + ++ # we need to override CompiledBoundMethod without changing it much, ++ # just so it'll not get confused due to our overriden CompiledObject ++ class PatchedCompiledBoundMethod(PatchedJediCompiledObject): ++ def __init__(self, func): ++ super().__init__(func.evaluator, func.obj, func.parent_context, func.tree_node) ++ + class PatchedJediImporter(Importer): + "A modified version of Jedi Importer to work with GObject Introspection modules" + def follow(self): + module_list = super().follow() +- if module_list == []: ++ if not module_list: + import_path = '.'.join([str(i) for i in self.import_path]) + if import_path.startswith('gi.repository'): + try: + module = gi_importer.load_module(import_path) +- module_list = [PatchedJediCompiledObject(module)] ++ module_list = [PatchedJediCompiledObject(self._evaluator, module)] + except ImportError: + pass + return module_list +@@ -169,9 +186,9 @@ try: + return original_jedi_get_module('gi._gobject') + + jedi.evaluate.compiled.fake.get_module = patched_jedi_get_module +- +- jedi.evaluate.imports.Importer = PatchedJediImporter + jedi.evaluate.compiled.CompiledObject = PatchedJediCompiledObject ++ jedi.evaluate.instance.CompiledBoundMethod = PatchedCompiledBoundMethod ++ jedi.evaluate.imports.Importer = PatchedJediImporter + HAS_JEDI = True + except ImportError: + print("jedi not found, python auto-completion not possible.") +@@ -331,7 +348,6 @@ def update_doc_db_on_startup(): + + update_doc_db_on_startup() + +- + class JediCompletionProvider(Ide.Object, GtkSource.CompletionProvider, Ide.CompletionProvider): + context = None + current_word = None +@@ -600,6 +616,15 @@ class JediCompletionRequest: + script = jedi.Script(self.content, self.line + 1, self.column, self.filename) + + db = DocumentationDB() ++ ++ def get_gi_obj(info): ++ """ Get a GObject Introspection object from a jedi Completion, or None if the completion is not GObject Introspection related """ ++ if (type(info._module) == PatchedJediCompiledObject and ++ info._module.obj.__class__ == IntrospectionModule): ++ return next(info._name.infer()).obj ++ else: ++ return None ++ + for info in script.completions(): + if self.cancelled: + return +@@ -608,10 +633,9 @@ class JediCompletionRequest: + + # we have to use custom names here because .type and .params can't + # be overridden (they are properties) +- if type(info._definition) == PatchedJediCompiledObject and \ +- type(info._definition.obj) == FunctionInfo: ++ obj = get_gi_obj(info) ++ if type(obj) == FunctionInfo: + info.real_type = 'function' +- obj = info._definition.obj + params = [arg_info.get_name() for arg_info in obj.get_arguments()] + else: + info.real_type = info.type +@@ -626,8 +650,8 @@ class JediCompletionRequest: + params.append(param.name) + + doc = info.docstring() +- if hasattr(info._definition, 'obj'): +- obj = info._definition.obj ++ if obj is not None: ++ # get documentation for this GObject Introspection object + symbol = None + namespace = None + +@@ -640,17 +664,7 @@ class JediCompletionRequest: + namespace = obj.get_namespace() + + if symbol is not None: +- # we need to walk down the path to find the module so we can get the version +- parent = info._definition.parent +- found = False +- while not found: +- new_parent = parent.parent +- if new_parent is None: +- found = True +- else: +- parent = new_parent +- version = parent.obj._version +- result = db.query(symbol, version) ++ result = db.query(symbol, info._module.obj._version) + if result is not None: + doc = result + +-- +libgit2 0.26.0 + diff --git a/gnome-extra/gnome-builder/gnome-builder-3.24.2-r1.ebuild b/gnome-extra/gnome-builder/gnome-builder-3.24.2-r1.ebuild new file mode 100644 index 000000000000..1daef3f26567 --- /dev/null +++ b/gnome-extra/gnome-builder/gnome-builder-3.24.2-r1.ebuild @@ -0,0 +1,133 @@ +# Copyright 1999-2018 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 +PYTHON_COMPAT=( python3_{4,5,6} ) +VALA_MIN_API_VERSION="0.30" +VALA_USE_DEPEND="vapigen" +DISABLE_AUTOFORMATTING=1 +FORCE_PRINT_ELOG=1 + +inherit gnome2 python-single-r1 vala virtualx readme.gentoo-r1 + +DESCRIPTION="Builder attempts to be an IDE for writing software for GNOME" +HOMEPAGE="https://wiki.gnome.org/Apps/Builder" + +# FIXME: Review licenses at some point +LICENSE="GPL-3+ GPL-2+ LGPL-3+ LGPL-2+ MIT CC-BY-SA-3.0 CC0-1.0" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="clang +git sysprof vala webkit" +REQUIRED_USE="${PYTHON_REQUIRED_USE}" + +# When bumping, pay attention to all the included plugins/*/configure.ac files and the requirements within. +# Most have no extra requirements and default to enabled; we need to handle the ones with extra requirements, which tend to default to auto(magic). +# Look at the last (fourth) argument given to AC_ARG_ENABLE to decide. We don't support any disabling of those that are default-enabled and have no extra deps beyond C/python/introspection. +# FIXME: >=dev-util/devhelp-3.20.0 dependency is automagic for devhelp integration plugin +# FIXME: vte could be optional via $(use_enable vte terminal-plugin) - but most/all people want this and have vte? +# FIXME: flatpak-plugin needs flatpak.pc >=0.6.9, libgit2[threads] >=libgit2-glib-0.24.0[ssh] libsoup-2.4.pc +# FIXME: --with-sanitizer configure option +# FIXME: Enable rdtscp based high performance counter usage on suitable architectures for EGG_COUNTER? +# Editorconfig needs pcre.h, with vte migrating away, might want it optional? +# Python is always enabled - the core python plugin support checks are automagic and not worth crippling it by not supporting python plugins +# Relatedly introspection is always required to not have broken python using plugins or have to enable/disable them based on it. This is a full IDE, not a place to be really minimal. +# An introspection USE flag of a dep is required if any introspection based language plugin wants to use it. Last full check at 3.22.4 +RDEPEND=" + >=x11-libs/gtk+-3.22.1:3[introspection] + >=dev-libs/glib-2.50.0:2[dbus] + >=x11-libs/gtksourceview-3.22.0:3.0[introspection] + >=dev-libs/gobject-introspection-1.48.0:= + >=dev-python/pygobject-3.22.0:3 + >=dev-libs/libxml2-2.9.0 + >=x11-libs/pango-1.38.0 + >=dev-libs/libpeas-1.18.0[python,${PYTHON_USEDEP}] + >=dev-libs/json-glib-1.2.0 + >=app-text/gspell-1.2.0 + >=app-text/enchant-1.6.0 + webkit? ( >=net-libs/webkit-gtk-2.12.0:4=[introspection] ) + clang? ( sys-devel/clang:= ) + git? ( + dev-libs/libgit2[ssh,threads] + >=dev-libs/libgit2-glib-0.25.0[ssh] ) + >=x11-libs/vte-0.46:2.91 + sysprof? ( >=dev-util/sysprof-3.23.91[gtk] ) + dev-libs/libpcre:3 + ${PYTHON_DEPS} + vala? ( $(vala_depend) ) +" +# desktop-file-utils for desktop-file-validate check in configure for 3.22.4 +DEPEND="${RDEPEND} + dev-libs/appstream-glib + dev-util/desktop-file-utils + >=sys-devel/gettext-0.19.8 + virtual/pkgconfig + !<sys-apps/sandbox-2.10-r3 +" + +# Tests fail if all plugins aren't enabled (webkit, clang, devhelp, perhaps more) +RESTRICT="test" + +DOC_CONTENTS='gnome-builder can use various other dependencies on runtime to provide +extra capabilities beyond these expressed via USE flags. Some of these +that are currently available with packages include: + +* dev-util/ctags with exuberant-ctags selected via "eselect ctags" for + C, C++, Python, JavaScript, CSS, HTML and Ruby autocompletion, semantic + highlighting and symbol resolving support. +* dev-python/jedi-0.10.x and dev-python/lxml for more accurate Python + autocompletion support. +* dev-util/valgrind for integration with valgrind. +* dev-util/meson for integration with the Meson build system. +* dev-util/cargo for integration with the Rust Cargo build system. +' +# FIXME: Package gnome-code-assistance and mention here, or maybe USE flag and default enable because it's rather important +# eslint for additional diagnostics in JavaScript files +# jhbuild support +# rust language server via rls +# autotools stuff for autotools plugin; gtkmm/autoconf-archive for C++ template +# mono/PHPize stuff + +PATCHES=( "${FILESDIR}"/${PV}-jedi-fixes-{1,2,3}.patch ) # jedi-0.10+ compatibility from 3.25.9x; remove 0.10 specific mention from DOC_CONTENTS once compat with 0.11+ + +pkg_setup() { + python-single-r1_pkg_setup +} + +src_prepare() { + use vala && vala_src_prepare + gnome2_src_prepare +} + +src_configure() { + gnome2_src_configure \ + --with-channel=distro \ + --enable-editorconfig \ + --enable-introspection \ + $(use_enable vala vala-pack-plugin) \ + $(use_enable webkit) \ + $(use_enable webkit html-preview-plugin) \ + $(use_enable clang clang-plugin) \ + $(use_enable git git-plugin) \ + $(use_enable sysprof sysprof-plugin) \ + --disable-flatpak-plugin \ + --enable-terminal-plugin \ + --enable-gettext-plugin \ + --disable-static +} + +src_install() { + gnome2_src_install + readme.gentoo_create_doc +} + +pkg_postinst() { + gnome2_pkg_postinst + readme.gentoo_print_elog +} + +src_test() { + # FIXME: this should be handled at eclass level + "${EROOT}${GLIB_COMPILE_SCHEMAS}" --allow-any-name "${S}/data/gsettings" || die + + GSETTINGS_SCHEMA_DIR="${S}/data/gsettings" virtx emake check +} |