From eb9c18b1bc6d7b870d05f92355f9c7b8218254a0 Mon Sep 17 00:00:00 2001 From: Daniel Pizetta Date: Mon, 4 Sep 2017 16:14:30 -0300 Subject: [PATCH 1/5] Fix #4019: exception treatment for NoneType group attibute. --- sphinx/ext/inheritance_diagram.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index f5b0228a5..f7cf34111 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -80,14 +80,18 @@ def try_import(objname): __import__(objname) return sys.modules.get(objname) # type: ignore except ImportError: - modname, attrname = module_sig_re.match(objname).groups() # type: ignore - if modname is None: - return None try: - __import__(modname) - return getattr(sys.modules.get(modname), attrname, None) - except ImportError: + modname, attrname = module_sig_re.match(objname).groups() # type: ignore + except AttributeError: return None + else: + if modname is None: + return None + try: + __import__(modname) + return getattr(sys.modules.get(modname), attrname, None) + except ImportError: + return None def import_classes(name, currmodule): From 2812706a86c4f78d7c7d5215e804efb46aba1b53 Mon Sep 17 00:00:00 2001 From: Daniel Pizetta Date: Wed, 31 Jan 2018 14:26:52 -0200 Subject: [PATCH 2/5] Including change and author --- AUTHORS | 1 + CHANGES | 1 + 2 files changed, 2 insertions(+) diff --git a/AUTHORS b/AUTHORS index 69c224df0..226900310 100644 --- a/AUTHORS +++ b/AUTHORS @@ -73,6 +73,7 @@ Other contributors, listed alphabetically, are: * Joel Wurtz -- cellspanning support in LaTeX * Hong Xu -- svg support in imgmath extension and various bug fixes * Stephen Finucane -- setup command improvements and documentation +* Daniel Pizetta -- inheritance diagram improvements Many thanks for all contributions! diff --git a/CHANGES b/CHANGES index 32ce56d6b..c31bba21b 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ Features added Bugs fixed ---------- +* #4019: inheritance_diagram AttributeError stoping make process Testing -------- From 1d174a7dcad9e83fcadbf4b5079e01d275960c11 Mon Sep 17 00:00:00 2001 From: Daniel Pizetta Date: Thu, 1 Feb 2018 17:28:45 -0200 Subject: [PATCH 3/5] Reimplement fix for #4019 --- sphinx/ext/inheritance_diagram.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index 00479a73c..8f72a3de7 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -76,18 +76,20 @@ def try_import(objname): __import__(objname) return sys.modules.get(objname) # type: ignore except ImportError: - try: - modname, attrname = module_sig_re.match(objname).groups() # type: ignore - except AttributeError: + matched = module_sig_re.match(objname) # type: ignore + + if not matched: + return None + + modname, attrname = matched.groups() + + if modname is None: + return None + try: + __import__(modname) + return getattr(sys.modules.get(modname), attrname, None) + except ImportError: return None - else: - if modname is None: - return None - try: - __import__(modname) - return getattr(sys.modules.get(modname), attrname, None) - except ImportError: - return None def import_classes(name, currmodule): From d3d4d94970fa237d6b84faa645294316cf2f0a45 Mon Sep 17 00:00:00 2001 From: Daniel Pizetta Date: Thu, 1 Feb 2018 17:29:18 -0200 Subject: [PATCH 4/5] Add test for fix #4019 --- tests/test_ext_inheritance_diagram.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_ext_inheritance_diagram.py b/tests/test_ext_inheritance_diagram.py index deb04ce15..ed79729e6 100644 --- a/tests/test_ext_inheritance_diagram.py +++ b/tests/test_ext_inheritance_diagram.py @@ -83,6 +83,15 @@ def test_import_classes(rootdir): with pytest.raises(InheritanceException): import_classes('unknown.Unknown', None) + # got exception InheritanceException for wrong class or module + # not AttributeError (refs: #4019) + with pytest.raises(InheritanceException): + import_classes('unknown', '.') + with pytest.raises(InheritanceException): + import_classes('unknown.Unknown', '.') + with pytest.raises(InheritanceException): + import_classes('.', None) + # a module having no classes classes = import_classes('sphinx', None) assert classes == [] From aacc9863ccda98a1b2f61eadde4295579b45497e Mon Sep 17 00:00:00 2001 From: Daniel Pizetta Date: Fri, 2 Feb 2018 11:36:48 -0200 Subject: [PATCH 5/5] Catching ValueError when importing for py27 compatibility --- sphinx/ext/inheritance_diagram.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index 8f72a3de7..6f8256662 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -75,7 +75,7 @@ def try_import(objname): try: __import__(objname) return sys.modules.get(objname) # type: ignore - except ImportError: + except (ImportError, ValueError): # ValueError,py27 -> ImportError,py3 matched = module_sig_re.match(objname) # type: ignore if not matched: @@ -88,7 +88,7 @@ def try_import(objname): try: __import__(modname) return getattr(sys.modules.get(modname), attrname, None) - except ImportError: + except (ImportError, ValueError): # ValueError,py27 -> ImportError,py3 return None