From c9c86fa9f2dd61b66e251b6ac5aede2ce09693ca Mon Sep 17 00:00:00 2001 From: Iuri Matias Date: Fri, 27 Mar 2026 12:14:48 -0400 Subject: [PATCH] move from Qt JSON to nlohmann_json --- CMakeLists.txt | 3 ++ nix/default.nix | 1 + src/CMakeLists.txt | 1 + src/logos_core/dependency_resolver.cpp | 19 +++++------ src/logos_core/dependency_resolver.h | 4 +-- src/logos_core/plugin_manager.h | 1 - src/logos_core/plugin_registry.cpp | 42 ++++++++++++++++++------ src/logos_core/plugin_registry.h | 8 ++--- tests/test_plugin_manager.cpp | 45 +++++++++++--------------- tests/test_process_stats.cpp | 32 +++++++----------- 10 files changed, 81 insertions(+), 75 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df8e9ee..1365570 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,9 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core RemoteObjects) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core RemoteObjects) +# Find nlohmann_json +find_package(nlohmann_json REQUIRED) + # Set output directories set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) diff --git a/nix/default.nix b/nix/default.nix index 000e09b..15395cc 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -19,6 +19,7 @@ pkgs.qt6.qtremoteobjects pkgs.zstd pkgs.gtest + pkgs.nlohmann_json logosModule processStats logosPackageManager diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8ee1ae5..539928b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -158,6 +158,7 @@ target_link_libraries(logos_core PUBLIC logos_module process_stats package_manager_lib + nlohmann_json::nlohmann_json ) # Include directories for the library diff --git a/src/logos_core/dependency_resolver.cpp b/src/logos_core/dependency_resolver.cpp index 31b62cd..f31dc63 100644 --- a/src/logos_core/dependency_resolver.cpp +++ b/src/logos_core/dependency_resolver.cpp @@ -1,6 +1,5 @@ #include "dependency_resolver.h" #include -#include #include #include @@ -29,11 +28,10 @@ namespace DependencyResolver { modulesToLoad.insert(moduleName); - QJsonObject metadata = getMetadata(moduleName); - if (!metadata.isEmpty()) { - QJsonArray deps = metadata.value("dependencies").toArray(); - for (const QJsonValue& dep : deps) { - QString depName = dep.toString(); + nlohmann::json metadata = getMetadata(moduleName); + if (metadata.is_object() && metadata.contains("dependencies")) { + for (const auto& dep : metadata["dependencies"]) { + QString depName = QString::fromStdString(dep.get()); if (!depName.isEmpty() && !modulesToLoad.contains(depName)) { queue.append(depName); } @@ -54,11 +52,10 @@ namespace DependencyResolver { inDegree[moduleName] = 0; } - QJsonObject metadata = getMetadata(moduleName); - if (!metadata.isEmpty()) { - QJsonArray deps = metadata.value("dependencies").toArray(); - for (const QJsonValue& dep : deps) { - QString depName = dep.toString(); + nlohmann::json metadata = getMetadata(moduleName); + if (metadata.is_object() && metadata.contains("dependencies")) { + for (const auto& dep : metadata["dependencies"]) { + QString depName = QString::fromStdString(dep.get()); if (!depName.isEmpty() && modulesToLoad.contains(depName)) { inDegree[moduleName]++; dependents[depName].append(moduleName); diff --git a/src/logos_core/dependency_resolver.h b/src/logos_core/dependency_resolver.h index 8edcbe0..a896266 100644 --- a/src/logos_core/dependency_resolver.h +++ b/src/logos_core/dependency_resolver.h @@ -3,13 +3,13 @@ #include #include -#include +#include #include namespace DependencyResolver { using IsKnownFn = std::function; - using GetMetadataFn = std::function; + using GetMetadataFn = std::function; QStringList resolve(const QStringList& requested, IsKnownFn isKnown, diff --git a/src/logos_core/plugin_manager.h b/src/logos_core/plugin_manager.h index 4d8af93..cdc5cb1 100644 --- a/src/logos_core/plugin_manager.h +++ b/src/logos_core/plugin_manager.h @@ -4,7 +4,6 @@ #include #include #include -#include class PluginRegistry; diff --git a/src/logos_core/plugin_registry.cpp b/src/logos_core/plugin_registry.cpp index f8a82ce..e226525 100644 --- a/src/logos_core/plugin_registry.cpp +++ b/src/logos_core/plugin_registry.cpp @@ -1,14 +1,37 @@ #include "plugin_registry.h" #include #include -#include +#include #include +#include #include #include #include using namespace ModuleLib; +static nlohmann::json qjsonToNlohmann(const QJsonValue& val) { + switch (val.type()) { + case QJsonValue::Bool: return val.toBool(); + case QJsonValue::Double: return val.toDouble(); + case QJsonValue::String: return val.toString().toStdString(); + case QJsonValue::Array: { + nlohmann::json arr = nlohmann::json::array(); + for (const QJsonValue& v : val.toArray()) + arr.push_back(qjsonToNlohmann(v)); + return arr; + } + case QJsonValue::Object: { + nlohmann::json obj = nlohmann::json::object(); + QJsonObject qobj = val.toObject(); + for (auto it = qobj.begin(); it != qobj.end(); ++it) + obj[it.key().toStdString()] = qjsonToNlohmann(it.value()); + return obj; + } + default: return nullptr; + } +} + static PackageManagerLib& packageManagerInstance() { static PackageManagerLib instance; return instance; @@ -40,13 +63,12 @@ void PluginRegistry::discoverInstalledModules() { } std::string jsonStr = pm.getInstalledModules(); - QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(jsonStr)); - QJsonArray modules = doc.array(); + nlohmann::json modules = nlohmann::json::parse(jsonStr, nullptr, false); + if (!modules.is_array()) return; - for (const QJsonValue& val : modules) { - QJsonObject mod = val.toObject(); - QString name = mod.value("name").toString(); - QString mainFilePath = mod.value("mainFilePath").toString(); + for (const auto& mod : modules) { + QString name = QString::fromStdString(mod.value("name", "")); + QString mainFilePath = QString::fromStdString(mod.value("mainFilePath", "")); if (name.isEmpty() || mainFilePath.isEmpty()) continue; @@ -77,7 +99,7 @@ QString PluginRegistry::processPlugin(const QString& pluginPath) { } m_knownPlugins.insert(metadata.name, pluginPath); - m_pluginMetadata.insert(metadata.name, metadata.rawMetadata); + m_pluginMetadata.insert(metadata.name, qjsonToNlohmann(QJsonValue(metadata.rawMetadata))); return metadata.name; } @@ -90,7 +112,7 @@ QString PluginRegistry::pluginPath(const QString& name) const { return m_knownPlugins.value(name); } -QJsonObject PluginRegistry::pluginMetadata(const QString& name) const { +nlohmann::json PluginRegistry::pluginMetadata(const QString& name) const { return m_pluginMetadata.value(name); } @@ -102,7 +124,7 @@ void PluginRegistry::registerPlugin(const QString& name, const QString& path) { m_knownPlugins.insert(name, path); } -void PluginRegistry::registerMetadata(const QString& name, const QJsonObject& metadata) { +void PluginRegistry::registerMetadata(const QString& name, const nlohmann::json& metadata) { m_pluginMetadata.insert(name, metadata); } diff --git a/src/logos_core/plugin_registry.h b/src/logos_core/plugin_registry.h index af04fad..f8977ba 100644 --- a/src/logos_core/plugin_registry.h +++ b/src/logos_core/plugin_registry.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include class PluginRegistry { public: @@ -17,10 +17,10 @@ public: bool isKnown(const QString& name) const; QString pluginPath(const QString& name) const; - QJsonObject pluginMetadata(const QString& name) const; + nlohmann::json pluginMetadata(const QString& name) const; QStringList knownPluginNames() const; void registerPlugin(const QString& name, const QString& path); - void registerMetadata(const QString& name, const QJsonObject& metadata); + void registerMetadata(const QString& name, const nlohmann::json& metadata); bool isLoaded(const QString& name) const; void markLoaded(const QString& name); @@ -33,7 +33,7 @@ public: private: QStringList m_pluginsDirs; QHash m_knownPlugins; - QHash m_pluginMetadata; + QHash m_pluginMetadata; QStringList m_loadedPlugins; }; diff --git a/tests/test_plugin_manager.cpp b/tests/test_plugin_manager.cpp index 11bc5d7..dae40e1 100644 --- a/tests/test_plugin_manager.cpp +++ b/tests/test_plugin_manager.cpp @@ -3,11 +3,9 @@ #include "plugin_registry.h" #include "logos_core.h" #include -#include -#include -#include #include #include +#include #include #include @@ -144,9 +142,9 @@ TEST_F(PluginManagerTest, ResolveDependencies_ReturnsEmptyForUnknownPlugin) { TEST_F(PluginManagerTest, ResolveDependencies_ReturnsSinglePluginWithNoDeps) { PluginManager::registry().registerPlugin("plugin_a", "/path/to/plugin_a"); - QJsonObject metadata; + nlohmann::json metadata; metadata["name"] = "plugin_a"; - metadata["dependencies"] = QJsonArray(); + metadata["dependencies"] = nlohmann::json::array(); PluginManager::registry().registerMetadata("plugin_a", metadata); QStringList requested; @@ -162,16 +160,14 @@ TEST_F(PluginManagerTest, ResolveDependencies_ReturnsCorrectOrder) { PluginManager::registry().registerPlugin("plugin_a", "/path/to/plugin_a"); PluginManager::registry().registerPlugin("plugin_b", "/path/to/plugin_b"); - QJsonObject metadataA; + nlohmann::json metadataA; metadataA["name"] = "plugin_a"; - QJsonArray depsA; - depsA.append("plugin_b"); - metadataA["dependencies"] = depsA; + metadataA["dependencies"] = nlohmann::json::array({"plugin_b"}); PluginManager::registry().registerMetadata("plugin_a", metadataA); - QJsonObject metadataB; + nlohmann::json metadataB; metadataB["name"] = "plugin_b"; - metadataB["dependencies"] = QJsonArray(); + metadataB["dependencies"] = nlohmann::json::array(); PluginManager::registry().registerMetadata("plugin_b", metadataB); QStringList requested; @@ -189,23 +185,19 @@ TEST_F(PluginManagerTest, ResolveDependencies_HandlesTransitiveDeps) { PluginManager::registry().registerPlugin("plugin_b", "/path/to/plugin_b"); PluginManager::registry().registerPlugin("plugin_c", "/path/to/plugin_c"); - QJsonObject metadataA; + nlohmann::json metadataA; metadataA["name"] = "plugin_a"; - QJsonArray depsA; - depsA.append("plugin_b"); - metadataA["dependencies"] = depsA; + metadataA["dependencies"] = nlohmann::json::array({"plugin_b"}); PluginManager::registry().registerMetadata("plugin_a", metadataA); - QJsonObject metadataB; + nlohmann::json metadataB; metadataB["name"] = "plugin_b"; - QJsonArray depsB; - depsB.append("plugin_c"); - metadataB["dependencies"] = depsB; + metadataB["dependencies"] = nlohmann::json::array({"plugin_c"}); PluginManager::registry().registerMetadata("plugin_b", metadataB); - QJsonObject metadataC; + nlohmann::json metadataC; metadataC["name"] = "plugin_c"; - metadataC["dependencies"] = QJsonArray(); + metadataC["dependencies"] = nlohmann::json::array(); PluginManager::registry().registerMetadata("plugin_c", metadataC); QStringList requested; @@ -270,17 +262,16 @@ static void createFakeModule(const QString& parentDir, QDir dir(parentDir); dir.mkpath(moduleName); - QJsonObject manifest; - manifest["name"] = moduleName; + nlohmann::json manifest; + manifest["name"] = moduleName.toStdString(); manifest["version"] = "1.0.0"; - manifest["type"] = type; - manifest["main"] = mainFile; + manifest["type"] = type.toStdString(); + manifest["main"] = mainFile.toStdString(); manifest["description"] = "Fake test module"; QString manifestPath = dir.filePath(moduleName + "/manifest.json"); std::ofstream mf(manifestPath.toStdString()); - QJsonDocument doc(manifest); - mf << doc.toJson().toStdString(); + mf << manifest.dump(); mf.close(); QString binaryPath = dir.filePath(moduleName + "/" + mainFile); diff --git a/tests/test_process_stats.cpp b/tests/test_process_stats.cpp index 3d015f6..0d56345 100644 --- a/tests/test_process_stats.cpp +++ b/tests/test_process_stats.cpp @@ -2,9 +2,7 @@ #include #include #include -#include -#include -#include +#include #include #include @@ -117,13 +115,10 @@ TEST_F(ProcessStatsTest, GetModuleStats_ReturnsEmptyArrayWhenNoPlugins) { ASSERT_NE(result, nullptr); - QByteArray jsonData(result); - QJsonDocument doc = QJsonDocument::fromJson(jsonData); + nlohmann::json doc = nlohmann::json::parse(result); - EXPECT_TRUE(doc.isArray()); - - QJsonArray modulesArray = doc.array(); - EXPECT_EQ(modulesArray.size(), 0); + EXPECT_TRUE(doc.is_array()); + EXPECT_EQ(doc.size(), 0); delete[] result; } @@ -155,24 +150,21 @@ TEST_F(ProcessStatsTest, GetModuleStats_ReturnsValidJsonStructure) { ASSERT_NE(result, nullptr); - QByteArray jsonData(result); - QJsonDocument doc = QJsonDocument::fromJson(jsonData); + nlohmann::json doc = nlohmann::json::parse(result); - EXPECT_TRUE(doc.isArray()); + EXPECT_TRUE(doc.is_array()); + ASSERT_EQ(doc.size(), 1); - QJsonArray modulesArray = doc.array(); - ASSERT_EQ(modulesArray.size(), 1); - - QJsonObject moduleObj = modulesArray[0].toObject(); + auto moduleObj = doc[0]; EXPECT_TRUE(moduleObj.contains("name")); EXPECT_TRUE(moduleObj.contains("cpu_percent")); EXPECT_TRUE(moduleObj.contains("cpu_time_seconds")); EXPECT_TRUE(moduleObj.contains("memory_mb")); - EXPECT_EQ(moduleObj["name"].toString().toStdString(), "test_plugin"); - EXPECT_GE(moduleObj["cpu_percent"].toDouble(), 0.0); - EXPECT_GE(moduleObj["cpu_time_seconds"].toDouble(), 0.0); - EXPECT_GE(moduleObj["memory_mb"].toDouble(), 0.0); + EXPECT_EQ(moduleObj["name"].get(), "test_plugin"); + EXPECT_GE(moduleObj["cpu_percent"].get(), 0.0); + EXPECT_GE(moduleObj["cpu_time_seconds"].get(), 0.0); + EXPECT_GE(moduleObj["memory_mb"].get(), 0.0); delete[] result; }