Source code for kw.platform.monkey

"""
Monkey Patching
===============
"""

import importlib
import threading


# Define modules and which of them should be patched automatically.
_PATCH_MODULES = {"requests": False, "aiohttp": False}
_PATCHED_MODULES = set()


def _import_module(module_name):
    path = "kw.platform." + module_name
    return importlib.import_module(path)


def _patch_module(module_name):
    with threading.Lock():
        if module_name in _PATCHED_MODULES:
            return False

        module = _import_module(module_name)
        module.patch()

        _PATCHED_MODULES.add(module_name)
        return True


[docs]def patch(**patch_modules): """Patch specified modules. Patches all modules that have been provided as keyword arguments. :param patch_modules: keyword arguments of modules that should be patched. Use format ``module=True``. Possible options are: * requests Usage:: from kw.platform import patch patch(requests=True) """ modules = [m for m, should_patch in patch_modules.items() if should_patch] for module_name in modules: if module_name in _PATCH_MODULES.keys(): _patch_module(module_name)