diff options
author | Nick Douma <n.douma@nekoconeko.nl> | 2017-04-27 11:44:56 +0200 |
---|---|---|
committer | Nick Douma <n.douma@nekoconeko.nl> | 2017-04-27 13:03:31 +0200 |
commit | b1cb67c743de2581f9393315b23777011c22ecf7 (patch) | |
tree | bf5606e56a5247fd2596a39d5dec85671bc24c14 /setuptools/monkey.py | |
parent | d8e1ed570126dfc99ed7f9126df3bfc890e7005d (diff) | |
download | external_python_setuptools-b1cb67c743de2581f9393315b23777011c22ecf7.tar.gz external_python_setuptools-b1cb67c743de2581f9393315b23777011c22ecf7.tar.bz2 external_python_setuptools-b1cb67c743de2581f9393315b23777011c22ecf7.zip |
Use a different method to lookup base classes on Jython
Jython seems to implement inspect.getmro differently, which causes
any classes with the same name as a class lower in the MRO not to
be returned.
This patch offloads the MRO lookup to a separate function, which
implements different logic for Jython only.
Ref #1024
Diffstat (limited to 'setuptools/monkey.py')
-rw-r--r-- | setuptools/monkey.py | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/setuptools/monkey.py b/setuptools/monkey.py index 68fad9dd..97ba159d 100644 --- a/setuptools/monkey.py +++ b/setuptools/monkey.py @@ -21,6 +21,19 @@ if you think you need this functionality. """ +def get_mro(cls): + """Returns the bases classes for cls sorted by the MRO. + + Works around an issue on Jython where inspect.getmro will not return all + base classes if multiple classes share the same name. Instead, this + function will return a tuple containing the class itself, and the contents + of cls.__bases__ . + """ + if platform.python_implementation() != "Jython": + return inspect.getmro(cls) + return (cls,) + cls.__bases__ + + def get_unpatched(item): lookup = ( get_unpatched_class if isinstance(item, six.class_types) else @@ -38,7 +51,7 @@ def get_unpatched_class(cls): """ external_bases = ( cls - for cls in inspect.getmro(cls) + for cls in get_mro(cls) if not cls.__module__.startswith('setuptools') ) base = next(external_bases) |