Make SRC or code mandatory and mutually exclusive (#2360) (#2804)

Closes #2360: I'd like to make passing SRC or `--code` mandatory and the arguments mutually exclusive. This will change our (partially already broken) promises of CLI behavior, but I'll comment below.
This commit is contained in:
Felix Hildén 2022-01-24 17:35:56 +02:00 committed by GitHub
parent 3905173cb3
commit 73cb6e7734
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 9 deletions

View File

@ -38,6 +38,7 @@
`--preview` (#2789) `--preview` (#2789)
- Enable Python 3.10+ by default, without any extra need to specify - Enable Python 3.10+ by default, without any extra need to specify
`--target-version=py310`. (#2758) `--target-version=py310`. (#2758)
- Make passing `SRC` or `--code` mandatory and mutually exclusive (#2804)
### Packaging ### Packaging

View File

@ -4,11 +4,11 @@ Foundational knowledge on using and configuring Black.
_Black_ is a well-behaved Unix-style command-line tool: _Black_ is a well-behaved Unix-style command-line tool:
- it does nothing if no sources are passed to it; - it does nothing if it finds no sources to format;
- it will read from standard input and write to standard output if `-` is used as the - it will read from standard input and write to standard output if `-` is used as the
filename; filename;
- it only outputs messages to users on standard error; - it only outputs messages to users on standard error;
- exits with code 0 unless an internal error occurred (or `--check` was used). - exits with code 0 unless an internal error occurred or a CLI option prompted it.
## Usage ## Usage

View File

@ -431,6 +431,17 @@ def main(
) -> None: ) -> None:
"""The uncompromising code formatter.""" """The uncompromising code formatter."""
ctx.ensure_object(dict) ctx.ensure_object(dict)
if src and code is not None:
out(
main.get_usage(ctx)
+ "\n\n'SRC' and 'code' cannot be passed simultaneously."
)
ctx.exit(1)
if not src and code is None:
out(main.get_usage(ctx) + "\n\nOne of 'SRC' or 'code' is required.")
ctx.exit(1)
root, method = find_project_root(src) if code is None else (None, None) root, method = find_project_root(src) if code is None else (None, None)
ctx.obj["root"] = root ctx.obj["root"] = root
@ -569,7 +580,6 @@ def get_sources(
) -> Set[Path]: ) -> Set[Path]:
"""Compute the set of files to be formatted.""" """Compute the set of files to be formatted."""
sources: Set[Path] = set() sources: Set[Path] = set()
path_empty(src, "No Path provided. Nothing to do 😴", quiet, verbose, ctx)
if exclude is None: if exclude is None:
exclude = re_compile_maybe_verbose(DEFAULT_EXCLUDES) exclude = re_compile_maybe_verbose(DEFAULT_EXCLUDES)

View File

@ -972,10 +972,13 @@ def test_check_diff_use_together(self) -> None:
# Multi file command. # Multi file command.
self.invokeBlack([str(src1), str(src2), "--diff", "--check"], exit_code=1) self.invokeBlack([str(src1), str(src2), "--diff", "--check"], exit_code=1)
def test_no_files(self) -> None: def test_no_src_fails(self) -> None:
with cache_dir(): with cache_dir():
# Without an argument, black exits with error code 0. self.invokeBlack([], exit_code=1)
self.invokeBlack([])
def test_src_and_code_fails(self) -> None:
with cache_dir():
self.invokeBlack([".", "-c", "0"], exit_code=1)
def test_broken_symlink(self) -> None: def test_broken_symlink(self) -> None:
with cache_dir() as workspace: with cache_dir() as workspace:
@ -1229,13 +1232,18 @@ def test_invalid_cli_regex(self) -> None:
def test_required_version_matches_version(self) -> None: def test_required_version_matches_version(self) -> None:
self.invokeBlack( self.invokeBlack(
["--required-version", black.__version__], exit_code=0, ignore_config=True ["--required-version", black.__version__, "-c", "0"],
exit_code=0,
ignore_config=True,
) )
def test_required_version_does_not_match_version(self) -> None: def test_required_version_does_not_match_version(self) -> None:
self.invokeBlack( result = BlackRunner().invoke(
["--required-version", "20.99b"], exit_code=1, ignore_config=True black.main,
["--required-version", "20.99b", "-c", "0"],
) )
self.assertEqual(result.exit_code, 1)
self.assertIn("required version", result.stderr)
def test_preserves_line_endings(self) -> None: def test_preserves_line_endings(self) -> None:
with TemporaryDirectory() as workspace: with TemporaryDirectory() as workspace: