mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-10 20:13:24 -08:00
[Oracle] Load card tags from a tag database during import
Add a TagDatabase loader that understands Scryfall's Oracle Tags bulk data and user-supplied tag files (tag objects, flat oracle-id or name maps, optional manifest, JSON or JSONL, gzip/xz/zip). The importer joins the slugs on identifiers.scryfallOracleId while the identifiers are still available, falls back to the card name, and unions them with any tags the source already provides. Split-card faces merge through the existing tag union path. This replaces oracle/scripts/inject_scryfall_tags.py, which patched AllPrintings.json before import. Loading during import keeps tags on by default for every source and lets users pair Oracle with any tag database.
This commit is contained in:
parent
0f45dfa12a
commit
77179f913e
9 changed files with 1145 additions and 217 deletions
|
|
@ -1,5 +1,6 @@
|
|||
#include "../../oracle/src/oracleimporter.h"
|
||||
#include "../../oracle/src/raw_json_scanner.h"
|
||||
#include "../../oracle/src/tag_database.h"
|
||||
#include "libcockatrice/card/card_info.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
|
@ -600,6 +601,100 @@ TEST_F(OracleImporterTest, SplitCardTagsAreUnioned)
|
|||
ASSERT_EQ(result->getProperty("tags"), "card-advantage removal");
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Tag database join tests
|
||||
// ============================================================================
|
||||
|
||||
TEST_F(OracleImporterTest, AppliesTagDatabaseByOracleId)
|
||||
{
|
||||
QJsonObject card = makeCard("Tagged By Id");
|
||||
QJsonObject identifiers = card["identifiers"].toObject();
|
||||
identifiers["scryfallOracleId"] = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa";
|
||||
card["identifiers"] = identifiers;
|
||||
|
||||
QString error;
|
||||
const auto database = TagDatabase::loadFromData(
|
||||
R"json({"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa": ["removal", "ramp"]})json", TagDatabase::LoadOptions{}, &error);
|
||||
ASSERT_TRUE(database) << error.toStdString();
|
||||
importer->setTagDatabase(database);
|
||||
|
||||
importer->importCardsFromSet(set, QJsonArray{card});
|
||||
|
||||
auto result = importer->getCardList().value("Tagged By Id");
|
||||
ASSERT_FALSE(result.isNull());
|
||||
ASSERT_EQ(result->getProperty("tags"), "ramp removal");
|
||||
}
|
||||
|
||||
TEST_F(OracleImporterTest, AppliesTagDatabaseByNameWhenOracleIdIsMissing)
|
||||
{
|
||||
QJsonObject card = makeCard("Lightning Bolt");
|
||||
|
||||
QString error;
|
||||
const auto database = TagDatabase::loadFromData(R"json({"Lightning Bolt": ["burn", "removal"]})json",
|
||||
TagDatabase::LoadOptions{}, &error);
|
||||
ASSERT_TRUE(database) << error.toStdString();
|
||||
importer->setTagDatabase(database);
|
||||
|
||||
importer->importCardsFromSet(set, QJsonArray{card});
|
||||
|
||||
auto result = importer->getCardList().value("Lightning Bolt");
|
||||
ASSERT_FALSE(result.isNull());
|
||||
ASSERT_EQ(result->getProperty("tags"), "burn removal");
|
||||
}
|
||||
|
||||
TEST_F(OracleImporterTest, TagDatabaseUnionsWithSourceTags)
|
||||
{
|
||||
QJsonObject card = makeCard("Union Card");
|
||||
QJsonObject identifiers = card["identifiers"].toObject();
|
||||
identifiers["scryfallOracleId"] = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa";
|
||||
card["identifiers"] = identifiers;
|
||||
card["tags"] = QJsonArray{"ramp"};
|
||||
|
||||
QString error;
|
||||
const auto database = TagDatabase::loadFromData(
|
||||
R"json({"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa": ["removal", "ramp"]})json", TagDatabase::LoadOptions{}, &error);
|
||||
ASSERT_TRUE(database) << error.toStdString();
|
||||
importer->setTagDatabase(database);
|
||||
|
||||
importer->importCardsFromSet(set, QJsonArray{card});
|
||||
|
||||
auto result = importer->getCardList().value("Union Card");
|
||||
ASSERT_FALSE(result.isNull());
|
||||
ASSERT_EQ(result->getProperty("tags"), "ramp removal");
|
||||
}
|
||||
|
||||
TEST_F(OracleImporterTest, TagDatabaseSplitFacesUnionTheirTags)
|
||||
{
|
||||
QJsonObject face1 = makeCard("Fire // Ice");
|
||||
face1["layout"] = "split";
|
||||
face1["side"] = "a";
|
||||
face1["faceName"] = "Fire";
|
||||
QJsonObject identifiers1 = face1["identifiers"].toObject();
|
||||
identifiers1["scryfallOracleId"] = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa";
|
||||
face1["identifiers"] = identifiers1;
|
||||
|
||||
QJsonObject face2 = makeCard("Fire // Ice");
|
||||
face2["layout"] = "split";
|
||||
face2["side"] = "b";
|
||||
face2["faceName"] = "Ice";
|
||||
QJsonObject identifiers2 = face2["identifiers"].toObject();
|
||||
identifiers2["scryfallOracleId"] = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb";
|
||||
face2["identifiers"] = identifiers2;
|
||||
|
||||
QString error;
|
||||
const auto database = TagDatabase::loadFromData(
|
||||
R"json({"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa": ["removal"], "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb": ["card-advantage"]})json",
|
||||
TagDatabase::LoadOptions{}, &error);
|
||||
ASSERT_TRUE(database) << error.toStdString();
|
||||
importer->setTagDatabase(database);
|
||||
|
||||
importer->importCardsFromSet(set, QJsonArray{face1, face2});
|
||||
|
||||
auto result = importer->getCardList().value("Fire // Ice");
|
||||
ASSERT_FALSE(result.isNull());
|
||||
ASSERT_EQ(result->getProperty("tags"), "card-advantage removal");
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Card deduplication tests
|
||||
// ============================================================================
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue