black-primer: handle singular and plural in output messages (#1432)
* Handle singular and plural in output messages
This commit is contained in:
parent
bb767863b0
commit
a2408b3cb2
14
README.md
14
README.md
@ -1010,7 +1010,7 @@ Use [python-black](https://atom.io/packages/python-black).
|
|||||||
|
|
||||||
### Kakoune
|
### Kakoune
|
||||||
|
|
||||||
Add the following hook to your kakrc, then run black with `:format`.
|
Add the following hook to your kakrc, then run _Black_ with `:format`.
|
||||||
|
|
||||||
```
|
```
|
||||||
hook global WinSetOption filetype=python %{
|
hook global WinSetOption filetype=python %{
|
||||||
@ -1151,7 +1151,7 @@ If you're running locally yourself to test black on lots of code try:
|
|||||||
```text
|
```text
|
||||||
Usage: black-primer [OPTIONS]
|
Usage: black-primer [OPTIONS]
|
||||||
|
|
||||||
primer - prime projects for blackening ... 🏴
|
primer - prime projects for blackening... 🏴
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
-c, --config PATH JSON config file path [default: /Users/cooper/repos/
|
-c, --config PATH JSON config file path [default: /Users/cooper/repos/
|
||||||
@ -1173,7 +1173,7 @@ Options:
|
|||||||
|
|
||||||
### primer config file
|
### primer config file
|
||||||
|
|
||||||
The config is `JSON` format. It's main element is the `"projects"` dictionary. Below
|
The config is JSON format. Its main element is the `"projects"` dictionary. Below
|
||||||
explains each parameter:
|
explains each parameter:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
@ -1201,17 +1201,17 @@ explains each parameter:
|
|||||||
|
|
||||||
```console
|
```console
|
||||||
cooper-mbp:black cooper$ ~/venvs/b/bin/black-primer
|
cooper-mbp:black cooper$ ~/venvs/b/bin/black-primer
|
||||||
[2020-05-17 13:06:40,830] INFO: 4 projects to run black over (lib.py:270)
|
[2020-05-17 13:06:40,830] INFO: 4 projects to run Black over (lib.py:270)
|
||||||
[2020-05-17 13:06:44,215] INFO: Analyzing results (lib.py:285)
|
[2020-05-17 13:06:44,215] INFO: Analyzing results (lib.py:285)
|
||||||
-- primer results 📊 --
|
-- primer results 📊 --
|
||||||
|
|
||||||
3 / 4 succeeded (75.0%) ✅
|
3 / 4 succeeded (75.0%) ✅
|
||||||
1 / 4 FAILED (25.0%) 💩
|
1 / 4 FAILED (25.0%) 💩
|
||||||
- 0 projects Disabled by config
|
- 0 projects disabled by config
|
||||||
- 0 projects skipped due to Python Version
|
- 0 projects skipped due to Python version
|
||||||
- 0 skipped due to long checkout
|
- 0 skipped due to long checkout
|
||||||
|
|
||||||
Failed Projects:
|
Failed projects:
|
||||||
|
|
||||||
## flake8-bugbear:
|
## flake8-bugbear:
|
||||||
- Returned 1
|
- Returned 1
|
||||||
|
@ -109,7 +109,7 @@ async def async_main(
|
|||||||
default=str(DEFAULT_WORKDIR),
|
default=str(DEFAULT_WORKDIR),
|
||||||
type=click.Path(exists=False),
|
type=click.Path(exists=False),
|
||||||
show_default=True,
|
show_default=True,
|
||||||
help="Directory Path for repo checkouts",
|
help="Directory path for repo checkouts",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"-W",
|
"-W",
|
||||||
@ -121,9 +121,9 @@ async def async_main(
|
|||||||
)
|
)
|
||||||
@click.pass_context
|
@click.pass_context
|
||||||
def main(ctx: click.core.Context, **kwargs: Any) -> None:
|
def main(ctx: click.core.Context, **kwargs: Any) -> None:
|
||||||
"""primer - prime projects for blackening ... 🏴"""
|
"""primer - prime projects for blackening... 🏴"""
|
||||||
LOG.debug(f"Starting {sys.argv[0]}")
|
LOG.debug(f"Starting {sys.argv[0]}")
|
||||||
# TODO: Change to asyncio.run when black >= 3.7 only
|
# TODO: Change to asyncio.run when Black >= 3.7 only
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
try:
|
try:
|
||||||
ctx.exit(loop.run_until_complete(async_main(**kwargs)))
|
ctx.exit(loop.run_until_complete(async_main(**kwargs)))
|
||||||
|
@ -22,9 +22,9 @@
|
|||||||
|
|
||||||
|
|
||||||
# Windows needs a ProactorEventLoop if you want to exec subprocesses
|
# Windows needs a ProactorEventLoop if you want to exec subprocesses
|
||||||
# Startng 3.8 this is the default - Can remove when black >= 3.8
|
# Starting with 3.8 this is the default - can remove when Black >= 3.8
|
||||||
# mypy only respects sys.platform if directly in the evaluation
|
# mypy only respects sys.platform if directly in the evaluation
|
||||||
# # https://mypy.readthedocs.io/en/latest/common_issues.html#python-version-and-system-platform-checks # noqa: B950
|
# https://mypy.readthedocs.io/en/latest/common_issues.html#python-version-and-system-platform-checks # noqa: B950
|
||||||
if sys.platform == "win32":
|
if sys.platform == "win32":
|
||||||
asyncio.set_event_loop(asyncio.ProactorEventLoop())
|
asyncio.set_event_loop(asyncio.ProactorEventLoop())
|
||||||
|
|
||||||
@ -78,16 +78,18 @@ def analyze_results(project_count: int, results: Results) -> int:
|
|||||||
bold=bool(results.stats["failed"]),
|
bold=bool(results.stats["failed"]),
|
||||||
fg="red",
|
fg="red",
|
||||||
)
|
)
|
||||||
click.echo(f" - {results.stats['disabled']} projects Disabled by config")
|
s = "" if results.stats["disabled"] == 1 else "s"
|
||||||
|
click.echo(f" - {results.stats['disabled']} project{s} disabled by config")
|
||||||
|
s = "" if results.stats["wrong_py_ver"] == 1 else "s"
|
||||||
click.echo(
|
click.echo(
|
||||||
f" - {results.stats['wrong_py_ver']} projects skipped due to Python Version"
|
f" - {results.stats['wrong_py_ver']} project{s} skipped due to Python version"
|
||||||
)
|
)
|
||||||
click.echo(
|
click.echo(
|
||||||
f" - {results.stats['skipped_long_checkout']} skipped due to long checkout"
|
f" - {results.stats['skipped_long_checkout']} skipped due to long checkout"
|
||||||
)
|
)
|
||||||
|
|
||||||
if results.failed_projects:
|
if results.failed_projects:
|
||||||
click.secho("\nFailed Projects:\n", bold=True)
|
click.secho("\nFailed projects:\n", bold=True)
|
||||||
|
|
||||||
for project_name, project_cpe in results.failed_projects.items():
|
for project_name, project_cpe in results.failed_projects.items():
|
||||||
print(f"## {project_name}:")
|
print(f"## {project_name}:")
|
||||||
@ -104,7 +106,7 @@ def analyze_results(project_count: int, results: Results) -> int:
|
|||||||
async def black_run(
|
async def black_run(
|
||||||
repo_path: Path, project_config: Dict[str, Any], results: Results
|
repo_path: Path, project_config: Dict[str, Any], results: Results
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Run black and record failures"""
|
"""Run Black and record failures"""
|
||||||
cmd = [str(which(BLACK_BINARY))]
|
cmd = [str(which(BLACK_BINARY))]
|
||||||
if "cli_arguments" in project_config and project_config["cli_arguments"]:
|
if "cli_arguments" in project_config and project_config["cli_arguments"]:
|
||||||
cmd.extend(*project_config["cli_arguments"])
|
cmd.extend(*project_config["cli_arguments"])
|
||||||
@ -201,7 +203,7 @@ async def project_runner(
|
|||||||
rebase: bool = False,
|
rebase: bool = False,
|
||||||
keep: bool = False,
|
keep: bool = False,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Checkout project and run black on it + record result"""
|
"""Check out project and run Black on it + record result"""
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
py_version = f"{version_info[0]}.{version_info[1]}"
|
py_version = f"{version_info[0]}.{version_info[1]}"
|
||||||
while True:
|
while True:
|
||||||
@ -267,11 +269,13 @@ async def process_queue(
|
|||||||
|
|
||||||
config, queue = await load_projects_queue(Path(config_file))
|
config, queue = await load_projects_queue(Path(config_file))
|
||||||
project_count = queue.qsize()
|
project_count = queue.qsize()
|
||||||
LOG.info(f"{project_count} projects to run black over")
|
s = "" if project_count == 1 else "s"
|
||||||
|
LOG.info(f"{project_count} project{s} to run Black over")
|
||||||
if project_count < 1:
|
if project_count < 1:
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
LOG.debug(f"Using {workers} parallel workers to run black")
|
s = "" if workers == 1 else "s"
|
||||||
|
LOG.debug(f"Using {workers} parallel worker{s} to run Black")
|
||||||
# Wait until we finish running all the projects before analyzing
|
# Wait until we finish running all the projects before analyzing
|
||||||
await asyncio.gather(
|
await asyncio.gather(
|
||||||
*[
|
*[
|
||||||
|
@ -24,16 +24,16 @@
|
|||||||
|
|
||||||
68 / 69 succeeded (98.55%) ✅
|
68 / 69 succeeded (98.55%) ✅
|
||||||
1 / 69 FAILED (1.45%) 💩
|
1 / 69 FAILED (1.45%) 💩
|
||||||
- 0 projects Disabled by config
|
- 0 projects disabled by config
|
||||||
- 0 projects skipped due to Python Version
|
- 0 projects skipped due to Python version
|
||||||
- 0 skipped due to long checkout
|
- 0 skipped due to long checkout
|
||||||
|
|
||||||
Failed Projects:
|
Failed projects:
|
||||||
|
|
||||||
## black:
|
## black:
|
||||||
- Returned 69
|
- Returned 69
|
||||||
- stdout:
|
- stdout:
|
||||||
black didn't work
|
Black didn't work
|
||||||
|
|
||||||
"""
|
"""
|
||||||
FAKE_PROJECT_CONFIG = {
|
FAKE_PROJECT_CONFIG = {
|
||||||
@ -93,20 +93,20 @@ def test_analyze_results(self) -> None:
|
|||||||
"success": 68,
|
"success": 68,
|
||||||
"wrong_py_ver": 0,
|
"wrong_py_ver": 0,
|
||||||
},
|
},
|
||||||
{"black": CalledProcessError(69, ["black"], b"black didn't work", b"")},
|
{"black": CalledProcessError(69, ["black"], b"Black didn't work", b"")},
|
||||||
)
|
)
|
||||||
with capture_stdout(lib.analyze_results, 69, fake_results) as analyze_stdout:
|
with capture_stdout(lib.analyze_results, 69, fake_results) as analyze_stdout:
|
||||||
self.assertEqual(EXPECTED_ANALYSIS_OUTPUT, analyze_stdout)
|
self.assertEqual(EXPECTED_ANALYSIS_OUTPUT, analyze_stdout)
|
||||||
|
|
||||||
@event_loop()
|
@event_loop()
|
||||||
def test_black_run(self) -> None:
|
def test_black_run(self) -> None:
|
||||||
"""Pretend run black to ensure we cater for all scenarios"""
|
"""Pretend to run Black to ensure we cater for all scenarios"""
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
repo_path = Path(gettempdir())
|
repo_path = Path(gettempdir())
|
||||||
project_config = deepcopy(FAKE_PROJECT_CONFIG)
|
project_config = deepcopy(FAKE_PROJECT_CONFIG)
|
||||||
results = lib.Results({"failed": 0, "success": 0}, {})
|
results = lib.Results({"failed": 0, "success": 0}, {})
|
||||||
|
|
||||||
# Test a successful black run
|
# Test a successful Black run
|
||||||
with patch("black_primer.lib._gen_check_output", return_subproccess_output):
|
with patch("black_primer.lib._gen_check_output", return_subproccess_output):
|
||||||
loop.run_until_complete(lib.black_run(repo_path, project_config, results))
|
loop.run_until_complete(lib.black_run(repo_path, project_config, results))
|
||||||
self.assertEqual(1, results.stats["success"])
|
self.assertEqual(1, results.stats["success"])
|
||||||
|
Loading…
Reference in New Issue
Block a user