Skip to content

Show checked filenames with --verbose #313

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/check_jsonschema/checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ def _build_result(self) -> CheckResult:
validator = self.get_validator(path, data)
for err in validator.iter_errors(data):
result.record_validation_error(path, err)
else:
result.record_validation_success(path)
return result

def _run(self) -> None:
Expand Down
16 changes: 12 additions & 4 deletions src/check_jsonschema/reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def __init__(self, *, verbosity: int, **kwargs: t.Any) -> None:
super().__init__(**kwargs)

@abc.abstractmethod
def report_success(self) -> None:
def report_success(self, result: CheckResult) -> None:
raise NotImplementedError

@abc.abstractmethod
Expand All @@ -33,7 +33,7 @@ def report_errors(self, result: CheckResult) -> None:

def report_result(self, result: CheckResult) -> None:
if result.success:
self.report_success()
self.report_success(result)
else:
self.report_errors(result)

Expand All @@ -51,11 +51,15 @@ def __init__(
def _echo(self, s: str, *, indent: int = 0) -> None:
click.echo(" " * indent + s, file=self.stream)

def report_success(self) -> None:
def report_success(self, result: CheckResult) -> None:
if self.verbosity < 1:
return
ok = click.style("ok", fg="green")
self._echo(f"{ok} -- validation done")
if self.verbosity > 1:
self._echo("The following files were checked:")
for filename in result.successes:
self._echo(f" {filename}")

def _format_validation_error_message(
self, err: jsonschema.ValidationError, filename: str | None = None
Expand Down Expand Up @@ -140,10 +144,12 @@ def _dump(self, data: t.Any) -> None:
else:
click.echo(json.dumps(data, separators=(",", ":")))

def report_success(self) -> None:
def report_success(self, result: CheckResult) -> None:
report_obj: dict[str, t.Any] = {"status": "ok"}
if self.verbosity > 0:
report_obj["errors"] = []
if self.verbosity > 1:
report_obj["checked_paths"] = list(result.successes)
self._dump(report_obj)

def _dump_error_map(
Expand Down Expand Up @@ -192,6 +198,8 @@ def _dump_parse_errors(

def report_errors(self, result: CheckResult) -> None:
report_obj: dict[str, t.Any] = {"status": "fail"}
if self.verbosity > 1:
report_obj["checked_paths"] = list(result.successes)
if self.verbosity > 0:
report_obj["errors"] = list(self._dump_error_map(result.validation_errors))
report_obj["parse_errors"] = list(
Expand Down
4 changes: 4 additions & 0 deletions src/check_jsonschema/result.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,15 @@ class CheckResult:
def __init__(self) -> None:
self.validation_errors: dict[str, list[jsonschema.ValidationError]] = {}
self.parse_errors: dict[str, list[ParseError]] = {}
self.successes: list[str] = []

@property
def success(self) -> bool:
return not (bool(self.parse_errors) or bool(self.validation_errors))

def record_validation_success(self, path: pathlib.Path) -> None:
self.successes.append(str(path))

def record_validation_error(
self, path: pathlib.Path, err: jsonschema.ValidationError
) -> None:
Expand Down
27 changes: 21 additions & 6 deletions tests/unit/test_reporters.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
import textwrap

import pytest
from jsonschema import Draft7Validator
Expand All @@ -8,7 +9,9 @@


def _make_success_result():
return CheckResult()
res = CheckResult()
res.successes.append("foo.json")
return res


@pytest.mark.parametrize("verbosity", (0, 1, 2))
Expand All @@ -18,29 +21,41 @@ def test_text_format_success(capsys, verbosity, use_report_result_path):
if use_report_result_path:
reporter.report_result(_make_success_result())
else:
reporter.report_success()
reporter.report_success(_make_success_result())
captured = capsys.readouterr()
assert captured.err == ""
if verbosity == 0:
assert captured.out == ""
else:
elif verbosity == 1:
assert captured.out == "ok -- validation done\n"
else:
assert captured.out == textwrap.dedent(
"""\
ok -- validation done
The following files were checked:
foo.json
"""
)


@pytest.mark.parametrize("verbosity", (0, 1))
@pytest.mark.parametrize("verbosity", (0, 1, 2))
@pytest.mark.parametrize("use_report_result_path", (False, True))
def test_json_format_success(capsys, verbosity, use_report_result_path):
reporter = JsonReporter(verbosity=verbosity, pretty=False)
if use_report_result_path:
reporter.report_result(_make_success_result())
else:
reporter.report_success()
reporter.report_success(_make_success_result())
captured = capsys.readouterr()
assert captured.err == ""
if verbosity == 0:
assert captured.out == '{"status":"ok"}\n'
else:
elif verbosity == 1:
assert captured.out == '{"status":"ok","errors":[]}\n'
else:
assert (
captured.out == '{"status":"ok","errors":[],"checked_paths":["foo.json"]}\n'
)


def test_text_format_validation_error_message_simple():
Expand Down