GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — black/action/main.py at main · psf/black Expand file tree/ Copy pathmain.pyMore file actions 206 lines (186 loc) · 6.55 KB / Copy pathmain.pyFile metadata and controls206 lines (186 loc) · 6.55 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 import os import re import shlex import shutil import sys import tomllib from pathlib import Path from subprocess import PIPE, STDOUT, run 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="") JUPYTER = os.getenv("INPUT_JUPYTER") == "true" BLACK_ARGS = os.getenv("INPUT_BLACK_ARGS", default="") VERSION = os.getenv("INPUT_VERSION", default="") USE_PYPROJECT = os.getenv("INPUT_USE_PYPROJECT") == "true" OUTPUT_FILE = os.getenv("OUTPUT_FILE", default="") BLACK_VERSION_RE = re.compile( r"^black((?:\s*(?:~=|==|!=|<=|>=|<|>|===)\s*[A-Za-z0-9*+._-]+)" r"(?:\s*,\s*(?:~=|==|!=|<=|>=|<|>|===)\s*[A-Za-z0-9*+._-]+)*)\s*$", re.IGNORECASE, ) EXTRAS_RE = re.compile(r"\[.*\]") EXPORT_SUBST_FAIL_RE = re.compile(r"\$Format:.*\$") def determine_version_specifier() -> str: """Determine the version of Black to install. The version can be specified either via the `with.version` input or via the pyproject.toml file if `with.use_pyproject` is set to `true`. """ if USE_PYPROJECT and VERSION: print( "::error::'with.version' and 'with.use_pyproject' inputs are " "mutually exclusive.", file=sys.stderr, flush=True, ) sys.exit(1) if USE_PYPROJECT: return read_version_specifier_from_pyproject() elif VERSION and VERSION[0] in "0123456789": return f"=={VERSION}" else: return VERSION def read_version_specifier_from_pyproject() -> str: try: with Path("pyproject.toml").open("rb") as fp: pyproject = tomllib.load(fp) except FileNotFoundError: print( "::error::'with.use_pyproject' input requires a pyproject.toml file.", file=sys.stderr, flush=True, ) sys.exit(1) version = pyproject.get("tool", {}).get("black", {}).get("required-version") if version is not None: version = str(version).strip() if not version: return "" # If bare version number or major version is provided, format accordingly: if version[0] in "0123456789": if "." in version: version = f"=={version}" else: version = f"~={version}.0" # Accept only version specifiers, as for the dependency arrays below, so # this can't turn into a direct reference that installs something else. if m := BLACK_VERSION_RE.match(f"black{version}"): return m.group(1).strip() print( "::error::Invalid 'required-version' in pyproject.toml: expected a" " version or version specifier, for example '26.1.0' or '>=26,<27'.", file=sys.stderr, flush=True, ) sys.exit(1) arrays = [ *pyproject.get("dependency-groups", {}).values(), pyproject.get("project", {}).get("dependencies"), *pyproject.get("project", {}).get("optional-dependencies", {}).values(), ] for array in arrays: version = find_black_version_in_array(array) if version is not None: return version print( "::error::'black' dependency missing from pyproject.toml.", file=sys.stderr, flush=True, ) sys.exit(1) def find_black_version_in_array(array: object) -> str | None: if not isinstance(array, list): return None try: for item in array: if not isinstance(item, str): continue # Rudimentary PEP 508 parsing. item = item.split(";")[0] item = EXTRAS_RE.sub("", item).strip() if item == "black": print( "::error::Version specifier missing for 'black' dependency in " "pyproject.toml.", file=sys.stderr, flush=True, ) sys.exit(1) elif m := BLACK_VERSION_RE.match(item): return m.group(1).strip() except TypeError: pass return None run([sys.executable, "-m", "venv", str(ENV_PATH)], cwd=ACTION_PATH, check=True) version_specifier = determine_version_specifier() if JUPYTER: extra_deps = "[colorama,jupyter]" else: extra_deps = "[colorama]" if version_specifier: req = f"black{extra_deps}{version_specifier}" else: describe_name = "" with open(ACTION_PATH / ".git_archival.txt", encoding="utf-8") as fp: for line in fp: if line.startswith("describe-name: "): describe_name = line[len("describe-name: ") :].rstrip() break if not describe_name: print("::error::Failed to detect action version.", file=sys.stderr, flush=True) sys.exit(1) # expected format is one of: # - 23.1.0 # - 23.1.0-51-g448bba7 # - $Format:%(describe:tags=true,match=*[0-9]*)$ (if export-subst fails) if ( describe_name.count("-") < 2 and EXPORT_SUBST_FAIL_RE.match(describe_name) is None ): # the action's commit matches a tag exactly, install exact version from PyPI req = f"black{extra_deps}=={describe_name}" else: # the action's commit does not match any tag, install from the local git repo req = f".{extra_deps}" print(f"Installing {req}...", flush=True) pip_proc = run( [str(ENV_BIN / "python"), "-m", "pip", "install", req], stdout=PIPE, stderr=STDOUT, encoding="utf-8", cwd=ACTION_PATH, ) if pip_proc.returncode: print(pip_proc.stdout) print("::error::Failed to install Black.", file=sys.stderr, 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)], stdout=PIPE, stderr=STDOUT, encoding="utf-8", ) else: proc = run( [*base_cmd, *shlex.split(OPTIONS), *shlex.split(SRC)], stdout=PIPE, stderr=STDOUT, encoding="utf-8", ) shutil.rmtree(ENV_PATH, ignore_errors=True) # Write output to file if specified if OUTPUT_FILE: try: with open(OUTPUT_FILE, "w", encoding="utf-8") as f: f.write(proc.stdout) print(f"Black output written to {OUTPUT_FILE}") except Exception as e: print(f"::error::Failed to write output to {OUTPUT_FILE}: {e}", file=sys.stderr) sys.exit(1) print(proc.stdout) sys.exit(proc.returncode) |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |