Skip to content

Commit

Permalink
Add optional uvloop import (#2258)
Browse files Browse the repository at this point in the history
* Add optional uvloop import

- If we find `uvloop` in the env for black, blackd or black-primer lets try and use it
- Add a uvloop extra install

Fixes #2257

Test:
- Add ci job to install black[uvloop] and run a primer run with uvloop
  - Only with latest python (3.9)
  - Will be handy to compare runtimes as a very unoffical benchmark

* Remove tox install

* Add to CHANGES/news
  • Loading branch information
cooperlees committed May 26, 2021
1 parent 92f20d7 commit 754eecf
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 0 deletions.
45 changes: 45 additions & 0 deletions .github/workflows/uvloop_test.yml
@@ -0,0 +1,45 @@
name: test uvloop

on:
push:
paths-ignore:
- "docs/**"
- "*.md"

pull_request:
paths-ignore:
- "docs/**"
- "*.md"

jobs:
build:
# We want to run on external PRs, but not on our own internal PRs as they'll be run
# by the push to the branch. Without this if check, checks are duplicated since
# internal PRs match both the push and pull_request events.
if:
github.event_name == 'push' || github.event.pull_request.head.repo.full_name !=
github.repository

runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macOS-latest]

steps:
- uses: actions/checkout@v2

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2

- name: Install latest pip
run: |
python -m pip install --upgrade pip
- name: Test uvloop Extra Install
run: |
python -m pip install -e ".[uvloop]"
- name: Primer uvloop run
run: |
black-primer
1 change: 1 addition & 0 deletions CHANGES.md
Expand Up @@ -9,6 +9,7 @@
- Respect `.gitignore` files in all levels, not only `root/.gitignore` file (apply
`.gitignore` rules like `git` does) (#2225)
- Restored compatibility with Click 8.0 on Python 3.6 when LANG=C used (#2227)
- Add extra uvloop install + import support if in python env (#2258)

### _Blackd_

Expand Down
1 change: 1 addition & 0 deletions setup.py
Expand Up @@ -86,6 +86,7 @@ def get_long_description() -> str:
"d": ["aiohttp>=3.6.0", "aiohttp-cors>=0.4.0"],
"colorama": ["colorama>=0.4.3"],
"python2": ["typed-ast>=1.4.2"],
"uvloop": ["uvloop>=0.15.2"],
},
test_suite="tests.test_black",
classifiers=[
Expand Down
7 changes: 7 additions & 0 deletions src/black/__init__.py
Expand Up @@ -54,6 +54,13 @@

from _black_version import version as __version__

# If our environment has uvloop installed lets use it
try:
import uvloop

uvloop.install()

This comment has been minimized.

Copy link
@skrawcz

skrawcz Jun 3, 2021

Opinion: Black as a library shouldn't assume it isn't already running within a system with an already established eventloop. Calling uvloop.install() wipes out the current event loop settings if there were any set.

Suggestion: check for a running event loop before calling install.
e.g.

try:
    import asyncio
    asyncio.get_running_loop()  # means we don't need to install uvloop
except RuntimeError:
    try:
        import uvloop
        uvloop.install()
    except:
        pass
except ImportError:
pass

# types
FileContent = str
Expand Down
8 changes: 8 additions & 0 deletions src/black_primer/cli.py
Expand Up @@ -13,6 +13,14 @@

from black_primer import lib

# If our environment has uvloop installed lets use it
try:
import uvloop

uvloop.install()
except ImportError:
pass


DEFAULT_CONFIG = Path(__file__).parent / "primer.json"
_timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
Expand Down
8 changes: 8 additions & 0 deletions src/blackd/__init__.py
Expand Up @@ -22,6 +22,14 @@
import black
import click

# If our environment has uvloop installed lets use it
try:
import uvloop

uvloop.install()

This comment has been minimized.

Copy link
@skrawcz

skrawcz Jun 3, 2021

also why is this needed here? You're already importing black which will run this same code snippet.

This comment has been minimized.

Copy link
@cooperlees

cooperlees Jun 3, 2021

Author Collaborator

Well, it shouldn't be and has been fixed. Thanks for hi lighting.

except ImportError:
pass

from _black_version import version as __version__

# This is used internally by tests to shut down the server prematurely
Expand Down

0 comments on commit 754eecf

Please sign in to comment.