Add version to github action (and rewrite the whole thing while at it) (#1940)

Commit history before merge:

* Add black_version to github action
* Merge upstream/main into this branch
* Add version support for the Black action pt.2

  Since we're moving to a composite based action, quite a few changes
  were made. 1) Support was added for all OSes (Windows was painful). 
  2) Isolation from the rest of the workflow had to be done manually
  with a virtual environment.

  Other noteworthy changes:

  - Rewrote basically all of the logic and put it in a Python script
    for easy testing (not doing it here tho cause I'm lazy and I can't
    think of a reasonable way of testing it).
  - Renamed `black_version` to `version` to better fit the existing
    input naming scheme.
  - Added support for log groups, this makes our action's output a
    bit more fancy (I may or may have not added some debug output too).

* Add more to and sorta rewrite the Action's docs

  Reflect compatability and gotchas.

* Add CHANGELOG entry
* Merge main into this branch
* Remove debug; address typos; clean up action.yml

Co-authored-by: Richard Si <63936253+ichard26@users.noreply.github.com>
This commit is contained in:
Stefan Foulis 2021-06-01 03:45:50 +02:00 committed by GitHub
parent a4e35b3149
commit 4005246f86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 103 additions and 28 deletions

View File

@ -25,7 +25,12 @@
- Add a lower bound for the `aiohttp-cors` dependency. Only 0.4.0 or higher is - Add a lower bound for the `aiohttp-cors` dependency. Only 0.4.0 or higher is
supported. (#2231) supported. (#2231)
### _Packaging_ ### Integrations
- The official Black action now supports choosing what version to use, and supports the
major 3 OSes. (#1940)
### Packaging
- Release self-contained x86_64 MacOS binaries as part of the GitHub release pipeline - Release self-contained x86_64 MacOS binaries as part of the GitHub release pipeline
(#2198) (#2198)

View File

@ -4,21 +4,56 @@ author: "Łukasz Langa and contributors to Black"
inputs: inputs:
options: options:
description: description:
"Options passed to black. Use `black --help` to see available options. Default: "Options passed to Black. Use `black --help` to see available options. Default:
'--check'" '--check'"
required: false required: false
default: "--check --diff" default: "--check --diff"
src: src:
description: "Source to run black. Default: '.'" description: "Source to run Black. Default: '.'"
required: false required: false
default: "." default: "."
black_args: black_args:
description: "[DEPRECATED] Black input arguments." description: "[DEPRECATED] Black input arguments."
required: false required: false
default: "" default: ""
deprecationMessage:
"Input `with.black_args` is deprecated. Use `with.options` and `with.src` instead."
version:
description: 'Python Version specifier (PEP440) - e.g. "21.5b1"'
required: false
default: ""
branding: branding:
color: "black" color: "black"
icon: "check-circle" icon: "check-circle"
runs: runs:
using: "docker" using: composite
image: "action/Dockerfile" steps:
- run: |
# Exists since using github.action_path + path to main script doesn't work because bash
# interprets the backslashes in github.action_path (which are used when the runner OS
# is Windows) destroying the path to the target file.
#
# Also semicolons are necessary because I can't get the newlines to work
entrypoint="import sys;
import subprocess;
from pathlib import Path;
MAIN_SCRIPT = Path(r'${{ github.action_path }}') / 'action' / 'main.py';
proc = subprocess.run([sys.executable, str(MAIN_SCRIPT)]);
sys.exit(proc.returncode)
"
if [ "$RUNNER_OS" == "Windows" ]; then
echo $entrypoint | python
else
echo $entrypoint | python3
fi
env:
# TODO: Remove once https://github.com/actions/runner/issues/665 is fixed.
INPUT_OPTIONS: ${{ inputs.options }}
INPUT_SRC: ${{ inputs.src }}
INPUT_BLACK_ARGS: ${{ inputs.black_args }}
INPUT_VERSION: ${{ inputs.version }}
pythonioencoding: utf-8
shell: bash

View File

@ -1,10 +0,0 @@
FROM python:3
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade --no-cache-dir black
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

View File

@ -1,9 +0,0 @@
#!/bin/bash -e
if [ -n "$INPUT_BLACK_ARGS" ]; then
echo '::warning::Input `with.black_args` is deprecated. Use `with.options` and `with.src` instead.'
black $INPUT_BLACK_ARGS
exit $?
fi
black $INPUT_OPTIONS $INPUT_SRC

39
action/main.py Normal file
View File

@ -0,0 +1,39 @@
import os
import shlex
import sys
from pathlib import Path
from subprocess import run, PIPE, STDOUT
ACTION_PATH = Path(os.environ["GITHUB_ACTION_PATH"])
ENV_PATH = ACTION_PATH / ".black-env"
ENV_BIN = ENV_PATH / ("Scripts" if sys.platform == "win32" else "bin")
OPTIONS = os.getenv("INPUT_OPTIONS", default="")
SRC = os.getenv("INPUT_SRC", default="")
BLACK_ARGS = os.getenv("INPUT_BLACK_ARGS", default="")
VERSION = os.getenv("INPUT_VERSION", default="")
run([sys.executable, "-m", "venv", str(ENV_PATH)], check=True)
req = "black[colorama,python2]"
if VERSION:
req += f"=={VERSION}"
pip_proc = run(
[str(ENV_BIN / "python"), "-m", "pip", "install", req],
stdout=PIPE,
stderr=STDOUT,
encoding="utf-8",
)
if pip_proc.returncode:
print(pip_proc.stdout)
print("::error::Failed to install Black.", flush=True)
sys.exit(pip_proc.returncode)
base_cmd = [str(ENV_BIN / "black")]
if BLACK_ARGS:
# TODO: remove after a while since this is deprecated in favour of SRC + OPTIONS.
proc = run([*base_cmd, *shlex.split(BLACK_ARGS)])
else:
proc = run([*base_cmd, *shlex.split(OPTIONS), *shlex.split(SRC)])
sys.exit(proc.returncode)

View File

@ -3,6 +3,14 @@
You can use _Black_ within a GitHub Actions workflow without setting your own Python You can use _Black_ within a GitHub Actions workflow without setting your own Python
environment. Great for enforcing that your code matches the _Black_ code style. environment. Great for enforcing that your code matches the _Black_ code style.
## Compatiblity
This action is known to support all GitHub-hosted runner OSes. In addition, only
published versions of _Black_ are supported (i.e. whatever is available on PyPI).
Finally, this action installs _Black_ with both the `colorama` and `python2` extras so
the `--color` flag and formatting Python 2 code are supported.
## Usage ## Usage
Create a file named `.github/workflows/black.yml` inside your repository with: Create a file named `.github/workflows/black.yml` inside your repository with:
@ -17,19 +25,26 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: psf/black@stable - uses: psf/black@stable
``` ```
We recommend the use of the `@stable` tag, but per version tags also exist if you prefer We recommend the use of the `@stable` tag, but per version tags also exist if you prefer
that. that. Note that the action's version you select is independent of the version of _Black_
the action will use.
You may use `options` (Default is `'--check --diff'`) and `src` (Default is `'.'`) as The version of _Black_ the action will use can be configured via `version`. The action
follows: defaults to the latest release available on PyPI. Only versions available from PyPI are
supported, so no commit SHAs or branch names.
You can also configure the arguments passed to _Black_ via `options` (defaults to
`'--check --diff'`) and `src` (default is `'.'`)
Here's an example configuration:
```yaml ```yaml
- uses: psf/black@stable - uses: psf/black@stable
with: with:
options: "--check --verbose" options: "--check --verbose"
src: "./src" src: "./src"
version: "21.5b1"
``` ```