GitHub Action: Allow reading version from pyproject.toml (#4294) · psf/black@3383f53 (original) (raw)
1
1
`import os
`
``
2
`+
import re
`
2
3
`import shlex
`
3
4
`import shutil
`
4
5
`import sys
`
5
6
`from pathlib import Path
`
6
7
`from subprocess import PIPE, STDOUT, run
`
``
8
`+
from typing import Union
`
7
9
``
8
10
`ACTION_PATH = Path(os.environ["GITHUB_ACTION_PATH"])
`
9
11
`ENV_PATH = ACTION_PATH / ".black-env"
`
`@@ -13,12 +15,107 @@
`
13
15
`JUPYTER = os.getenv("INPUT_JUPYTER") == "true"
`
14
16
`BLACK_ARGS = os.getenv("INPUT_BLACK_ARGS", default="")
`
15
17
`VERSION = os.getenv("INPUT_VERSION", default="")
`
``
18
`+
USE_PYPROJECT = os.getenv("INPUT_USE_PYPROJECT") == "true"
`
``
19
+
``
20
`+
BLACK_VERSION_RE = re.compile(r"^black([^A-Z0-9._-]+.*)$", re.IGNORECASE)
`
``
21
`+
EXTRAS_RE = re.compile(r"[.*]")
`
``
22
+
``
23
+
``
24
`+
def determine_version_specifier() -> str:
`
``
25
`+
"""Determine the version of Black to install.
`
``
26
+
``
27
`` +
The version can be specified either via the with.version
input or via the
``
``
28
`` +
pyproject.toml file if with.use_pyproject
is set to true
.
``
``
29
`+
"""
`
``
30
`+
if USE_PYPROJECT and VERSION:
`
``
31
`+
print(
`
``
32
`+
"::error::'with.version' and 'with.use_pyproject' inputs are "
`
``
33
`+
"mutually exclusive.",
`
``
34
`+
file=sys.stderr,
`
``
35
`+
flush=True,
`
``
36
`+
)
`
``
37
`+
sys.exit(1)
`
``
38
`+
if USE_PYPROJECT:
`
``
39
`+
return read_version_specifier_from_pyproject()
`
``
40
`+
elif VERSION and VERSION[0] in "0123456789":
`
``
41
`+
return f"=={VERSION}"
`
``
42
`+
else:
`
``
43
`+
return VERSION
`
``
44
+
``
45
+
``
46
`+
def read_version_specifier_from_pyproject() -> str:
`
``
47
`+
if sys.version_info < (3, 11):
`
``
48
`+
print(
`
``
49
`+
"::error::'with.use_pyproject' input requires Python 3.11 or later.",
`
``
50
`+
file=sys.stderr,
`
``
51
`+
flush=True,
`
``
52
`+
)
`
``
53
`+
sys.exit(1)
`
``
54
+
``
55
`+
import tomllib # type: ignore[import-not-found,unreachable]
`
``
56
+
``
57
`+
try:
`
``
58
`+
with Path("pyproject.toml").open("rb") as fp:
`
``
59
`+
pyproject = tomllib.load(fp)
`
``
60
`+
except FileNotFoundError:
`
``
61
`+
print(
`
``
62
`+
"::error::'with.use_pyproject' input requires a pyproject.toml file.",
`
``
63
`+
file=sys.stderr,
`
``
64
`+
flush=True,
`
``
65
`+
)
`
``
66
`+
sys.exit(1)
`
``
67
+
``
68
`+
version = pyproject.get("tool", {}).get("black", {}).get("required-version")
`
``
69
`+
if version is not None:
`
``
70
`+
return f"=={version}"
`
``
71
+
``
72
`+
arrays = [
`
``
73
`+
pyproject.get("project", {}).get("dependencies"),
`
``
74
`+
*pyproject.get("project", {}).get("optional-dependencies", {}).values(),
`
``
75
`+
]
`
``
76
`+
for array in arrays:
`
``
77
`+
version = find_black_version_in_array(array)
`
``
78
`+
if version is not None:
`
``
79
`+
break
`
``
80
+
``
81
`+
if version is None:
`
``
82
`+
print(
`
``
83
`+
"::error::'black' dependency missing from pyproject.toml.",
`
``
84
`+
file=sys.stderr,
`
``
85
`+
flush=True,
`
``
86
`+
)
`
``
87
`+
sys.exit(1)
`
``
88
+
``
89
`+
return version
`
``
90
+
``
91
+
``
92
`+
def find_black_version_in_array(array: object) -> Union[str, None]:
`
``
93
`+
if not isinstance(array, list):
`
``
94
`+
return None
`
``
95
`+
try:
`
``
96
`+
for item in array:
`
``
97
`+
Rudimentary PEP 508 parsing.
`
``
98
`+
item = item.split(";")[0]
`
``
99
`+
item = EXTRAS_RE.sub("", item).strip()
`
``
100
`+
if item == "black":
`
``
101
`+
print(
`
``
102
`+
"::error::Version specifier missing for 'black' dependency in "
`
``
103
`+
"pyproject.toml.",
`
``
104
`+
file=sys.stderr,
`
``
105
`+
flush=True,
`
``
106
`+
)
`
``
107
`+
sys.exit(1)
`
``
108
`+
elif m := BLACK_VERSION_RE.match(item):
`
``
109
`+
return m.group(1).strip()
`
``
110
`+
except TypeError:
`
``
111
`+
pass
`
``
112
+
``
113
`+
return None
`
``
114
+
16
115
``
17
116
`run([sys.executable, "-m", "venv", str(ENV_PATH)], check=True)
`
18
117
``
19
``
`-
version_specifier = VERSION
`
20
``
`-
if VERSION and VERSION[0] in "0123456789":
`
21
``
`-
version_specifier = f"=={VERSION}"
`
``
118
`+
version_specifier = determine_version_specifier()
`
22
119
`if JUPYTER:
`
23
120
`extra_deps = "[colorama,jupyter]"
`
24
121
`else:
`