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:

`