From df1c86cbe7cf0727d81e526e904b0752d7371da0 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Thu, 3 Jun 2021 10:13:55 -0700 Subject: [PATCH 1/1] don't uvloop.install on import (#2303) --- CHANGES.md | 1 + src/black/__init__.py | 11 ++--------- src/black/concurrency.py | 15 +++++++++++++++ src/blackd/__init__.py | 10 ++-------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3427fe8..e4fa25c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Correct max string length calculation when there are string operators (#2292) - Fixed option usage when using the `--code` flag (#2259) +- Do not call `uvloop.install()` when _Black_ is used as a library (#2303) ## 21.5b2 diff --git a/src/black/__init__.py b/src/black/__init__.py index 1d0ad7d..d95e9b1 100644 --- a/src/black/__init__.py +++ b/src/black/__init__.py @@ -38,7 +38,7 @@ from black.comments import normalize_fmt_off from black.mode import Mode, TargetVersion from black.mode import Feature, supports_feature, VERSION_TO_FEATURES from black.cache import read_cache, write_cache, get_cache_info, filter_cached, Cache -from black.concurrency import cancel, shutdown +from black.concurrency import cancel, shutdown, maybe_install_uvloop from black.output import dump_to_file, diff, color_diff, out, err from black.report import Report, Changed from black.files import find_project_root, find_pyproject_toml, parse_pyproject_toml @@ -54,14 +54,6 @@ from blib2to3.pgen2 import token from _black_version import version as __version__ -# If our environment has uvloop installed lets use it -try: - import uvloop - - uvloop.install() -except ImportError: - pass - # types FileContent = str Encoding = str @@ -1112,6 +1104,7 @@ def patch_click() -> None: def patched_main() -> None: + maybe_install_uvloop() freeze_support() patch_click() main() diff --git a/src/black/concurrency.py b/src/black/concurrency.py index 119a9a7..69d79f5 100644 --- a/src/black/concurrency.py +++ b/src/black/concurrency.py @@ -6,6 +6,21 @@ from typing import Any, Iterable from black.output import err +def maybe_install_uvloop() -> None: + """If our environment has uvloop installed we use it. + + This is called only from command-line entry points to avoid + interfering with the parent process if Black is used as a library. + + """ + try: + import uvloop + + uvloop.install() + except ImportError: + pass + + def cancel(tasks: Iterable["asyncio.Task[Any]"]) -> None: """asyncio signal handler that cancels all `tasks` and reports to stderr.""" err("Aborted!") diff --git a/src/blackd/__init__.py b/src/blackd/__init__.py index 10b6168..3e2a7e7 100644 --- a/src/blackd/__init__.py +++ b/src/blackd/__init__.py @@ -20,16 +20,9 @@ except ImportError as ie: sys.exit(-1) import black +from black.concurrency import maybe_install_uvloop import click -# If our environment has uvloop installed lets use it -try: - import uvloop - - uvloop.install() -except ImportError: - pass - from _black_version import version as __version__ # This is used internally by tests to shut down the server prematurely @@ -210,6 +203,7 @@ def parse_python_variant_header(value: str) -> Tuple[bool, Set[black.TargetVersi def patched_main() -> None: + maybe_install_uvloop() freeze_support() black.patch_click() main() -- 2.39.5