From ff77376b85eeb2098f219d89b683d5167685699a Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Fri, 3 Jan 2025 12:54:17 -0400 Subject: [PATCH] Generate a search index Signed-off-by: Juan Cruz Viotti --- Makefile | 1 + src/enterprise/enterprise_index.h | 27 ++++++++++++-- test/cli/ee/index/search-index.sh | 58 +++++++++++++++++++++++++++++++ test/sandbox/manifest-ee.txt | 1 + 4 files changed, 84 insertions(+), 3 deletions(-) create mode 100755 test/cli/ee/index/search-index.sh diff --git a/Makefile b/Makefile index 2e97ca2..324f9af 100644 --- a/Makefile +++ b/Makefile @@ -63,6 +63,7 @@ ifeq ($(ENTERPRISE), ON) ./test/cli/ee/index/no-options.sh $(PREFIX)/bin/sourcemeta-registry-index ./test/cli/ee/index/no-output.sh $(PREFIX)/bin/sourcemeta-registry-index ./test/cli/ee/index/directory-index.sh $(PREFIX)/bin/sourcemeta-registry-index + ./test/cli/ee/index/search-index.sh $(PREFIX)/bin/sourcemeta-registry-index else ./test/cli/ce/index/no-options.sh $(PREFIX)/bin/sourcemeta-registry-index ./test/cli/ce/index/no-output.sh $(PREFIX)/bin/sourcemeta-registry-index diff --git a/src/enterprise/enterprise_index.h b/src/enterprise/enterprise_index.h index 146d3ec..789e340 100644 --- a/src/enterprise/enterprise_index.h +++ b/src/enterprise/enterprise_index.h @@ -21,7 +21,8 @@ namespace sourcemeta::registry::enterprise { auto generate_toc(const sourcemeta::jsontoolkit::JSON &configuration, const std::filesystem::path &base, - const std::filesystem::path &directory) -> void { + const std::filesystem::path &directory, + sourcemeta::jsontoolkit::JSON &search_index) -> void { assert(directory.string().starts_with(base.string())); auto entries{sourcemeta::jsontoolkit::JSON::make_array()}; @@ -67,6 +68,18 @@ auto generate_toc(const sourcemeta::jsontoolkit::JSON &configuration, entry_json.assign("url", sourcemeta::jsontoolkit::JSON{entry_relative_path}); + // Collect schemas high-level metadata for searching purposes + auto search_entry{sourcemeta::jsontoolkit::JSON::make_object()}; + search_entry.assign("url", entry_json.at("url")); + search_entry.assign("title", entry_json.defines("title") + ? entry_json.at("title") + : sourcemeta::jsontoolkit::JSON{""}); + search_entry.assign("description", + entry_json.defines("description") + ? entry_json.at("description") + : sourcemeta::jsontoolkit::JSON{""}); + search_index.push_back(std::move(search_entry)); + entries.push_back(std::move(entry_json)); } } @@ -126,7 +139,8 @@ auto attach(const sourcemeta::jsontoolkit::JSON &configuration, -> int { std::cerr << "-- Indexing directory: " << output.string() << "\n"; const auto base{std::filesystem::canonical(output / "schemas")}; - generate_toc(configuration, base, base); + auto search_index{sourcemeta::jsontoolkit::JSON::make_array()}; + generate_toc(configuration, base, base, search_index); for (const auto &entry : std::filesystem::recursive_directory_iterator{output / "schemas"}) { @@ -135,9 +149,16 @@ auto attach(const sourcemeta::jsontoolkit::JSON &configuration, } std::cerr << "-- Processing: " << entry.path().string() << "\n"; - generate_toc(configuration, base, std::filesystem::canonical(entry.path())); + generate_toc(configuration, base, std::filesystem::canonical(entry.path()), + search_index); } + std::ofstream stream{output / "search.json"}; + assert(!stream.fail()); + sourcemeta::jsontoolkit::prettify(search_index, stream); + stream << "\n"; + stream.close(); + return EXIT_SUCCESS; } diff --git a/test/cli/ee/index/search-index.sh b/test/cli/ee/index/search-index.sh new file mode 100755 index 0000000..3f53105 --- /dev/null +++ b/test/cli/ee/index/search-index.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +set -o errexit +set -o nounset + +TMP="$(mktemp -d)" +clean() { rm -rf "$TMP"; } +trap clean EXIT + +cat << EOF > "$TMP/configuration.json" +{ + "url": "https://sourcemeta.com/", + "port": 8000, + "schemas": { + "example/schemas": { + "base": "https://example.com/", + "path": "./schemas" + } + } +} +EOF + +mkdir "$TMP/schemas" + +cat << 'EOF' > "$TMP/schemas/test.json" +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/test.json", + "title": "My title", + "description": "My description" +} +EOF + +cat << 'EOF' > "$TMP/schemas/no-title.json" +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/no-title.json" +} +EOF + +"$1" "$TMP/configuration.json" "$TMP/output" + +cat << 'EOF' > "$TMP/expected.json" +[ + { + "url": "/example/schemas/no-title.json", + "title": "", + "description": "" + }, + { + "url": "/example/schemas/test.json", + "title": "My title", + "description": "My description" + } +] +EOF + +diff "$TMP/output/search.json" "$TMP/expected.json" diff --git a/test/sandbox/manifest-ee.txt b/test/sandbox/manifest-ee.txt index b30cb7e..8efbbd9 100644 --- a/test/sandbox/manifest-ee.txt +++ b/test/sandbox/manifest-ee.txt @@ -26,3 +26,4 @@ ./schemas/example/schemas/string.json ./schemas/example/v2.0 ./schemas/example/v2.0/schema.json +./search.json