summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Shea <dshea@redhat.com>2015-07-08 10:43:10 -0400
committerDavid Shea <dshea@redhat.com>2015-07-08 10:43:10 -0400
commit0e284e5b69b694d9d0be5e57be7033f51caaeabd (patch)
tree71751aa513a4a0cb022254652c1873a890f4a1e7
parent86a2c52cfb2608b3004cee5d98b90e004a12912f (diff)
downloadastroid-0e284e5b69b694d9d0be5e57be7033f51caaeabd.tar.gz
Duplicate calls to gi.require_version.
gobject-introspection uses gi.require_version to choose which version of a library to import from gi.repository, and pygobject now issues a warning if gi.require_version is not used. Find calls to require_version and duplicate them in py2gi.py so that the version data is present in the context of the import.
-rw-r--r--astroid/brain/py2gi.py32
1 files changed, 30 insertions, 2 deletions
diff --git a/astroid/brain/py2gi.py b/astroid/brain/py2gi.py
index 2f8494d..2e62b9a 100644
--- a/astroid/brain/py2gi.py
+++ b/astroid/brain/py2gi.py
@@ -9,7 +9,7 @@ import sys
import re
import warnings
-from astroid import MANAGER, AstroidBuildingException
+from astroid import MANAGER, AstroidBuildingException, nodes
from astroid.builder import AstroidBuilder
@@ -158,6 +158,34 @@ def _import_gi_module(modname):
raise AstroidBuildingException('Failed to import module %r' % modname)
return astng
+def _looks_like_require_version(node):
+ # Return whether this looks like a call to gi.require_version(<name>, <version>)
+ # Only accept function calls with two constant arguments
+ if len(node.args) != 2:
+ return False
-MANAGER.register_failed_import_hook(_import_gi_module)
+ if not all(isinstance(arg, nodes.Const) for arg in node.args):
+ return False
+
+ func = node.func
+ if isinstance(func, nodes.Getattr):
+ if func.attrname != 'require_version':
+ return False
+ if isinstance(func.expr, nodes.Name) and func.expr.name == 'gi':
+ return True
+
+ return False
+
+ if isinstance(func, nodes.Name):
+ return func.name == 'require_version'
+ return False
+
+def _register_require_version(node):
+ # Load the gi.require_version locally
+ import gi
+ gi.require_version(node.args[0].value, node.args[1].value)
+ return node
+
+MANAGER.register_failed_import_hook(_import_gi_module)
+MANAGER.register_transform(nodes.CallFunc, _register_require_version, _looks_like_require_version)