From 35e3e9f5f8b90f840ac15f398dc57e3ecb0688bf Mon Sep 17 00:00:00 2001 From: HarshPopat23 Date: Thu, 24 Sep 2026 22:16:44 +0530 Subject: [PATCH] Style human-readable install progress Signed-off-by: HarshPopat23 --- src/command_install.cc | 68 ++++++++++----- test/CMakeLists.txt | 9 ++ .../fail_frozen_mismatch_color_always.clitest | 56 +++++++++++++ .../fail_frozen_orphaned_color_always.clitest | 71 ++++++++++++++++ ...fail_frozen_untracked_color_always.clitest | 62 ++++++++++++++ .../pass_add_dependency_color_always.clitest | 77 +++++++++++++++++ .../install/pass_color_always_verbose.clitest | 71 ++++++++++++++++ test/install/pass_color_never_verbose.clitest | 68 +++++++++++++++ test/install/pass_json_color_always.clitest | 82 +++++++++++++++++++ .../pass_remove_orphaned_color_always.clitest | 76 +++++++++++++++++ .../pass_up_to_date_color_always.clitest | 77 +++++++++++++++++ 11 files changed, 697 insertions(+), 20 deletions(-) create mode 100644 test/install/fail_frozen_mismatch_color_always.clitest create mode 100644 test/install/fail_frozen_orphaned_color_always.clitest create mode 100644 test/install/fail_frozen_untracked_color_always.clitest create mode 100644 test/install/pass_add_dependency_color_always.clitest create mode 100644 test/install/pass_color_always_verbose.clitest create mode 100644 test/install/pass_color_never_verbose.clitest create mode 100644 test/install/pass_json_color_always.clitest create mode 100644 test/install/pass_remove_orphaned_color_always.clitest create mode 100644 test/install/pass_up_to_date_color_always.clitest diff --git a/src/command_install.cc b/src/command_install.cc index a82c06f71..05f5b257b 100644 --- a/src/command_install.cc +++ b/src/command_install.cc @@ -18,13 +18,24 @@ #include "configuration.h" #include "error.h" #include "logger.h" +#include "print.h" #include "resolver.h" namespace { -auto padded_label(const std::string_view label) -> std::string { +using sourcemeta::core::TerminalStyle; + +constexpr auto PROGRESS_STYLE{TerminalStyle::Bold | TerminalStyle::Cyan}; +constexpr auto SUCCESS_STYLE{TerminalStyle::Bold | TerminalStyle::Green}; +constexpr auto WARNING_STYLE{TerminalStyle::Bold | TerminalStyle::Yellow}; +constexpr auto FAILURE_STYLE{TerminalStyle::Bold | TerminalStyle::Red}; + +auto padded_label(const std::string_view label, + const sourcemeta::core::TerminalStyle style = + sourcemeta::core::TerminalStyle::None) -> std::string { assert(label.size() <= 14); - std::string result{label}; + auto result{sourcemeta::jsonschema::paint( + label, style, sourcemeta::core::TerminalStream::Stderr)}; result.append(14 - label.size(), ' '); result += " : "; return result; @@ -160,30 +171,41 @@ auto make_on_event(const sourcemeta::core::Options &options, if (is_json) { emit_json(events_array, "fetching", "uri", event.uri); } else { - std::cerr << padded_label("Fetching") << event.uri << "\n"; + std::cerr << padded_label("Fetching", PROGRESS_STYLE) << event.uri + << "\n"; } break; case Type::FetchEnd: break; - case Type::BundleStart: + case Type::BundleStart: { + const auto effective_style{is_json ? TerminalStyle::None + : PROGRESS_STYLE}; sourcemeta::jsonschema::LOG_VERBOSE(options) - << padded_label("Bundling") << event.uri << "\n"; + << padded_label("Bundling", effective_style) << event.uri + << "\n"; break; + } case Type::BundleEnd: break; - case Type::WriteStart: + case Type::WriteStart: { + const auto effective_style{is_json ? TerminalStyle::None + : PROGRESS_STYLE}; sourcemeta::jsonschema::LOG_VERBOSE(options) - << padded_label("Writing") << event.path.generic_string() - << "\n"; + << padded_label("Writing", effective_style) + << event.path.generic_string() << "\n"; break; + } case Type::WriteEnd: break; - case Type::VerifyStart: + case Type::VerifyStart: { + const auto effective_style{is_json ? TerminalStyle::None + : PROGRESS_STYLE}; sourcemeta::jsonschema::LOG_VERBOSE(options) - << padded_label("Verifying") << event.path.generic_string() - << "\n"; + << padded_label("Verifying", effective_style) + << event.path.generic_string() << "\n"; break; + } case Type::VerifyEnd: if (is_json) { auto json_event{sourcemeta::core::JSON::make_object()}; @@ -193,7 +215,7 @@ auto make_on_event(const sourcemeta::core::Options &options, "path", sourcemeta::core::JSON{event.path.generic_string()}); events_array.push_back(std::move(json_event)); } else { - std::cerr << padded_label("Installed") + std::cerr << padded_label("Installed", SUCCESS_STYLE) << event.path.generic_string() << "\n"; } @@ -202,7 +224,8 @@ auto make_on_event(const sourcemeta::core::Options &options, if (is_json) { emit_json(events_array, "up-to-date", "uri", event.uri); } else { - std::cerr << padded_label("Up to date") << event.uri << "\n"; + std::cerr << padded_label("Up to date", SUCCESS_STYLE) + << event.uri << "\n"; } break; @@ -211,7 +234,7 @@ auto make_on_event(const sourcemeta::core::Options &options, emit_json(events_array, "file-missing", "path", event.path.generic_string()); } else { - std::cerr << padded_label("File missing") + std::cerr << padded_label("File missing", WARNING_STYLE) << event.path.generic_string() << "\n"; } @@ -221,7 +244,7 @@ auto make_on_event(const sourcemeta::core::Options &options, emit_json(events_array, "mismatched", "path", event.path.generic_string()); } else { - std::cerr << padded_label("Mismatched") + std::cerr << padded_label("Mismatched", WARNING_STYLE) << event.path.generic_string() << "\n"; } @@ -230,7 +253,8 @@ auto make_on_event(const sourcemeta::core::Options &options, if (is_json) { emit_json(events_array, "path-mismatch", "uri", event.uri); } else { - std::cerr << padded_label("Path mismatch") << event.uri << "\n"; + std::cerr << padded_label("Path mismatch", WARNING_STYLE) + << event.uri << "\n"; } break; @@ -239,7 +263,8 @@ auto make_on_event(const sourcemeta::core::Options &options, if (is_json) { emit_json(events_array, "untracked", "uri", event.uri); } else { - std::cerr << padded_label("Untracked") << event.uri << "\n"; + std::cerr << padded_label("Untracked", FAILURE_STYLE) << event.uri + << "\n"; } break; @@ -247,7 +272,10 @@ auto make_on_event(const sourcemeta::core::Options &options, if (is_json) { emit_json(events_array, "orphaned", "uri", event.uri); } else { - std::cerr << padded_label("Orphaned") << event.uri << "\n"; + const auto style{orphaned_behavior == OrphanedBehavior::Delete + ? WARNING_STYLE + : FAILURE_STYLE}; + std::cerr << padded_label("Orphaned", style) << event.uri << "\n"; } if (orphaned_behavior == OrphanedBehavior::Delete) { @@ -381,8 +409,8 @@ auto sourcemeta::jsonschema::install(const sourcemeta::core::Options &options) json_event.assign("path", sourcemeta::core::JSON{relative_target}); events_array.push_back(std::move(json_event)); } else { - std::cerr << padded_label("Adding") << dependency_uri << " -> " - << relative_target << "\n"; + std::cerr << padded_label("Adding", PROGRESS_STYLE) << dependency_uri + << " -> " << relative_target << "\n"; } } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0a7693188..afa4eafd8 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1122,6 +1122,15 @@ add_jsonschema_test(install/pass_frozen_idempotent) add_jsonschema_test(install/pass_frozen_subdir) add_jsonschema_test(install/pass_frozen_mixed_status) add_jsonschema_test(install/pass_frozen_resolve_mapping) +add_jsonschema_test(install/pass_color_always_verbose) +add_jsonschema_test(install/pass_up_to_date_color_always) +add_jsonschema_test(install/pass_add_dependency_color_always) +add_jsonschema_test(install/pass_remove_orphaned_color_always) +add_jsonschema_test(install/fail_frozen_mismatch_color_always) +add_jsonschema_test(install/fail_frozen_untracked_color_always) +add_jsonschema_test(install/fail_frozen_orphaned_color_always) +add_jsonschema_test(install/pass_json_color_always) +add_jsonschema_test(install/pass_color_never_verbose) # Upgrade add_jsonschema_test(upgrade/pass_default_target) diff --git a/test/install/fail_frozen_mismatch_color_always.clitest b/test/install/fail_frozen_mismatch_color_always.clitest new file mode 100644 index 000000000..f6084f0bb --- /dev/null +++ b/test/install/fail_frozen_mismatch_color_always.clitest @@ -0,0 +1,56 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/schema.json": "./vendor/schema.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> Fetching : [CWD_URI]/source/schema.json +2> Installed : [CWD]/project/vendor/schema.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +WRITE project/vendor/schema.json UNTIL EOF +TAMPERED CONTENT +EOF + +COPY project/jsonschema.lock.json TO lock_before.json + +// Validation failure with forced color +RUN install --frozen --color always STDIN /dev/null IN project INTO result_1.txt EXPECTING 2 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_1.txt +REPLACE $CWD WITH '[CWD]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;33m' WITH '[ANSI_BOLD_YELLOW]' IN result_1.txt +REPLACE MATCHING '\x1B\[0m' WITH '[ANSI_RESET]' IN result_1.txt + +WRITE expected_1.txt UNTIL EOF +2> [ANSI_BOLD_YELLOW]Mismatched[ANSI_RESET] : [CWD]/project/vendor/schema.json +2> error: File hash does not match lock file in frozen mode +2> at uri [CWD_URI]/source/schema.json +EOF + +COMPARE result_1.txt AGAINST expected_1.txt + +COMPARE project/jsonschema.lock.json AGAINST lock_before.json diff --git a/test/install/fail_frozen_orphaned_color_always.clitest b/test/install/fail_frozen_orphaned_color_always.clitest new file mode 100644 index 000000000..ca22e4931 --- /dev/null +++ b/test/install/fail_frozen_orphaned_color_always.clitest @@ -0,0 +1,71 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE source/other.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "number" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/schema.json": "./vendor/schema.json", + "[CWD_URI]/source/other.json": "./vendor/other.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> Fetching : [CWD_URI]/source/other.json +2> Installed : [CWD]/project/vendor/other.json +2> Fetching : [CWD_URI]/source/schema.json +2> Installed : [CWD]/project/vendor/schema.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/schema.json": "./vendor/schema.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +COPY project/jsonschema.lock.json TO lock_before.json + +// Validation failure with forced color +RUN install --frozen --color always STDIN /dev/null IN project INTO result_1.txt EXPECTING 2 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;32m' WITH '[ANSI_BOLD_GREEN]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;31m' WITH '[ANSI_BOLD_RED]' IN result_1.txt +REPLACE MATCHING '\x1B\[0m' WITH '[ANSI_RESET]' IN result_1.txt + +WRITE expected_1.txt UNTIL EOF +2> [ANSI_BOLD_GREEN]Up to date[ANSI_RESET] : [CWD_URI]/source/schema.json +2> [ANSI_BOLD_RED]Orphaned[ANSI_RESET] : [CWD_URI]/source/other.json +EOF + +COMPARE result_1.txt AGAINST expected_1.txt + +COMPARE project/jsonschema.lock.json AGAINST lock_before.json diff --git a/test/install/fail_frozen_untracked_color_always.clitest b/test/install/fail_frozen_untracked_color_always.clitest new file mode 100644 index 000000000..ebb94328d --- /dev/null +++ b/test/install/fail_frozen_untracked_color_always.clitest @@ -0,0 +1,62 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/schema.json": "./vendor/schema.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> Fetching : [CWD_URI]/source/schema.json +2> Installed : [CWD]/project/vendor/schema.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/schema.json": "./vendor/schema.json", + "file:///zzz/fake/new.json": "./vendor/new.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +COPY project/jsonschema.lock.json TO lock_before.json + +// Validation failure with forced color +RUN install --frozen --color always STDIN /dev/null IN project INTO result_1.txt EXPECTING 2 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;32m' WITH '[ANSI_BOLD_GREEN]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;31m' WITH '[ANSI_BOLD_RED]' IN result_1.txt +REPLACE MATCHING '\x1B\[0m' WITH '[ANSI_RESET]' IN result_1.txt + +WRITE expected_1.txt UNTIL EOF +2> [ANSI_BOLD_GREEN]Up to date[ANSI_RESET] : [CWD_URI]/source/schema.json +2> [ANSI_BOLD_RED]Untracked[ANSI_RESET] : file:///zzz/fake/new.json +EOF + +COMPARE result_1.txt AGAINST expected_1.txt + +COMPARE project/jsonschema.lock.json AGAINST lock_before.json diff --git a/test/install/pass_add_dependency_color_always.clitest b/test/install/pass_add_dependency_color_always.clitest new file mode 100644 index 000000000..cb064b173 --- /dev/null +++ b/test/install/pass_add_dependency_color_always.clitest @@ -0,0 +1,77 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/user.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": {} +} +EOF + +RUN install $CWD_URI/source/user.json ./vendor/user.json --color always STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt +REPLACE MATCHING '\x1B\[1;36m' WITH '[ANSI_BOLD_CYAN]' IN result_0.txt +REPLACE MATCHING '\x1B\[1;32m' WITH '[ANSI_BOLD_GREEN]' IN result_0.txt +REPLACE MATCHING '\x1B\[0m' WITH '[ANSI_RESET]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> [ANSI_BOLD_CYAN]Adding[ANSI_RESET] : [CWD_URI]/source/user.json -> ./vendor/user.json +2> [ANSI_BOLD_CYAN]Fetching[ANSI_RESET] : [CWD_URI]/source/user.json +2> [ANSI_BOLD_GREEN]Installed[ANSI_RESET] : [CWD]/project/vendor/user.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +COPY project/jsonschema.json TO checked_config.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_config.json +WRITE expected_config.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/user.json": "./vendor/user.json" + } +} +EOF + +COMPARE checked_config.json AGAINST expected_config.json + +COPY project/vendor/user.json TO checked_schema.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_schema.json +WRITE expected_schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "$id": "[CWD_URI]/source/user.json" +} +EOF + +COMPARE checked_schema.json AGAINST expected_schema.json + +CHECKSUM SHA256 project/vendor/user.json AS HASH + +COPY project/jsonschema.lock.json TO checked_lock.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_lock.json +WRITE expected_lock.json UNTIL EOF +{ + "version": 1, + "dependencies": { + "[CWD_URI]/source/user.json": { + "path": "./vendor/user.json", + "hash": "[HASH]", + "hashAlgorithm": "sha256" + } + } +} +EOF + +REPLACE '[HASH]' WITH $HASH IN expected_lock.json + +COMPARE checked_lock.json AGAINST expected_lock.json diff --git a/test/install/pass_color_always_verbose.clitest b/test/install/pass_color_always_verbose.clitest new file mode 100644 index 000000000..ef7634251 --- /dev/null +++ b/test/install/pass_color_always_verbose.clitest @@ -0,0 +1,71 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/user.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/user.json": "./vendor/user.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install --verbose --color always STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt +REPLACE MATCHING '\x1B\[1;36m' WITH '[ANSI_BOLD_CYAN]' IN result_0.txt +REPLACE MATCHING '\x1B\[1;32m' WITH '[ANSI_BOLD_GREEN]' IN result_0.txt +REPLACE MATCHING '\x1B\[0m' WITH '[ANSI_RESET]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> [ANSI_BOLD_CYAN]Fetching[ANSI_RESET] : [CWD_URI]/source/user.json +2> [ANSI_BOLD_CYAN]Bundling[ANSI_RESET] : [CWD_URI]/source/user.json +2> [ANSI_BOLD_CYAN]Writing[ANSI_RESET] : [CWD]/project/vendor/user.json +2> [ANSI_BOLD_CYAN]Verifying[ANSI_RESET] : [CWD]/project/vendor/user.json +2> [ANSI_BOLD_GREEN]Installed[ANSI_RESET] : [CWD]/project/vendor/user.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +COPY project/vendor/user.json TO checked_schema.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_schema.json +WRITE expected_schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "$id": "[CWD_URI]/source/user.json" +} +EOF + +COMPARE checked_schema.json AGAINST expected_schema.json + +CHECKSUM SHA256 project/vendor/user.json AS HASH + +COPY project/jsonschema.lock.json TO checked_lock.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_lock.json +WRITE expected_lock.json UNTIL EOF +{ + "version": 1, + "dependencies": { + "[CWD_URI]/source/user.json": { + "path": "./vendor/user.json", + "hash": "[HASH]", + "hashAlgorithm": "sha256" + } + } +} +EOF + +REPLACE '[HASH]' WITH $HASH IN expected_lock.json + +COMPARE checked_lock.json AGAINST expected_lock.json diff --git a/test/install/pass_color_never_verbose.clitest b/test/install/pass_color_never_verbose.clitest new file mode 100644 index 000000000..6b284ae2b --- /dev/null +++ b/test/install/pass_color_never_verbose.clitest @@ -0,0 +1,68 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/user.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/user.json": "./vendor/user.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install --verbose --color never STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> Fetching : [CWD_URI]/source/user.json +2> Bundling : [CWD_URI]/source/user.json +2> Writing : [CWD]/project/vendor/user.json +2> Verifying : [CWD]/project/vendor/user.json +2> Installed : [CWD]/project/vendor/user.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +COPY project/vendor/user.json TO checked_schema.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_schema.json +WRITE expected_schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "$id": "[CWD_URI]/source/user.json" +} +EOF + +COMPARE checked_schema.json AGAINST expected_schema.json + +CHECKSUM SHA256 project/vendor/user.json AS HASH + +COPY project/jsonschema.lock.json TO checked_lock.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_lock.json +WRITE expected_lock.json UNTIL EOF +{ + "version": 1, + "dependencies": { + "[CWD_URI]/source/user.json": { + "path": "./vendor/user.json", + "hash": "[HASH]", + "hashAlgorithm": "sha256" + } + } +} +EOF + +REPLACE '[HASH]' WITH $HASH IN expected_lock.json + +COMPARE checked_lock.json AGAINST expected_lock.json diff --git a/test/install/pass_json_color_always.clitest b/test/install/pass_json_color_always.clitest new file mode 100644 index 000000000..b1790678f --- /dev/null +++ b/test/install/pass_json_color_always.clitest @@ -0,0 +1,82 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/user.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/user.json": "./vendor/user.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install --json --color always STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +1> { +1> "events": [ +1> { +1> "type": "fetching", +1> "uri": "[CWD_URI]/source/user.json" +1> }, +1> { +1> "type": "installed", +1> "uri": "[CWD_URI]/source/user.json", +1> "path": "[CWD]/project/vendor/user.json" +1> } +1> ] +1> } +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +COPY project/vendor/user.json TO checked_schema.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_schema.json +WRITE expected_schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "$id": "[CWD_URI]/source/user.json" +} +EOF + +COMPARE checked_schema.json AGAINST expected_schema.json + +// Verbose JSON execution to ensure verbose messages on stderr remain uncolored in JSON mode +RUN install --force --json --verbose --color always STDIN /dev/null IN project INTO result_1.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_1.txt +REPLACE $CWD WITH '[CWD]' IN result_1.txt + +WRITE expected_1.txt UNTIL EOF +1> { +1> "events": [ +1> { +1> "type": "fetching", +1> "uri": "[CWD_URI]/source/user.json" +1> }, +1> { +1> "type": "installed", +1> "uri": "[CWD_URI]/source/user.json", +1> "path": "[CWD]/project/vendor/user.json" +1> } +1> ] +1> } +2> Bundling : [CWD_URI]/source/user.json +2> Writing : [CWD]/project/vendor/user.json +2> Verifying : [CWD]/project/vendor/user.json +EOF + +COMPARE result_1.txt AGAINST expected_1.txt diff --git a/test/install/pass_remove_orphaned_color_always.clitest b/test/install/pass_remove_orphaned_color_always.clitest new file mode 100644 index 000000000..51c03e869 --- /dev/null +++ b/test/install/pass_remove_orphaned_color_always.clitest @@ -0,0 +1,76 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project/vendor + +WRITE source/a.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.com/a", + "type": "string" +} +EOF + +WRITE source/b.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.com/b", + "type": "integer" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/a.json": "./vendor/a.json", + "[CWD_URI]/source/b.json": "./vendor/b.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> Fetching : [CWD_URI]/source/a.json +2> Installed : [CWD]/project/vendor/a.json +2> Fetching : [CWD_URI]/source/b.json +2> Installed : [CWD]/project/vendor/b.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/a.json": "./vendor/a.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install --color always STDIN /dev/null IN project INTO result_1.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;32m' WITH '[ANSI_BOLD_GREEN]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;33m' WITH '[ANSI_BOLD_YELLOW]' IN result_1.txt +REPLACE MATCHING '\x1B\[0m' WITH '[ANSI_RESET]' IN result_1.txt + +WRITE expected_1.txt UNTIL EOF +2> [ANSI_BOLD_GREEN]Up to date[ANSI_RESET] : [CWD_URI]/source/a.json +2> [ANSI_BOLD_YELLOW]Orphaned[ANSI_RESET] : [CWD_URI]/source/b.json +EOF + +COMPARE result_1.txt AGAINST expected_1.txt + +TREE project/vendor INTO listing.txt + +WRITE expected_listing.txt UNTIL EOF +./a.json +EOF + +COMPARE listing.txt AGAINST expected_listing.txt diff --git a/test/install/pass_up_to_date_color_always.clitest b/test/install/pass_up_to_date_color_always.clitest new file mode 100644 index 000000000..92d9d04b2 --- /dev/null +++ b/test/install/pass_up_to_date_color_always.clitest @@ -0,0 +1,77 @@ +MAKE DIRECTORY source + +MAKE DIRECTORY project + +WRITE source/user.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string" +} +EOF + +WRITE project/jsonschema.json UNTIL EOF +{ + "dependencies": { + "[CWD_URI]/source/user.json": "./vendor/user.json" + } +} +EOF + +REPLACE '[CWD_URI]' WITH $CWD_URI IN project/jsonschema.json + +RUN install STDIN /dev/null IN project INTO result_0.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_0.txt +REPLACE $CWD WITH '[CWD]' IN result_0.txt + +WRITE expected_0.txt UNTIL EOF +2> Fetching : [CWD_URI]/source/user.json +2> Installed : [CWD]/project/vendor/user.json +EOF + +COMPARE result_0.txt AGAINST expected_0.txt + +RUN install --color always STDIN /dev/null IN project INTO result_1.txt EXPECTING 0 + +REPLACE $CWD_URI WITH '[CWD_URI]' IN result_1.txt +REPLACE MATCHING '\x1B\[1;32m' WITH '[ANSI_BOLD_GREEN]' IN result_1.txt +REPLACE MATCHING '\x1B\[0m' WITH '[ANSI_RESET]' IN result_1.txt + +WRITE expected_1.txt UNTIL EOF +2> [ANSI_BOLD_GREEN]Up to date[ANSI_RESET] : [CWD_URI]/source/user.json +EOF + +COMPARE result_1.txt AGAINST expected_1.txt + +COPY project/vendor/user.json TO checked_schema.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_schema.json +WRITE expected_schema.json UNTIL EOF +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "$id": "[CWD_URI]/source/user.json" +} +EOF + +COMPARE checked_schema.json AGAINST expected_schema.json + +CHECKSUM SHA256 project/vendor/user.json AS HASH + +COPY project/jsonschema.lock.json TO checked_lock.json +REPLACE $CWD_URI WITH '[CWD_URI]' IN checked_lock.json +WRITE expected_lock.json UNTIL EOF +{ + "version": 1, + "dependencies": { + "[CWD_URI]/source/user.json": { + "path": "./vendor/user.json", + "hash": "[HASH]", + "hashAlgorithm": "sha256" + } + } +} +EOF + +REPLACE '[HASH]' WITH $HASH IN expected_lock.json + +COMPARE checked_lock.json AGAINST expected_lock.json