From f65f5ae675a2522bfedae451d5b54ffd0a619304 Mon Sep 17 00:00:00 2001 From: zlim00 Date: Sun, 30 Dec 2018 10:27:43 +0100 Subject: [PATCH 1/3] Added fix for discover not finding implicit namespace packages --- Lib/unittest/loader.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index ba7105e1ad6039..b288117c5ba80c 100644 --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -285,19 +285,25 @@ def discover(self, start_dir, pattern='test*.py', top_level_dir=None): sys.path.insert(0, top_level_dir) self._top_level_dir = top_level_dir - is_not_importable = False is_namespace = False tests = [] if os.path.isdir(os.path.abspath(start_dir)): - start_dir = os.path.abspath(start_dir) - if start_dir != top_level_dir: - is_not_importable = not os.path.isfile(os.path.join(start_dir, '__init__.py')) + if os.path.abspath(start_dir) != top_level_dir: + try: + __import__(start_dir) + except ImportError: + raise ImportError('Start directory is not importable: %r' % start_dir) + + if not os.path.isfile(os.path.join(os.path.abspath(start_dir), '__init__.py')): + is_namespace = True + + tests = list(self._find_tests(start_dir, pattern, is_namespace)) else: # support for discovery from dotted module names try: __import__(start_dir) except ImportError: - is_not_importable = True + raise ImportError('Start directory is not importable: %r' % start_dir) else: the_module = sys.modules[start_dir] top_part = start_dir.split('.')[0] @@ -341,12 +347,9 @@ def discover(self, start_dir, pattern='test*.py', top_level_dir=None): sys.path.remove(top_level_dir) else: sys.path.remove(top_level_dir) + if not is_namespace: + tests = list(self._find_tests(start_dir, pattern)) - if is_not_importable: - raise ImportError('Start directory is not importable: %r' % start_dir) - - if not is_namespace: - tests = list(self._find_tests(start_dir, pattern)) return self.suiteClass(tests) def _get_directory_containing_module(self, module_name): From 82c4360d3d6d08d89e6890160c29f113c95c9341 Mon Sep 17 00:00:00 2001 From: zlim00 Date: Sun, 30 Dec 2018 11:48:39 +0100 Subject: [PATCH 2/3] Fixed unittest failure --- Lib/unittest/loader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index b288117c5ba80c..5f29e88bb410b1 100644 --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -290,11 +290,11 @@ def discover(self, start_dir, pattern='test*.py', top_level_dir=None): if os.path.isdir(os.path.abspath(start_dir)): if os.path.abspath(start_dir) != top_level_dir: try: - __import__(start_dir) + __import__(os.path.relpath(start_dir, top_level_dir)) except ImportError: raise ImportError('Start directory is not importable: %r' % start_dir) - if not os.path.isfile(os.path.join(os.path.abspath(start_dir), '__init__.py')): + if not os.path.isfile(os.path.join(start_dir, '__init__.py')): is_namespace = True tests = list(self._find_tests(start_dir, pattern, is_namespace)) From 715a5d34396c5604a87c2e315db822afa2d22f22 Mon Sep 17 00:00:00 2001 From: zlim00 Date: Sun, 30 Dec 2018 12:22:03 +0100 Subject: [PATCH 3/3] Changed path to dot before import --- Lib/unittest/loader.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py index 5f29e88bb410b1..8a0575b136ef03 100644 --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -290,7 +290,11 @@ def discover(self, start_dir, pattern='test*.py', top_level_dir=None): if os.path.isdir(os.path.abspath(start_dir)): if os.path.abspath(start_dir) != top_level_dir: try: - __import__(os.path.relpath(start_dir, top_level_dir)) + # Convert to dot import + dot_import = '.'.join( + os.path.relpath(start_dir, top_level_dir).split(os.sep) + ) + __import__(dot_import) except ImportError: raise ImportError('Start directory is not importable: %r' % start_dir)