]>
git.madduck.net Git - etc/vim.git/blobdiff - src/black/__init__.py
madduck's git repository
Every one of the projects in this repository is available at the canonical
URL git://git.madduck.net/madduck/pub/<projectpath> — see
each project's metadata for the exact URL.
All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@ git. madduck. net .
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
SSH access, as well as push access can be individually
arranged .
If you use my repositories frequently, consider adding the following
snippet to ~/.gitconfig and using the third clone URL listed for each
project:
[url "git://git.madduck.net/madduck/"]
insteadOf = madduck:
import asyncio
from json.decoder import JSONDecodeError
import json
import asyncio
from json.decoder import JSONDecodeError
import json
-from concurrent.futures import Executor, ThreadPoolExecutor, ProcessPoolExecutor
from contextlib import contextmanager
from datetime import datetime
from enum import Enum
from contextlib import contextmanager
from datetime import datetime
from enum import Enum
import os
from pathlib import Path
from pathspec.patterns.gitwildmatch import GitWildMatchPatternError
import os
from pathlib import Path
from pathspec.patterns.gitwildmatch import GitWildMatchPatternError
import re
import signal
import sys
import tokenize
import traceback
from typing import (
import re
import signal
import sys
import tokenize
import traceback
from typing import (
from black.concurrency import cancel, shutdown, maybe_install_uvloop
from black.output import dump_to_file, ipynb_diff, diff, color_diff, out, err
from black.report import Report, Changed, NothingChanged
from black.concurrency import cancel, shutdown, maybe_install_uvloop
from black.output import dump_to_file, ipynb_diff, diff, color_diff, out, err
from black.report import Report, Changed, NothingChanged
-from black.files import find_project_root, find_pyproject_toml, parse_pyproject_toml
+from black.files import (
+ find_project_root,
+ find_pyproject_toml,
+ parse_pyproject_toml,
+ find_user_pyproject_toml,
+)
from black.files import gen_python_files, get_gitignore, normalize_path_maybe_ignore
from black.files import wrap_stream_for_windows
from black.parsing import InvalidInput # noqa F401
from black.files import gen_python_files, get_gitignore, normalize_path_maybe_ignore
from black.files import wrap_stream_for_windows
from black.parsing import InvalidInput # noqa F401
from _black_version import version as __version__
from _black_version import version as __version__
+if TYPE_CHECKING:
+ from concurrent.futures import Executor
+
COMPILED = Path(__file__).suffix in (".pyd", ".so")
# types
COMPILED = Path(__file__).suffix in (".pyd", ".so")
# types
"--preview",
is_flag=True,
help=(
"--preview",
is_flag=True,
help=(
- "Enable potentially disruptive style changes that will be added to Black's main"
+ "Enable potentially disruptive style changes that may be added to Black's main"
" functionality in the next major release."
),
)
" functionality in the next major release."
),
)
type=str,
help=(
"Require a specific version of Black to be running (useful for unifying results"
type=str,
help=(
"Require a specific version of Black to be running (useful for unifying results"
- " across many environments e.g. with a pyproject.toml file)."
+ " across many environments e.g. with a pyproject.toml file). It can be"
+ " either a major version number or an exact version."
)
@click.version_option(
version=__version__,
)
@click.version_option(
version=__version__,
- message=f"%(prog)s, %(version)s (compiled: {'yes' if COMPILED else 'no'})",
+ message=(
+ f"%(prog)s, %(version)s (compiled: {'yes' if COMPILED else 'no'})\n"
+ f"Python ({platform.python_implementation()}) {platform.python_version()}"
+ ),
)
@click.argument(
"src",
)
@click.argument(
"src",
help="Read configuration from FILE path.",
)
@click.pass_context
help="Read configuration from FILE path.",
)
@click.pass_context
ctx: click.Context,
code: Optional[str],
line_length: int,
ctx: click.Context,
code: Optional[str],
line_length: int,
if config:
config_source = ctx.get_parameter_source("config")
if config:
config_source = ctx.get_parameter_source("config")
- if config_source in (ParameterSource.DEFAULT, ParameterSource.DEFAULT_MAP):
+ user_level_config = str(find_user_pyproject_toml())
+ if config == user_level_config:
+ out(
+ "Using configuration from user-level config at "
+ f"'{user_level_config}'.",
+ fg="blue",
+ )
+ elif config_source in (
+ ParameterSource.DEFAULT,
+ ParameterSource.DEFAULT_MAP,
+ ):
out("Using configuration from project root.", fg="blue")
else:
out(f"Using configuration in '{config}'.", fg="blue")
error_msg = "Oh no! 💥 💔 💥"
out("Using configuration from project root.", fg="blue")
else:
out(f"Using configuration in '{config}'.", fg="blue")
error_msg = "Oh no! 💥 💔 💥"
- if required_version and required_version != __version__:
+ if (
+ required_version
+ and required_version != __version__
+ and required_version != __version__.split(".")[0]
+ ):
err(
f"{error_msg} The required version `{required_version}` does not match"
f" the running version `{__version__}`!"
err(
f"{error_msg} The required version `{required_version}` does not match"
f" the running version `{__version__}`!"
report.failed(path, str(exc))
report.failed(path, str(exc))
+# diff-shades depends on being to monkeypatch this function to operate. I know it's
+# not ideal, but this shouldn't cause any issues ... hopefully. ~ichard26
+@mypyc_attr(patchable=True)
def reformat_one(
src: Path, fast: bool, write_back: WriteBack, mode: Mode, report: "Report"
) -> None:
def reformat_one(
src: Path, fast: bool, write_back: WriteBack, mode: Mode, report: "Report"
) -> None:
workers: Optional[int],
) -> None:
"""Reformat multiple files using a ProcessPoolExecutor."""
workers: Optional[int],
) -> None:
"""Reformat multiple files using a ProcessPoolExecutor."""
+ from concurrent.futures import Executor, ThreadPoolExecutor, ProcessPoolExecutor
+
executor: Executor
loop = asyncio.get_event_loop()
worker_count = workers if workers is not None else DEFAULT_WORKERS
executor: Executor
loop = asyncio.get_event_loop()
worker_count = workers if workers is not None else DEFAULT_WORKERS
mode: Mode,
report: "Report",
loop: asyncio.AbstractEventLoop,
mode: Mode,
report: "Report",
loop: asyncio.AbstractEventLoop,
) -> None:
"""Run formatting of `sources` in parallel using the provided `executor`.
) -> None:
"""Run formatting of `sources` in parallel using the provided `executor`.
else:
versions = detect_target_versions(src_node, future_imports=future_imports)
else:
versions = detect_target_versions(src_node, future_imports=future_imports)
- normalize_fmt_off(src_node)
+ normalize_fmt_off(src_node, preview=mode.preview )
lines = LineGenerator(mode=mode)
elt = EmptyLineTracker(is_pyi=mode.is_pyi)
empty_line = Line(mode=mode)
lines = LineGenerator(mode=mode)
elt = EmptyLineTracker(is_pyi=mode.is_pyi)
empty_line = Line(mode=mode)
):
features.add(Feature.ANN_ASSIGN_EXTENDED_RHS)
):
features.add(Feature.ANN_ASSIGN_EXTENDED_RHS)
+ elif (
+ n.type == syms.except_clause
+ and len(n.children) >= 2
+ and n.children[1].type == token.STAR
+ ):
+ features.add(Feature.EXCEPT_STAR)
+
-def assert_equivalent(src: str, dst: str, *, pass_num: int = 1 ) -> None:
+def assert_equivalent(src: str, dst: str) -> None:
"""Raise AssertionError if `src` and `dst` aren't equivalent."""
try:
src_ast = parse_ast(src)
except Exception as exc:
raise AssertionError(
"""Raise AssertionError if `src` and `dst` aren't equivalent."""
try:
src_ast = parse_ast(src)
except Exception as exc:
raise AssertionError(
- f "cannot use --safe with this file; failed to parse source file AST: "
+ "cannot use --safe with this file; failed to parse source file AST: "
- f "This could be caused by running Black with an older Python version "
- f "that does not support new syntax used in your source file."
+ "This could be caused by running Black with an older Python version "
+ "that does not support new syntax used in your source file."
except Exception as exc:
log = dump_to_file("".join(traceback.format_tb(exc.__traceback__)), dst)
raise AssertionError(
except Exception as exc:
log = dump_to_file("".join(traceback.format_tb(exc.__traceback__)), dst)
raise AssertionError(
- f"INTERNAL ERROR: Black produced invalid code on pass {pass_num} : {exc}. "
+ f"INTERNAL ERROR: Black produced invalid code: {exc}. "
"Please report a bug on https://github.com/psf/black/issues. "
f"This invalid output might be helpful: {log}"
) from None
"Please report a bug on https://github.com/psf/black/issues. "
f"This invalid output might be helpful: {log}"
) from None
log = dump_to_file(diff(src_ast_str, dst_ast_str, "src", "dst"))
raise AssertionError(
"INTERNAL ERROR: Black produced code that is not equivalent to the"
log = dump_to_file(diff(src_ast_str, dst_ast_str, "src", "dst"))
raise AssertionError(
"INTERNAL ERROR: Black produced code that is not equivalent to the"
- f" source on pass {pass_num} . Please report a bug on "
+ " source . Please report a bug on "
f"https://github.com/psf/black/issues. This diff might be helpful: {log}"
) from None
f"https://github.com/psf/black/issues. This diff might be helpful: {log}"
) from None
file paths is minimal since it's Python source code. Moreover, this crash was
spurious on Python 3.7 thanks to PEP 538 and PEP 540.
"""
file paths is minimal since it's Python source code. Moreover, this crash was
spurious on Python 3.7 thanks to PEP 538 and PEP 540.
"""
+ modules: List[Any] = []
try:
from click import core
try:
from click import core
- from click import _unicodefun
- except ModuleNotFoundError:
- return
+ except ImportError:
+ pass
+ else:
+ modules.append(core)
+ try:
+ # Removed in Click 8.1.0 and newer; we keep this around for users who have
+ # older versions installed.
+ from click import _unicodefun # type: ignore
+ except ImportError:
+ pass
+ else:
+ modules.append(_unicodefun)
- for module in (core, _unicodefun) :
if hasattr(module, "_verify_python3_env"):
module._verify_python3_env = lambda: None # type: ignore
if hasattr(module, "_verify_python_env"):
if hasattr(module, "_verify_python3_env"):
module._verify_python3_env = lambda: None # type: ignore
if hasattr(module, "_verify_python_env"):