Skip to content
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
7 changes: 7 additions & 0 deletions pj_marketplace/include/pj_marketplace/registry_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ class RegistryManager : public QObject {
// Returns the parsed extensions after a successful fetch; empty list otherwise.
QList<Extension> extensions() const;

// Same as extensions(), but drops entries whose `platforms` map has no
// artifact for `platform` (e.g. "linux-x86_64"). Use this for catalog
// views — installation would fail anyway for the dropped entries (see
// ExtensionManager::doInstall). The platform key is injected by the
// caller so RegistryManager stays independent of host detection.
QList<Extension> compatibleExtensions(const QString& platform) const;

// Returns the first extension whose id matches, or a default-constructed Extension
// (id is empty) when not found.
Extension findById(const QString& id) const;
Expand Down
11 changes: 11 additions & 0 deletions pj_marketplace/src/core/RegistryManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,17 @@ QList<Extension> RegistryManager::extensions() const {
return extensions_;
}

QList<Extension> RegistryManager::compatibleExtensions(const QString& platform) const {
QList<Extension> result;
result.reserve(extensions_.size());
for (const Extension& ext : extensions_) {
if (ext.platforms.contains(platform)) {
result.append(ext);
}
}
return result;
}

Extension RegistryManager::findById(const QString& id) const {
for (const Extension& ext : extensions_) {
if (ext.id == id) {
Expand Down
2 changes: 1 addition & 1 deletion pj_marketplace/src/ui/marketplace_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ void MarketplaceWindow::setupSignals() {
// A successful refresh is a strong "things are working" signal; let it
// override any old sticky error so progress messages aren't suppressed.
clearStickyStatus();
extensions_ = registry_mgr_->extensions();
extensions_ = registry_mgr_->compatibleExtensions(PlatformUtils::currentPlatform());
applyFilters();
setStatus("Ready — " + QString::number(extensions_.size()) + " extensions loaded");
});
Expand Down
42 changes: 42 additions & 0 deletions pj_marketplace/tests/registry_manager_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,48 @@ TEST_F(RegistryManagerTest, ParsesPlatformArtifacts) {
EXPECT_EQ(platforms["windows-x86_64"].url, "https://example.com/csv-loader-win.dll");
}

// compatibleExtensions(platform) returns only entries whose `platforms` map
// contains the requested key, while extensions() stays untouched.
TEST_F(RegistryManagerTest, CompatibleExtensionsFiltersByRequestedPlatform) {
static const QByteArray kMixedPlatformsJson = R"({
"extensions": [
{ "id": "linux-only", "name": "Linux Only", "version": "1.0.0",
"platforms": { "linux-x86_64": { "url": "u1", "checksum": "sha256:1" } } },
{ "id": "windows-only", "name": "Windows Only", "version": "1.0.0",
"platforms": { "windows-x86_64": { "url": "u2", "checksum": "sha256:2" } } },
{ "id": "cross", "name": "Cross", "version": "1.0.0",
"platforms": {
"linux-x86_64": { "url": "u3", "checksum": "sha256:3" },
"windows-x86_64": { "url": "u4", "checksum": "sha256:4" }
}
}
]
})";

RegistryManager mgr;
QSignalSpy spy_finished(&mgr, &RegistryManager::fetchFinished);

server_->setResponseBody(kMixedPlatformsJson);
mgr.fetchRegistry(server_->url());
ASSERT_TRUE(spy_finished.wait(3000));

// extensions() returns the parsed list verbatim, regardless of platform.
EXPECT_EQ(mgr.extensions().size(), 3);

const QList<Extension> linux_compat = mgr.compatibleExtensions("linux-x86_64");
ASSERT_EQ(linux_compat.size(), 2);
EXPECT_EQ(linux_compat.at(0).id, "linux-only");
EXPECT_EQ(linux_compat.at(1).id, "cross");

const QList<Extension> win_compat = mgr.compatibleExtensions("windows-x86_64");
ASSERT_EQ(win_compat.size(), 2);
EXPECT_EQ(win_compat.at(0).id, "windows-only");
EXPECT_EQ(win_compat.at(1).id, "cross");

// Unknown platform key drops everything.
EXPECT_TRUE(mgr.compatibleExtensions("imaginary-os-arch").isEmpty());
}

// [2] Changelog map (version -> description)
TEST_F(RegistryManagerTest, ParsesChangelog) {
RegistryManager mgr;
Expand Down
Loading