mirror of
https://github.com/loot/libloot-python.git
synced 2026-07-27 14:14:13 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
abbc0892fd | ||
|
|
a94fb19bde | ||
|
|
2823db915a |
+7
-5
@@ -30,9 +30,9 @@ configure_file("${CMAKE_SOURCE_DIR}/src/wrapper_version.cpp.in" "${CMAKE_BINARY_
|
|||||||
# pybind11
|
# pybind11
|
||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
set(PYBIND11_URL "https://github.com/pybind/pybind11/archive/v1.8.1.tar.gz")
|
set(PYBIND11_URL "https://github.com/pybind/pybind11/archive/v2.1.1.tar.gz")
|
||||||
set(PYBIND11_DOWNLOAD_PATH "${EXTERNAL_PROJECTS_PATH}/pybind11-1.8.1.tar.gz")
|
set(PYBIND11_DOWNLOAD_PATH "${EXTERNAL_PROJECTS_PATH}/pybind11-2.1.1.tar.gz")
|
||||||
set(PYBIND11_EXTRACTED_PATH "${EXTERNAL_PROJECTS_PATH}/pybind11-1.8.1")
|
set(PYBIND11_EXTRACTED_PATH "${EXTERNAL_PROJECTS_PATH}/pybind11-2.1.1")
|
||||||
|
|
||||||
if (NOT EXISTS ${PYBIND11_DOWNLOAD_PATH})
|
if (NOT EXISTS ${PYBIND11_DOWNLOAD_PATH})
|
||||||
file(DOWNLOAD ${PYBIND11_URL} ${PYBIND11_DOWNLOAD_PATH})
|
file(DOWNLOAD ${PYBIND11_URL} ${PYBIND11_DOWNLOAD_PATH})
|
||||||
@@ -51,7 +51,7 @@ add_subdirectory(${PYBIND11_EXTRACTED_PATH})
|
|||||||
|
|
||||||
ExternalProject_Add(loot-api-c++
|
ExternalProject_Add(loot-api-c++
|
||||||
PREFIX "external"
|
PREFIX "external"
|
||||||
URL "https://github.com/loot/loot/releases/download/0.10.2/loot-api_0.10.2-0-g9eb7d26_dev.7z"
|
URL "https://github.com/loot/loot-api/releases/download/0.11.0/loot_api-0.11.0-0-g8864f78_dev-win32.7z"
|
||||||
CONFIGURE_COMMAND ""
|
CONFIGURE_COMMAND ""
|
||||||
BUILD_COMMAND ""
|
BUILD_COMMAND ""
|
||||||
INSTALL_COMMAND "")
|
INSTALL_COMMAND "")
|
||||||
@@ -79,7 +79,9 @@ ExternalProject_Add(test-masterlist
|
|||||||
# Python Module
|
# Python Module
|
||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
pybind11_add_module(loot_api "${CMAKE_SOURCE_DIR}/src/main.cpp" "${CMAKE_BINARY_DIR}/generated/wrapper_version.cpp")
|
pybind11_add_module(loot_api "${CMAKE_SOURCE_DIR}/src/main.cpp"
|
||||||
|
"${CMAKE_SOURCE_DIR}/src/convenience.cpp"
|
||||||
|
"${CMAKE_BINARY_DIR}/generated/wrapper_version.cpp")
|
||||||
|
|
||||||
add_dependencies(loot_api loot-api-c++ test-masterlist)
|
add_dependencies(loot_api loot-api-c++ test-masterlist)
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ LOOT API Python Module
|
|||||||
[](https://travis-ci.org/loot/loot-api-python)
|
[](https://travis-ci.org/loot/loot-api-python)
|
||||||
[](http://loot-api-python.readthedocs.io/)
|
[](http://loot-api-python.readthedocs.io/)
|
||||||
|
|
||||||
A Python module that wraps the LOOT API, generated by [pybind11](https://github.com/pybind/pybind11).
|
A Python module that wraps the LOOT API, generated by [pybind11](https://github.com/pybind/pybind11). Not everything in the API is exposed: coverage can be extended on request (or by pull request).
|
||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
/* LOOT
|
||||||
|
|
||||||
|
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
|
||||||
|
Fallout: New Vegas.
|
||||||
|
|
||||||
|
Copyright (C) 2014-2017 Oliver Hamlet
|
||||||
|
|
||||||
|
This file is part of LOOT.
|
||||||
|
|
||||||
|
LOOT is free software: you can redistribute
|
||||||
|
it and/or modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation, either version 3 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
LOOT is distributed in the hope that it will
|
||||||
|
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LOOT. If not, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "convenience.h"
|
||||||
|
|
||||||
|
#include <loot/api.h>
|
||||||
|
|
||||||
|
namespace loot {
|
||||||
|
std::shared_ptr<DatabaseInterface> CreateDatabase(const GameType game, const std::string & game_path, const std::string & game_local_path) {
|
||||||
|
auto gameHandle = CreateGameHandle(game, game_path, game_local_path);
|
||||||
|
|
||||||
|
return gameHandle->GetDatabase();
|
||||||
|
}
|
||||||
|
PluginTags GetPluginTags(const std::shared_ptr<DatabaseInterface> db, const std::string& plugin) {
|
||||||
|
PluginTags tags;
|
||||||
|
|
||||||
|
auto metadata = db->GetPluginMetadata(plugin, false, false);
|
||||||
|
for (const auto &tag : metadata.GetTags()) {
|
||||||
|
if (tag.IsAddition())
|
||||||
|
tags.added.insert(tag.GetName());
|
||||||
|
else
|
||||||
|
tags.removed.insert(tag.GetName());
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = db->GetPluginUserMetadata(plugin, false);
|
||||||
|
tags.userlist_modified = !metadata.GetTags().empty();
|
||||||
|
for (const auto &tag : metadata.GetTags()) {
|
||||||
|
if (tag.IsAddition())
|
||||||
|
tags.added.insert(tag.GetName());
|
||||||
|
else
|
||||||
|
tags.removed.insert(tag.GetName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginCleanliness GetPluginCleanliness(const std::shared_ptr<DatabaseInterface> db, const std::string& plugin) {
|
||||||
|
auto metadata = db->GetPluginMetadata(plugin, true, false);
|
||||||
|
|
||||||
|
if (metadata.GetDirtyInfo().empty()) {
|
||||||
|
if (metadata.GetCleanInfo().empty()) {
|
||||||
|
return PluginCleanliness::unknown;
|
||||||
|
} else {
|
||||||
|
return PluginCleanliness::clean;
|
||||||
|
}
|
||||||
|
} else if (!metadata.GetCleanInfo().empty()) {
|
||||||
|
return PluginCleanliness::unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& info : metadata.GetDirtyInfo()) {
|
||||||
|
if (info.ChooseInfo("en").GetText().find("Do not clean") != std::string::npos) {
|
||||||
|
return PluginCleanliness::do_not_clean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PluginCleanliness::unknown;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/* LOOT
|
||||||
|
|
||||||
|
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
|
||||||
|
Fallout: New Vegas.
|
||||||
|
|
||||||
|
Copyright (C) 2014-2017 Oliver Hamlet
|
||||||
|
|
||||||
|
This file is part of LOOT.
|
||||||
|
|
||||||
|
LOOT is free software: you can redistribute
|
||||||
|
it and/or modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation, either version 3 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
LOOT is distributed in the hope that it will
|
||||||
|
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LOOT. If not, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LOOT_API_PYTHON_CONVENIENCE
|
||||||
|
#define LOOT_API_PYTHON_CONVENIENCE
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include <loot/enum/game_type.h>
|
||||||
|
#include <loot/database_interface.h>
|
||||||
|
|
||||||
|
#include "plugin_cleanliness.h"
|
||||||
|
#include "plugin_tags.h"
|
||||||
|
|
||||||
|
namespace loot {
|
||||||
|
std::shared_ptr<DatabaseInterface> CreateDatabase(const GameType game,
|
||||||
|
const std::string& game_path = "",
|
||||||
|
const std::string& game_local_path = "");
|
||||||
|
|
||||||
|
PluginTags GetPluginTags(const std::shared_ptr<DatabaseInterface> db, const std::string& plugin);
|
||||||
|
|
||||||
|
PluginCleanliness GetPluginCleanliness(const std::shared_ptr<DatabaseInterface> db, const std::string& plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
+51
-41
@@ -26,32 +26,16 @@
|
|||||||
#include <pybind11/pybind11.h>
|
#include <pybind11/pybind11.h>
|
||||||
#include <pybind11/stl.h>
|
#include <pybind11/stl.h>
|
||||||
|
|
||||||
|
#include "convenience.h"
|
||||||
#include "wrapper_version.h"
|
#include "wrapper_version.h"
|
||||||
|
|
||||||
PYBIND11_DECLARE_HOLDER_TYPE(T, std::shared_ptr<T>);
|
|
||||||
|
|
||||||
PYBIND11_PLUGIN(loot_api) {
|
|
||||||
using loot::CreateDatabase;
|
|
||||||
using loot::DatabaseInterface;
|
|
||||||
using loot::IsCompatible;
|
|
||||||
using loot::GameType;
|
|
||||||
using loot::LanguageCode;
|
|
||||||
using loot::LootVersion;
|
|
||||||
using loot::MessageType;
|
|
||||||
using loot::MasterlistInfo;
|
|
||||||
using loot::PluginCleanliness;
|
|
||||||
using loot::SimpleMessage;
|
|
||||||
using loot::PluginTags;
|
|
||||||
using loot::WrapperVersion;
|
|
||||||
|
|
||||||
using pybind11::arg;
|
using pybind11::arg;
|
||||||
using pybind11::enum_;
|
using pybind11::enum_;
|
||||||
using pybind11::class_;
|
using pybind11::class_;
|
||||||
|
using pybind11::metaclass;
|
||||||
|
|
||||||
const std::string emptyString;
|
namespace loot {
|
||||||
|
void bindEnums(pybind11::module& module) {
|
||||||
pybind11::module module("loot_api", "A Python module that wraps the LOOT API, generated by pybind11.");
|
|
||||||
|
|
||||||
enum_<GameType>(module, "GameType")
|
enum_<GameType>(module, "GameType")
|
||||||
.value("tes4", GameType::tes4)
|
.value("tes4", GameType::tes4)
|
||||||
.value("tes5", GameType::tes5)
|
.value("tes5", GameType::tes5)
|
||||||
@@ -60,18 +44,10 @@ PYBIND11_PLUGIN(loot_api) {
|
|||||||
.value("fonv", GameType::fonv)
|
.value("fonv", GameType::fonv)
|
||||||
.value("fo4", GameType::fo4);
|
.value("fo4", GameType::fo4);
|
||||||
|
|
||||||
enum_<LanguageCode>(module, "LanguageCode")
|
enum_<LogVerbosity>(module, "LogVerbosity")
|
||||||
.value("english", LanguageCode::english)
|
.value("off", LogVerbosity::off)
|
||||||
.value("spanish", LanguageCode::spanish)
|
.value("trace", LogVerbosity::trace)
|
||||||
.value("russian", LanguageCode::russian)
|
.value("warning", LogVerbosity::warning);
|
||||||
.value("french", LanguageCode::french)
|
|
||||||
.value("chinese", LanguageCode::chinese)
|
|
||||||
.value("polish", LanguageCode::polish)
|
|
||||||
.value("brazilian_portuguese", LanguageCode::brazilian_portuguese)
|
|
||||||
.value("finnish", LanguageCode::finnish)
|
|
||||||
.value("german", LanguageCode::german)
|
|
||||||
.value("danish", LanguageCode::danish)
|
|
||||||
.value("korean", LanguageCode::korean);
|
|
||||||
|
|
||||||
enum_<MessageType>(module, "MessageType")
|
enum_<MessageType>(module, "MessageType")
|
||||||
.value("say", MessageType::say)
|
.value("say", MessageType::say)
|
||||||
@@ -83,13 +59,15 @@ PYBIND11_PLUGIN(loot_api) {
|
|||||||
.value("dirty", PluginCleanliness::dirty)
|
.value("dirty", PluginCleanliness::dirty)
|
||||||
.value("do_not_clean", PluginCleanliness::do_not_clean)
|
.value("do_not_clean", PluginCleanliness::do_not_clean)
|
||||||
.value("unknown", PluginCleanliness::unknown);
|
.value("unknown", PluginCleanliness::unknown);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bindMetadataClasses(pybind11::module& module) {
|
||||||
class_<MasterlistInfo>(module, "MasterlistInfo")
|
class_<MasterlistInfo>(module, "MasterlistInfo")
|
||||||
.def_readwrite("revision_id", &MasterlistInfo::revision_id)
|
.def_readwrite("revision_id", &MasterlistInfo::revision_id)
|
||||||
.def_readwrite("revision_date", &MasterlistInfo::revision_date)
|
.def_readwrite("revision_date", &MasterlistInfo::revision_date)
|
||||||
.def_readwrite("is_modified", &MasterlistInfo::is_modified);
|
.def_readwrite("is_modified", &MasterlistInfo::is_modified);
|
||||||
|
|
||||||
class_<SimpleMessage>(module, "Message")
|
class_<SimpleMessage>(module, "SimpleMessage")
|
||||||
.def_readwrite("type", &SimpleMessage::type)
|
.def_readwrite("type", &SimpleMessage::type)
|
||||||
.def_readwrite("language", &SimpleMessage::language)
|
.def_readwrite("language", &SimpleMessage::language)
|
||||||
.def_readwrite("text", &SimpleMessage::text);
|
.def_readwrite("text", &SimpleMessage::text);
|
||||||
@@ -99,34 +77,66 @@ PYBIND11_PLUGIN(loot_api) {
|
|||||||
.def_readwrite("removed", &PluginTags::removed)
|
.def_readwrite("removed", &PluginTags::removed)
|
||||||
.def_readwrite("userlist_modified", &PluginTags::userlist_modified);
|
.def_readwrite("userlist_modified", &PluginTags::userlist_modified);
|
||||||
|
|
||||||
class_<LootVersion>(module, "Version")
|
class_<PluginMetadata>(module, "PluginMetadata")
|
||||||
|
.def("get_simple_messages", &PluginMetadata::GetSimpleMessages);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bindVersionClasses(pybind11::module& module) {
|
||||||
|
class_<LootVersion>(module, "Version", metaclass())
|
||||||
.def_readonly_static("major", &LootVersion::major)
|
.def_readonly_static("major", &LootVersion::major)
|
||||||
.def_readonly_static("minor", &LootVersion::minor)
|
.def_readonly_static("minor", &LootVersion::minor)
|
||||||
.def_readonly_static("patch", &LootVersion::patch)
|
.def_readonly_static("patch", &LootVersion::patch)
|
||||||
.def_readonly_static("revision", &LootVersion::revision)
|
.def_readonly_static("revision", &LootVersion::revision)
|
||||||
.def_static("string", LootVersion::string);
|
.def_static("string", LootVersion::string);
|
||||||
|
|
||||||
class_<WrapperVersion>(module, "WrapperVersion")
|
class_<WrapperVersion>(module, "WrapperVersion", metaclass())
|
||||||
.def_readonly_static("major", &WrapperVersion::major)
|
.def_readonly_static("major", &WrapperVersion::major)
|
||||||
.def_readonly_static("minor", &WrapperVersion::minor)
|
.def_readonly_static("minor", &WrapperVersion::minor)
|
||||||
.def_readonly_static("patch", &WrapperVersion::patch)
|
.def_readonly_static("patch", &WrapperVersion::patch)
|
||||||
.def_readonly_static("revision", &WrapperVersion::revision)
|
.def_readonly_static("revision", &WrapperVersion::revision)
|
||||||
.def_static("string", WrapperVersion::string);
|
.def_static("string", WrapperVersion::string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bindInterfaceClasses(pybind11::module& module) {
|
||||||
class_<DatabaseInterface, std::shared_ptr<DatabaseInterface>>(module, "DatabaseInterface")
|
class_<DatabaseInterface, std::shared_ptr<DatabaseInterface>>(module, "DatabaseInterface")
|
||||||
.def("load_lists", &DatabaseInterface::LoadLists, arg("masterlist_path"), arg("userlist_path") = emptyString)
|
.def("load_lists", &DatabaseInterface::LoadLists, arg("masterlist_path"), arg("userlist_path") = "")
|
||||||
.def("eval_lists", &DatabaseInterface::EvalLists)
|
.def("eval_lists", &DatabaseInterface::EvalLists)
|
||||||
.def("sort_plugins", &DatabaseInterface::SortPlugins)
|
|
||||||
.def("update_masterlist", &DatabaseInterface::UpdateMasterlist)
|
.def("update_masterlist", &DatabaseInterface::UpdateMasterlist)
|
||||||
.def("get_masterlist_revision", &DatabaseInterface::GetMasterlistRevision)
|
.def("get_masterlist_revision", &DatabaseInterface::GetMasterlistRevision)
|
||||||
.def("get_plugin_tags", &DatabaseInterface::GetPluginTags)
|
.def("get_plugin_metadata", &DatabaseInterface::GetPluginMetadata,
|
||||||
.def("get_plugin_messages", &DatabaseInterface::GetPluginMessages)
|
arg("plugin"),
|
||||||
.def("get_plugin_cleanliness", &DatabaseInterface::GetPluginCleanliness)
|
arg("includeUserMetadata") = true,
|
||||||
|
arg("evaluateConditions") = false)
|
||||||
|
.def("get_plugin_tags", &GetPluginTags)
|
||||||
|
.def("get_plugin_cleanliness", &GetPluginCleanliness)
|
||||||
.def("write_minimal_list", &DatabaseInterface::WriteMinimalList);
|
.def("write_minimal_list", &DatabaseInterface::WriteMinimalList);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bindClasses(pybind11::module& module) {
|
||||||
|
bindMetadataClasses(module);
|
||||||
|
bindVersionClasses(module);
|
||||||
|
bindInterfaceClasses(module);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bindFunctions(pybind11::module& module) {
|
||||||
|
module.def("set_logging_verbosity", &SetLoggingVerbosity);
|
||||||
|
|
||||||
|
module.def("set_log_file", &SetLogFile);
|
||||||
|
|
||||||
module.def("is_compatible", &IsCompatible);
|
module.def("is_compatible", &IsCompatible);
|
||||||
|
|
||||||
module.def("create_database", &CreateDatabase, arg("game"), arg("game_path") = emptyString, arg("game_local_path") = emptyString);
|
module.def("initialise_locale", &InitialiseLocale);
|
||||||
|
|
||||||
|
module.def("create_database", &CreateDatabase, arg("game"), arg("game_path") = "", arg("game_local_path") = "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PYBIND11_PLUGIN(loot_api) {
|
||||||
|
pybind11::module module("loot_api", "A Python module that wraps the LOOT API, generated by pybind11.");
|
||||||
|
|
||||||
|
loot::bindEnums(module);
|
||||||
|
loot::bindClasses(module);
|
||||||
|
loot::bindFunctions(module);
|
||||||
|
|
||||||
return module.ptr();
|
return module.ptr();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/* LOOT
|
||||||
|
|
||||||
|
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
|
||||||
|
Fallout: New Vegas.
|
||||||
|
|
||||||
|
Copyright (C) 2012-2016 WrinklyNinja
|
||||||
|
|
||||||
|
This file is part of LOOT.
|
||||||
|
|
||||||
|
LOOT is free software: you can redistribute
|
||||||
|
it and/or modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation, either version 3 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
LOOT is distributed in the hope that it will
|
||||||
|
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LOOT. If not, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef LOOT_PLUGIN_CLEANLINESS
|
||||||
|
#define LOOT_PLUGIN_CLEANLINESS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The namespace used by the LOOT API.
|
||||||
|
*/
|
||||||
|
namespace loot {
|
||||||
|
/**
|
||||||
|
* @brief Codes used to indicate the cleanliness of a plugin according to the
|
||||||
|
* information contained within the loaded masterlist/userlist.
|
||||||
|
*/
|
||||||
|
enum struct PluginCleanliness : unsigned int {
|
||||||
|
/** Indicates that the plugin is clean. */
|
||||||
|
clean,
|
||||||
|
/** Indicates that the plugin is dirty. */
|
||||||
|
dirty,
|
||||||
|
/**
|
||||||
|
* Indicates that the plugin contains dirty edits, but that they are
|
||||||
|
* part of the plugin's intended functionality and should not be removed.
|
||||||
|
*/
|
||||||
|
do_not_clean,
|
||||||
|
/**
|
||||||
|
* Indicates that no data is available on whether the plugin is dirty or not.
|
||||||
|
*/
|
||||||
|
unknown,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/* LOOT
|
||||||
|
|
||||||
|
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
|
||||||
|
Fallout: New Vegas.
|
||||||
|
|
||||||
|
Copyright (C) 2012-2016 WrinklyNinja
|
||||||
|
|
||||||
|
This file is part of LOOT.
|
||||||
|
|
||||||
|
LOOT is free software: you can redistribute
|
||||||
|
it and/or modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation, either version 3 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
LOOT is distributed in the hope that it will
|
||||||
|
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LOOT. If not, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef LOOT_PLUGIN_TAGS
|
||||||
|
#define LOOT_PLUGIN_TAGS
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace loot {
|
||||||
|
/**
|
||||||
|
* @brief A structure that holds data about the Bash Tag suggestions made by
|
||||||
|
* LOOT for a plugin.
|
||||||
|
*/
|
||||||
|
struct PluginTags {
|
||||||
|
inline PluginTags() : userlist_modified(false) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A set of Bash Tag names suggested for addition to the specified
|
||||||
|
* plugin. Empty if no Bash Tag additions are suggested.
|
||||||
|
*/
|
||||||
|
std::set<std::string> added;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A set of Bash Tag names suggested for removal from the specified
|
||||||
|
* plugin. Empty if no Bash Tag removals are suggested.
|
||||||
|
*/
|
||||||
|
std::set<std::string> removed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief `true` if the Bash Tag suggestions were modified by data in the
|
||||||
|
* userlist, `false` otherwise.
|
||||||
|
*/
|
||||||
|
bool userlist_modified;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
+15
-18
@@ -7,11 +7,16 @@ import unittest
|
|||||||
from loot_api import Version
|
from loot_api import Version
|
||||||
from loot_api import WrapperVersion
|
from loot_api import WrapperVersion
|
||||||
from loot_api import GameType
|
from loot_api import GameType
|
||||||
from loot_api import LanguageCode
|
from loot_api import LogVerbosity
|
||||||
from loot_api import Message
|
from loot_api import SimpleMessage
|
||||||
from loot_api import MessageType
|
from loot_api import MessageType
|
||||||
from loot_api import create_database
|
from loot_api import create_database
|
||||||
from loot_api import is_compatible
|
from loot_api import is_compatible
|
||||||
|
from loot_api import set_logging_verbosity
|
||||||
|
from loot_api import initialise_locale
|
||||||
|
|
||||||
|
set_logging_verbosity(LogVerbosity.off)
|
||||||
|
initialise_locale("")
|
||||||
|
|
||||||
class GameFixture(unittest.TestCase):
|
class GameFixture(unittest.TestCase):
|
||||||
game_path = os.path.join(u'.', u'Oblivion')
|
game_path = os.path.join(u'.', u'Oblivion')
|
||||||
@@ -33,22 +38,22 @@ class GameFixture(unittest.TestCase):
|
|||||||
class TestLootApi(GameFixture):
|
class TestLootApi(GameFixture):
|
||||||
def test_is_compatible(self):
|
def test_is_compatible(self):
|
||||||
self.assertFalse(is_compatible(0, 9, 0))
|
self.assertFalse(is_compatible(0, 9, 0))
|
||||||
self.assertTrue(is_compatible(0, 10, 0))
|
self.assertTrue(is_compatible(0, 11, 0))
|
||||||
|
|
||||||
def test_version(self):
|
def test_version(self):
|
||||||
self.assertEqual(Version.major, 0)
|
self.assertEqual(Version.major, 0)
|
||||||
self.assertEqual(Version.minor, 10)
|
self.assertEqual(Version.minor, 11)
|
||||||
self.assertEqual(Version.patch, 2)
|
self.assertEqual(Version.patch, 0)
|
||||||
self.assertNotEqual(Version.revision, u'')
|
self.assertNotEqual(Version.revision, u'')
|
||||||
self.assertEqual(Version.string(), "0.10.2")
|
self.assertEqual(Version.string(), "0.11.0")
|
||||||
|
|
||||||
def test_wrapper_version(self):
|
def test_wrapper_version(self):
|
||||||
self.assertEqual(WrapperVersion.major, 1)
|
self.assertEqual(WrapperVersion.major, 2)
|
||||||
self.assertEqual(WrapperVersion.minor, 2)
|
self.assertEqual(WrapperVersion.minor, 0)
|
||||||
self.assertEqual(WrapperVersion.patch, 0)
|
self.assertEqual(WrapperVersion.patch, 0)
|
||||||
self.assertNotEqual(WrapperVersion.revision, u'')
|
self.assertNotEqual(WrapperVersion.revision, u'')
|
||||||
self.assertNotEqual(WrapperVersion.revision, Version.revision)
|
self.assertNotEqual(WrapperVersion.revision, Version.revision)
|
||||||
self.assertEqual(WrapperVersion.string(), "1.2.0")
|
self.assertEqual(WrapperVersion.string(), "2.0.0")
|
||||||
|
|
||||||
def test_create_db(self):
|
def test_create_db(self):
|
||||||
db = create_database(GameType.tes4, self.game_path, self.local_path)
|
db = create_database(GameType.tes4, self.game_path, self.local_path)
|
||||||
@@ -96,18 +101,10 @@ class TestDatabaseInterface(GameFixture):
|
|||||||
]))
|
]))
|
||||||
self.assertEqual(tags.removed, set([u'C.Water']))
|
self.assertEqual(tags.removed, set([u'C.Water']))
|
||||||
|
|
||||||
# cProfile.runctx('self.test_get_plugin_tags_performance()', globals(), locals(), sort='cumtime')
|
|
||||||
|
|
||||||
# def test_get_plugin_tags_performance(self):
|
|
||||||
# self.db.load_lists(self.masterlist_path, u'')
|
|
||||||
#
|
|
||||||
# for i in xrange(200000):
|
|
||||||
# tags = self.db.get_plugin_tags(u'Unofficial Oblivion Patch.esp')
|
|
||||||
|
|
||||||
def test_get_plugin_messages(self):
|
def test_get_plugin_messages(self):
|
||||||
self.db.load_lists(self.masterlist_path, u'')
|
self.db.load_lists(self.masterlist_path, u'')
|
||||||
|
|
||||||
messages = self.db.get_plugin_messages(u'Oblivion.esm', LanguageCode.english)
|
messages = self.db.get_plugin_metadata(u'Oblivion.esm').get_simple_messages(u'en')
|
||||||
|
|
||||||
self.assertEqual(len(messages), 1)
|
self.assertEqual(len(messages), 1)
|
||||||
self.assertEqual(messages[0].type, MessageType.error)
|
self.assertEqual(messages[0].type, MessageType.error)
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
#include "wrapper_version.h"
|
#include "wrapper_version.h"
|
||||||
|
|
||||||
namespace loot {
|
namespace loot {
|
||||||
const unsigned int WrapperVersion::major = 1;
|
const unsigned int WrapperVersion::major = 2;
|
||||||
const unsigned int WrapperVersion::minor = 2;
|
const unsigned int WrapperVersion::minor = 0;
|
||||||
const unsigned int WrapperVersion::patch = 0;
|
const unsigned int WrapperVersion::patch = 0;
|
||||||
const std::string WrapperVersion::revision = "@GIT_COMMIT_STRING@";
|
const std::string WrapperVersion::revision = "@GIT_COMMIT_STRING@";
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user