mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Add include_user_metadata parameter to Database::known_bash_tags()
The C++ wrapper defaults it to true, so the behaviour hasn't changed for existing callers.
This commit is contained in:
@@ -61,8 +61,7 @@ public:
|
||||
* The relative or absolute path to the masterlist file that should be
|
||||
* loaded.
|
||||
*/
|
||||
virtual void LoadMasterlist(
|
||||
const std::filesystem::path& masterlistPath) = 0;
|
||||
virtual void LoadMasterlist(const std::filesystem::path& masterlistPath) = 0;
|
||||
|
||||
/**
|
||||
* @brief Loads the masterlist and masterlist prelude from the paths
|
||||
@@ -141,9 +140,14 @@ public:
|
||||
/**
|
||||
* @brief Gets the Bash Tags that are listed in the loaded metadata lists.
|
||||
* @details Bash Tag suggestions can include Bash Tags not in this list.
|
||||
* @param includeUserMetadata
|
||||
* If true, any Bash Tag metadata present in the userlist is included
|
||||
* in the returned metadata, otherwise the metadata returned only
|
||||
* includes metadata from the masterlist.
|
||||
* @returns The Bash Tag names, which may include duplicates.
|
||||
*/
|
||||
virtual std::vector<std::string> GetKnownBashTags() const = 0;
|
||||
virtual std::vector<std::string> GetKnownBashTags(
|
||||
bool includeUserMetadata = true) const = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the Bash Tags that are listed in the loaded userlist.
|
||||
|
||||
@@ -60,9 +60,11 @@ void Database::ClearConditionCache() {
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::string> Database::GetKnownBashTags() const {
|
||||
std::vector<std::string> Database::GetKnownBashTags(
|
||||
bool includeUserMetadata) const {
|
||||
try {
|
||||
return convert<std::string>(database_->known_bash_tags());
|
||||
return convert<std::string>(
|
||||
database_->known_bash_tags(includeUserMetadata));
|
||||
} catch (const ::rust::Error& e) {
|
||||
std::rethrow_exception(mapError(e));
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@ public:
|
||||
|
||||
void ClearConditionCache() override;
|
||||
|
||||
std::vector<std::string> GetKnownBashTags() const override;
|
||||
std::vector<std::string> GetKnownBashTags(
|
||||
bool includeUserMetadata = true) const override;
|
||||
|
||||
std::vector<std::string> GetUserKnownBashTags() const override;
|
||||
|
||||
|
||||
+5
-2
@@ -103,12 +103,15 @@ impl Database {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn known_bash_tags(&self) -> Result<Vec<String>, VerboseError> {
|
||||
pub fn known_bash_tags(
|
||||
&self,
|
||||
include_user_metadata: bool,
|
||||
) -> Result<Vec<String>, VerboseError> {
|
||||
Ok(self
|
||||
.0
|
||||
.read()
|
||||
.map_err(DatabaseLockPoisonError::from)?
|
||||
.known_bash_tags())
|
||||
.known_bash_tags(to_merge_mode(include_user_metadata)))
|
||||
}
|
||||
|
||||
pub fn user_known_bash_tags(&self) -> Result<Vec<String>, VerboseError> {
|
||||
|
||||
+1
-1
@@ -268,7 +268,7 @@ mod ffi {
|
||||
|
||||
pub fn clear_condition_cache(&self) -> Result<()>;
|
||||
|
||||
pub fn known_bash_tags(&self) -> Result<Vec<String>>;
|
||||
pub fn known_bash_tags(&self, include_user_metadata: bool) -> Result<Vec<String>>;
|
||||
|
||||
pub fn user_known_bash_tags(&self) -> Result<Vec<String>>;
|
||||
|
||||
|
||||
@@ -485,6 +485,24 @@ TEST_P(DatabaseInterfaceTest,
|
||||
EXPECT_EQ(expectedTags, tags);
|
||||
}
|
||||
|
||||
TEST_P(
|
||||
DatabaseInterfaceTest,
|
||||
getKnownBashTagsShouldReturnAllBashTagsListedInLoadedMasterlistOnlyWhenParamIsFalse) {
|
||||
ASSERT_NO_THROW(GenerateMasterlist());
|
||||
ASSERT_NO_THROW(GenerateUserlist());
|
||||
|
||||
ASSERT_NO_THROW(handle_->GetDatabase().LoadMasterlist(masterlistPath));
|
||||
ASSERT_NO_THROW(handle_->GetDatabase().LoadUserlist(userlistPath_));
|
||||
|
||||
auto tags = handle_->GetDatabase().GetKnownBashTags(false);
|
||||
|
||||
std::vector<std::string> expectedTags({
|
||||
"Actors.ACBS",
|
||||
"C.Climate",
|
||||
});
|
||||
EXPECT_EQ(expectedTags, tags);
|
||||
}
|
||||
|
||||
TEST_P(DatabaseInterfaceTest,
|
||||
getUserKnownBashTagsShouldReturnAllBashTagsListedInLoadedUserMetadata) {
|
||||
ASSERT_NO_THROW(GenerateMasterlist());
|
||||
|
||||
@@ -139,12 +139,15 @@ impl Database {
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub fn known_bash_tags(&self) -> Result<Vec<String>, VerboseError> {
|
||||
pub fn known_bash_tags(
|
||||
&self,
|
||||
include_user_metadata: MergeMode,
|
||||
) -> Result<Vec<String>, VerboseError> {
|
||||
Ok(self
|
||||
.0
|
||||
.read()
|
||||
.map_err(DatabaseLockPoisonError::from)?
|
||||
.known_bash_tags())
|
||||
.known_bash_tags(include_user_metadata.into()))
|
||||
}
|
||||
|
||||
#[napi]
|
||||
|
||||
@@ -107,12 +107,15 @@ impl Database {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn known_bash_tags(&self) -> Result<Vec<String>, VerboseError> {
|
||||
pub fn known_bash_tags(
|
||||
&self,
|
||||
include_user_metadata: bool,
|
||||
) -> Result<Vec<String>, VerboseError> {
|
||||
Ok(self
|
||||
.0
|
||||
.read()
|
||||
.map_err(DatabaseLockPoisonError::from)?
|
||||
.known_bash_tags())
|
||||
.known_bash_tags(to_merge_mode(include_user_metadata)))
|
||||
}
|
||||
|
||||
pub fn user_known_bash_tags(&self) -> Result<Vec<String>, VerboseError> {
|
||||
|
||||
+63
-17
@@ -166,9 +166,12 @@ impl Database {
|
||||
/// Gets the Bash Tags that are listed in the loaded metadata lists.
|
||||
///
|
||||
/// Bash Tag suggestions can include Bash Tags not in this list.
|
||||
pub fn known_bash_tags(&self) -> Vec<String> {
|
||||
pub fn known_bash_tags(&self, include_user_metadata: MergeMode) -> Vec<String> {
|
||||
let mut tags = self.masterlist.bash_tags().to_vec();
|
||||
tags.extend_from_slice(self.userlist.bash_tags());
|
||||
|
||||
if include_user_metadata == MergeMode::WithUserMetadata {
|
||||
tags.extend_from_slice(self.userlist.bash_tags());
|
||||
}
|
||||
|
||||
tags
|
||||
}
|
||||
@@ -482,7 +485,12 @@ plugins:
|
||||
|
||||
database.load_masterlist(&fixture.metadata_path).unwrap();
|
||||
|
||||
assert_eq!(&["C.Climate"], database.known_bash_tags().as_slice());
|
||||
assert_eq!(
|
||||
&["C.Climate"],
|
||||
database
|
||||
.known_bash_tags(MergeMode::WithUserMetadata)
|
||||
.as_slice()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -494,7 +502,12 @@ plugins:
|
||||
.load_masterlist_with_prelude(&fixture.metadata_path, &fixture.prelude_path)
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(&["Actors.ACBS"], database.known_bash_tags().as_slice());
|
||||
assert_eq!(
|
||||
&["Actors.ACBS"],
|
||||
database
|
||||
.known_bash_tags(MergeMode::WithUserMetadata)
|
||||
.as_slice()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -504,7 +517,12 @@ plugins:
|
||||
|
||||
database.load_userlist(&fixture.metadata_path).unwrap();
|
||||
|
||||
assert_eq!(&["C.Climate"], database.known_bash_tags().as_slice());
|
||||
assert_eq!(
|
||||
&["C.Climate"],
|
||||
database
|
||||
.known_bash_tags(MergeMode::WithUserMetadata)
|
||||
.as_slice()
|
||||
);
|
||||
assert_eq!(
|
||||
&[
|
||||
Group::default(),
|
||||
@@ -887,22 +905,50 @@ plugins:
|
||||
assert!(!database.evaluate(condition).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn known_bash_tags_should_append_userlist_tags_to_masterlist_tags() {
|
||||
let fixture = Fixture::new(GameType::Oblivion);
|
||||
let mut database = fixture.database();
|
||||
mod known_bash_tags {
|
||||
use super::*;
|
||||
|
||||
database.load_masterlist(&fixture.metadata_path).unwrap();
|
||||
#[test]
|
||||
fn should_not_append_userlist_tags_to_masterlist_tags_if_merge_mode_is_without_user_metadata()
|
||||
{
|
||||
let fixture = Fixture::new(GameType::Oblivion);
|
||||
let mut database = fixture.database();
|
||||
|
||||
let userlist_path = fixture.inner.local_path.join("userlist.yaml");
|
||||
std::fs::write(&userlist_path, "bash_tags: [Relev, Delev]").unwrap();
|
||||
database.load_masterlist(&fixture.metadata_path).unwrap();
|
||||
|
||||
database.load_userlist(&userlist_path).unwrap();
|
||||
let userlist_path = fixture.inner.local_path.join("userlist.yaml");
|
||||
std::fs::write(&userlist_path, "bash_tags: [Relev, Delev]").unwrap();
|
||||
|
||||
assert_eq!(
|
||||
vec!["C.Climate", "Relev", "Delev"],
|
||||
database.known_bash_tags()
|
||||
);
|
||||
database.load_userlist(&userlist_path).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
vec!["C.Climate"],
|
||||
database.known_bash_tags(MergeMode::WithoutUserMetadata)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_append_unique_userlist_tags_to_masterlist_tags_if_merge_mode_is_with_user_metadata()
|
||||
{
|
||||
let fixture = Fixture::new(GameType::Oblivion);
|
||||
let mut database = fixture.database();
|
||||
|
||||
database.load_masterlist(&fixture.metadata_path).unwrap();
|
||||
|
||||
let userlist_path = fixture.inner.local_path.join("userlist.yaml");
|
||||
std::fs::write(
|
||||
&userlist_path,
|
||||
"bash_tags: [C.Climate, Relev, Delev, Relev]",
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
database.load_userlist(&userlist_path).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
vec!["C.Climate", "C.Climate", "Relev", "Delev", "Relev"],
|
||||
database.known_bash_tags(MergeMode::WithUserMetadata)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user