From 4727fe25ceda84b47ffdc8e84da52caae5b8795c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 12 Jul 2016 20:04:34 -0400 Subject: Rename to multiproc.py, since it only does one thing. --HG-- rename : coverage/monkey.py => coverage/multiproc.py --- coverage/control.py | 2 +- coverage/monkey.py | 80 --------------------------------------------------- coverage/multiproc.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 81 deletions(-) delete mode 100644 coverage/monkey.py create mode 100644 coverage/multiproc.py (limited to 'coverage') diff --git a/coverage/control.py b/coverage/control.py index 3f9bb47f..e0e2e6f7 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -24,7 +24,7 @@ from coverage.files import ModuleMatcher, abs_file from coverage.html import HtmlReporter from coverage.misc import CoverageException, bool_or_none, join_regex from coverage.misc import file_be_gone, isolate_module -from coverage.monkey import patch_multiprocessing +from coverage.multiproc import patch_multiprocessing from coverage.plugin import FileReporter from coverage.plugin_support import Plugins from coverage.python import PythonFileReporter diff --git a/coverage/monkey.py b/coverage/monkey.py deleted file mode 100644 index d0bdf009..00000000 --- a/coverage/monkey.py +++ /dev/null @@ -1,80 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt - -"""Monkey-patching to make coverage.py work right in some cases.""" - -import multiprocessing -import multiprocessing.process -import sys - -# An attribute that will be set on modules to indicate that they have been -# monkey-patched. -PATCHED_MARKER = "_coverage$patched" - -if sys.version_info >= (3, 4): - klass = multiprocessing.process.BaseProcess -else: - klass = multiprocessing.Process - -original_bootstrap = klass._bootstrap - - -class ProcessWithCoverage(klass): - """A replacement for multiprocess.Process that starts coverage.""" - def _bootstrap(self): - """Wrapper around _bootstrap to start coverage.""" - from coverage import Coverage - cov = Coverage(data_suffix=True) - cov.start() - try: - return original_bootstrap(self) - finally: - cov.stop() - cov.save() - - -class Stowaway(object): - """An object to pickle, so when it is unpickled, it can apply the monkey-patch.""" - def __getstate__(self): - return {} - - def __setstate__(self, state_unused): - patch_multiprocessing() - - -def patch_multiprocessing(): - """Monkey-patch the multiprocessing module. - - This enables coverage measurement of processes started by multiprocessing. - This is wildly experimental! - - """ - if hasattr(multiprocessing, PATCHED_MARKER): - return - - if sys.version_info >= (3, 4): - klass._bootstrap = ProcessWithCoverage._bootstrap - else: - multiprocessing.Process = ProcessWithCoverage - - # When spawning processes rather than forking them, we have no state in the - # new process. We sneak in there with a Stowaway: we stuff one of our own - # objects into the data that gets pickled and sent to the sub-process. When - # the Stowaway is unpickled, it's __setstate__ method is called, which - # re-applies the monkey-patch. - # Windows only spawns, so this is needed to keep Windows working. - try: - from multiprocessing import spawn - original_get_preparation_data = spawn.get_preparation_data - except (ImportError, AttributeError): - pass - else: - def get_preparation_data_with_stowaway(name): - """Get the original preparation data, and also insert our stowaway.""" - d = original_get_preparation_data(name) - d['stowaway'] = Stowaway() - return d - - spawn.get_preparation_data = get_preparation_data_with_stowaway - - setattr(multiprocessing, PATCHED_MARKER, True) diff --git a/coverage/multiproc.py b/coverage/multiproc.py new file mode 100644 index 00000000..d0bdf009 --- /dev/null +++ b/coverage/multiproc.py @@ -0,0 +1,80 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + +"""Monkey-patching to make coverage.py work right in some cases.""" + +import multiprocessing +import multiprocessing.process +import sys + +# An attribute that will be set on modules to indicate that they have been +# monkey-patched. +PATCHED_MARKER = "_coverage$patched" + +if sys.version_info >= (3, 4): + klass = multiprocessing.process.BaseProcess +else: + klass = multiprocessing.Process + +original_bootstrap = klass._bootstrap + + +class ProcessWithCoverage(klass): + """A replacement for multiprocess.Process that starts coverage.""" + def _bootstrap(self): + """Wrapper around _bootstrap to start coverage.""" + from coverage import Coverage + cov = Coverage(data_suffix=True) + cov.start() + try: + return original_bootstrap(self) + finally: + cov.stop() + cov.save() + + +class Stowaway(object): + """An object to pickle, so when it is unpickled, it can apply the monkey-patch.""" + def __getstate__(self): + return {} + + def __setstate__(self, state_unused): + patch_multiprocessing() + + +def patch_multiprocessing(): + """Monkey-patch the multiprocessing module. + + This enables coverage measurement of processes started by multiprocessing. + This is wildly experimental! + + """ + if hasattr(multiprocessing, PATCHED_MARKER): + return + + if sys.version_info >= (3, 4): + klass._bootstrap = ProcessWithCoverage._bootstrap + else: + multiprocessing.Process = ProcessWithCoverage + + # When spawning processes rather than forking them, we have no state in the + # new process. We sneak in there with a Stowaway: we stuff one of our own + # objects into the data that gets pickled and sent to the sub-process. When + # the Stowaway is unpickled, it's __setstate__ method is called, which + # re-applies the monkey-patch. + # Windows only spawns, so this is needed to keep Windows working. + try: + from multiprocessing import spawn + original_get_preparation_data = spawn.get_preparation_data + except (ImportError, AttributeError): + pass + else: + def get_preparation_data_with_stowaway(name): + """Get the original preparation data, and also insert our stowaway.""" + d = original_get_preparation_data(name) + d['stowaway'] = Stowaway() + return d + + spawn.get_preparation_data = get_preparation_data_with_stowaway + + setattr(multiprocessing, PATCHED_MARKER, True) -- cgit v1.2.1