Commit e0d5a408 authored by Dom Sekotill's avatar Dom Sekotill
Browse files

prevent attempted imports of excluded packages

In coverage.coverage, don't attempt to import packages who's filenames
match patterns in 'exclude'.
parent 2238d7ce
Loading
Loading
Loading
Loading
+24 −5
Original line number Diff line number Diff line
@@ -26,16 +26,31 @@ A module to produce coverage reports for testing.
"""

from six import string_types
from importlib import import_module
from pkgutil import walk_packages
from itertools import product
from functools import wraps
from fnmatch import fnmatch
import contextlib
import importlib
import itertools
import logging
import pkgutil
import sys


def _import_module(module, exclude):
	if module not in sys.modules:
		loader = pkgutil.get_loader(module)
		if isinstance(exclude, string_types):
			if fnmatch(loader.filename, exclude):
				return
		elif exclude:
			for pattern in exclude:
				if fnmatch(loader.filename, pattern):
					return
		sys.modules[module] = importlib.import_module(module)
	return sys.modules[module]


@contextlib.contextmanager
def coverage(modules, include=None, exclude=None, file=None):
	"""
@@ -56,15 +71,19 @@ def coverage(modules, include=None, exclude=None, file=None):
		return

	old_modules = sys.modules.copy()
	modules = {import_module(m) if isinstance(m, string_types) else m for m in modules}
	modules = {
		_import_module(m, exclude) if isinstance(m, string_types) else m
		for m in modules
	}

	for module in list(modules):
		try:
			walker = walk_packages(module.__path__, module.__name__+'.')
			walker = pkgutil.walk_packages(module.__path__, module.__name__+'.')
		except (AttributeError):
			modules.add(module)
		else:
			modules.update(import_module(n) for l,n,p in walker)
			modules.update(_import_module(n, exclude) for l,n,p in walker)
	modules.discard(None)

	for module in modules:
		del sys.modules[module.__name__]