diff --git a/CHANGELOG.md b/CHANGELOG.md index e1acad4..75dc6a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,8 @@ and Base versions are tracked in the repo-root `VERSION` file. ### Fixed +- Pretty-printed workspace JSON output for `basectl workspace status`, `check`, + and `doctor`. - Fixed `basectl gh` authentication diagnostics to include the underlying `gh auth status` output when GitHub access fails. - Converted `bootstrap.sh` away from shell strict mode to explicit command diff --git a/cli/python/base_projects/engine.py b/cli/python/base_projects/engine.py index 4cc4560..52df816 100644 --- a/cli/python/base_projects/engine.py +++ b/cli/python/base_projects/engine.py @@ -19,6 +19,7 @@ from base_projects.workspace_manifest import WorkspaceManifestError from base_projects.workspace_reports import ManifestEntry from base_projects.workspace_reports import ProjectDiscoveryError +from base_projects.workspace_reports import dumps_json from base_projects.workspace_reports import print_workspace_check from base_projects.workspace_reports import print_workspace_doctor from base_projects.workspace_reports import print_workspace_status @@ -256,7 +257,7 @@ def workspace_status_command( return 1 if output_format == "json": - print(json.dumps(workspace_status_to_json(workspace_root, statuses, manifest), separators=(",", ":"))) + print(dumps_json(workspace_status_to_json(workspace_root, statuses, manifest))) else: print_workspace_status(workspace_root, statuses, manifest) @@ -282,7 +283,7 @@ def workspace_check_command( return 1 if output_format == "json": - print(json.dumps(workspace_check_to_json(workspace_root, results, manifest), separators=(",", ":"))) + print(dumps_json(workspace_check_to_json(workspace_root, results, manifest))) else: print_workspace_check(workspace_root, results, manifest) @@ -308,7 +309,7 @@ def workspace_doctor_command( return 1 if output_format == "json": - print(json.dumps(workspace_doctor_to_json(workspace_root, results, manifest), separators=(",", ":"))) + print(dumps_json(workspace_doctor_to_json(workspace_root, results, manifest))) else: print_workspace_doctor(workspace_root, results, manifest) diff --git a/cli/python/base_projects/tests/test_engine.py b/cli/python/base_projects/tests/test_engine.py index b53e8b2..9824cf8 100644 --- a/cli/python/base_projects/tests/test_engine.py +++ b/cli/python/base_projects/tests/test_engine.py @@ -255,6 +255,8 @@ def test_workspace_status_supports_json_format(self) -> None: payload = json.loads(stdout) self.assertEqual(status, 0) self.assertEqual(stderr, "") + self.assertTrue(stdout.startswith("{\n")) + self.assertIn(' "workspace": ', stdout) self.assertEqual(payload["workspace"], str(workspace.resolve())) self.assertEqual(payload["project_count"], 1) self.assertEqual(payload["projects"][0]["name"], "demo") diff --git a/cli/python/base_projects/tests/test_workspace_checks.py b/cli/python/base_projects/tests/test_workspace_checks.py index 79e3c82..889fb56 100644 --- a/cli/python/base_projects/tests/test_workspace_checks.py +++ b/cli/python/base_projects/tests/test_workspace_checks.py @@ -147,6 +147,8 @@ def test_workspace_check_manifest_supports_json_format(self) -> None: projects_by_repo = {project["repository"]: project for project in payload["projects"]} self.assertEqual(status, 1) self.assertEqual(stderr, "") + self.assertTrue(stdout.startswith("{\n")) + self.assertIn(' "workspace": ', stdout) self.assertEqual(payload["schema_version"], 1) self.assertEqual(payload["status"], "error") self.assertEqual(payload["workspace_manifest"]["name"], "demo-suite") @@ -239,6 +241,8 @@ def test_workspace_check_supports_json_format(self) -> None: payload = json.loads(stdout) self.assertEqual(status, 1) self.assertEqual(stderr, "") + self.assertTrue(stdout.startswith("{\n")) + self.assertIn(' "workspace": ', stdout) self.assertEqual(payload["schema_version"], 1) self.assertEqual(payload["workspace"], str(workspace.resolve())) self.assertEqual(payload["status"], "error") @@ -269,6 +273,8 @@ def test_workspace_doctor_supports_json_format(self) -> None: payload = json.loads(stdout) self.assertEqual(status, 1) self.assertEqual(stderr, "") + self.assertTrue(stdout.startswith("{\n")) + self.assertIn(' "workspace": ', stdout) self.assertEqual(payload["schema_version"], 1) self.assertEqual(payload["workspace"], str(workspace.resolve())) self.assertEqual(payload["projects"][0]["checks"][0]["id"], "BASE-P050") diff --git a/cli/python/base_projects/tests/test_workspace_status_manifest.py b/cli/python/base_projects/tests/test_workspace_status_manifest.py index f58126b..633193c 100644 --- a/cli/python/base_projects/tests/test_workspace_status_manifest.py +++ b/cli/python/base_projects/tests/test_workspace_status_manifest.py @@ -127,6 +127,8 @@ def test_workspace_status_manifest_supports_json_format(self) -> None: projects_by_repo = {project["repository"]: project for project in payload["projects"]} self.assertEqual(status, 1) self.assertEqual(stderr, "") + self.assertTrue(stdout.startswith("{\n")) + self.assertIn(' "workspace": ', stdout) self.assertEqual(payload["workspace"], str(workspace.resolve())) self.assertEqual(payload["workspace_manifest"]["path"], str(manifest_path.resolve())) self.assertEqual(payload["workspace_manifest"]["name"], "demo-suite") diff --git a/cli/python/base_projects/workspace_reports.py b/cli/python/base_projects/workspace_reports.py index 85a2316..39cf478 100644 --- a/cli/python/base_projects/workspace_reports.py +++ b/cli/python/base_projects/workspace_reports.py @@ -778,4 +778,4 @@ def workspace_manifest_entries(workspace_root: Path) -> tuple[ManifestEntry, ... def dumps_json(payload: dict[str, Any]) -> str: - return json.dumps(payload, separators=(",", ":")) + return json.dumps(payload, indent=2)