Tests: migrating to mtgjson v5 (#6808);

This commit is contained in:
Oleg Agafonov 2020-08-15 14:21:38 +04:00
parent e1806f808c
commit ca254c6562
6 changed files with 171 additions and 154 deletions

View file

@ -1,176 +0,0 @@
package mage.verify;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
public final class MtgJsonService {
public static Map<String, String> mtgJsonToXMageCodes = new HashMap<>();
public static Map<String, String> xMageToMtgJsonCodes = new HashMap<>();
public static final boolean MTGJSON_IGNORE_NEW_PROPERTIES = true; // set it to false for full mtgjson checks and research (new fields finds or mtgjson updates)
// TODO: MtgJson now seems to use upper case set codes only.
// Review the ones beginning with a lower case "p" and remove the redundant entries.
static {
mtgJsonToXMageCodes.put("pPRE", "PPRE");
// mtgJsonToXMageCodes.put("pMPR", "MPRP"); // TODO: The set was split into the individual sets
mtgJsonToXMageCodes.put("pGRU", "PGRU");
mtgJsonToXMageCodes.put("pFNM", "FNMP");
mtgJsonToXMageCodes.put("pELP", "PELP");
mtgJsonToXMageCodes.put("pARL", "PARL"); // TODO: What about the other Arena League sets (1999-2006)?
mtgJsonToXMageCodes.put("pALP", "PALP");
mtgJsonToXMageCodes.put("PO2", "P02");
mtgJsonToXMageCodes.put("DD3_JVC", "JVC");
mtgJsonToXMageCodes.put("DD3_GVL", "DDD");
mtgJsonToXMageCodes.put("DD3_EVG", "EVG");
mtgJsonToXMageCodes.put("DD3_DVD", "DDC");
mtgJsonToXMageCodes.put("NMS", "NEM");
mtgJsonToXMageCodes.put("FRF_UGIN", "UGIN");
// revert search
for (Map.Entry<String, String> entry : mtgJsonToXMageCodes.entrySet()) {
xMageToMtgJsonCodes.put(entry.getValue(), entry.getKey());
}
}
private MtgJsonService() {
}
private static final class CardHolder {
private static final Map<String, MtgJsonCard> cards;
static {
try {
cards = loadAllCards();
List<String> keysToDelete = new ArrayList<>();
// fix names
Map<String, MtgJsonCard> newKeys = new HashMap<>();
for (String key : cards.keySet()) {
if (key.contains("(")) {
newKeys.put(key.replaceAll("\\(.*\\)", "").trim(), cards.get(key));
keysToDelete.add(key);
}
}
cards.putAll(newKeys);
cards.keySet().removeAll(keysToDelete);
// remove wrong data (tokens)
keysToDelete.clear();
for (Map.Entry<String, MtgJsonCard> record : cards.entrySet()) {
if (record.getValue().layout.equals("token") || record.getValue().layout.equals("double_faced_token")) {
keysToDelete.add(record.getKey());
}
}
cards.keySet().removeAll(keysToDelete);
addAliases(cards);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
private static final class SetHolder {
private static final Map<String, MtgJsonSet> sets;
static {
try {
sets = loadAllSets();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
private static Map<String, MtgJsonCard> loadAllCards() throws IOException {
return readFromZip("AllCards.json.zip", new TypeReference<Map<String, MtgJsonCard>>() {
});
}
private static Map<String, MtgJsonSet> loadAllSets() throws IOException {
return readFromZip("AllPrintings.json.zip", new TypeReference<Map<String, MtgJsonSet>>() {
});
}
private static <T> T readFromZip(String filename, TypeReference<T> ref) throws IOException {
InputStream stream = MtgJsonService.class.getResourceAsStream(filename);
if (stream == null) {
File file = new File(filename);
if (!file.exists()) {
System.out.println("Downloading " + filename + " to " + file.getAbsolutePath());
URLConnection connection = new URL("https://mtgjson.com/files/" + filename).openConnection();
connection.setRequestProperty("user-agent", "xmage");
InputStream download = connection.getInputStream();
Files.copy(download, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
System.out.println("Downloading DONE");
} else {
System.out.println("Using " + filename + " from " + file.getAbsolutePath());
}
stream = new FileInputStream(file);
}
try (ZipInputStream zipInputStream = new ZipInputStream(stream)) {
zipInputStream.getNextEntry();
return new ObjectMapper().readValue(zipInputStream, ref);
}
}
public static Map<String, MtgJsonSet> sets() {
return SetHolder.sets;
}
public static MtgJsonCard card(String name) {
return findReference(CardHolder.cards, name);
}
private static <T> T findReference(Map<String, T> reference, String name) {
T ref = reference.get(name);
if (ref == null) {
name = name.replaceFirst("\\bA[Ee]", "Æ");
ref = reference.get(name);
}
if (ref == null) {
name = name.replace("'", "\""); // for Kongming, "Sleeping Dragon" & Pang Tong, "Young Phoenix"
ref = reference.get(name);
}
return ref;
}
private static <T> void addAliases(Map<String, T> reference) {
Map<String, String> aliases = new HashMap<>();
for (String name : reference.keySet()) {
String unaccented = stripAccents(name);
if (!name.equals(unaccented)) {
aliases.put(name, unaccented);
}
}
for (Map.Entry<String, String> mapping : aliases.entrySet()) {
reference.put(mapping.getValue(), reference.get(mapping.getKey()));
}
}
private static String stripAccents(String str) {
String decomposed = Normalizer.normalize(str, Normalizer.Form.NFKD);
return decomposed.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
}
}