From 909d543f4fc3442dd67cd628180116a1197a316c Mon Sep 17 00:00:00 2001 From: Eli Orona Date: Fri, 26 Apr 2024 12:09:01 -0700 Subject: [PATCH] Feature/manifest v2 (#3) * Add `sha1` and `complianceLevel` fields to VersionEntry * Add tests for parsing `version_manifest_v2.json` * Mark the Manifest V1 constructor as deprecated and reorganize tests for VersionManifest * Parameterize Tests * Bump Version * Add some missing fields --------- Co-authored-by: xtrm --- .github/workflows/update-changelog.yaml | 18 +++++ CHANGELOG.md | 10 +++ build.gradle | 2 +- launchermeta-parser.zip | Bin 73710 -> 0 bytes .../launchermeta/version/v1/Arguments.java | 31 ++++++++ .../quiltmc/launchermeta/version/v1/Rule.java | 38 ++++++++- .../launchermeta/version/v1/Version.java | 1 + .../version_manifest/VersionEntry.java | 22 +++++- .../launchermeta/version/v1/VersionTest.java | 34 +++++++- .../version_manifest/VersionManifestTest.java | 73 ++++++++++++++---- 10 files changed, 208 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/update-changelog.yaml create mode 100644 CHANGELOG.md delete mode 100644 launchermeta-parser.zip diff --git a/.github/workflows/update-changelog.yaml b/.github/workflows/update-changelog.yaml new file mode 100644 index 0000000..b2d593e --- /dev/null +++ b/.github/workflows/update-changelog.yaml @@ -0,0 +1,18 @@ +name: Update HTML Changelog + +on: + push: + branches: [master] + paths: + - CHANGELOG.md + +jobs: + dispatch: + runs-on: ubuntu-latest + steps: + - name: Dispatch website rebuild + uses: benc-uk/workflow-dispatch@v1 + with: + workflow: manual-publish.yaml + repo: quiltmc/quiltmc.org + token: "${{ secrets.COZY_PAT }}" \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e48c5ab --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# 1.0.0 + +Creation of Launcher Meta Parser - A shared library for Quilt tools to parse the launchermeta information from Mojang + +# 1.1.0 + +Changes: +- Update gradle and other dependencies +- Add support for v2 Manifest files +- Improve tests \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4e30d04..37bd873 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { } group 'org.quiltmc' -version '1.0.0' +version '1.1.0' repositories { mavenCentral() diff --git a/launchermeta-parser.zip b/launchermeta-parser.zip deleted file mode 100644 index d06962f6449e72e12c4c726311aa944a93431522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73710 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�e&xL@$ZR7G(;f>5xOg5>WBC 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 diff --git a/src/main/java/org/quiltmc/launchermeta/version/v1/Arguments.java b/src/main/java/org/quiltmc/launchermeta/version/v1/Arguments.java index f7d15ef..ecc5853 100644 --- a/src/main/java/org/quiltmc/launchermeta/version/v1/Arguments.java +++ b/src/main/java/org/quiltmc/launchermeta/version/v1/Arguments.java @@ -20,11 +20,15 @@ import java.util.List; import java.util.Objects; +import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import com.google.gson.reflect.TypeToken; public class Arguments { @@ -95,5 +99,32 @@ public Argument deserialize(JsonElement json, Type typeOfT, JsonDeserializationC return new Argument(value, rules); } } + + public static class Serializer implements JsonSerializer { + @Override + public JsonElement serialize(Argument argument, Type type, JsonSerializationContext context) { + if (argument.value.size() == 1 && argument.rules.isEmpty()) { + return new JsonPrimitive(argument.value.get(0)); + } + + JsonObject json = new JsonObject(); + + if (argument.value.size() == 1) { + json.add("value", new JsonPrimitive(argument.value.get(0))); + } else { + JsonArray array = new JsonArray(argument.value.size()); + argument.value.forEach(array::add); + json.add("value", array); + } + + if (!argument.rules.isEmpty()) { + JsonArray array = new JsonArray(argument.rules.size()); + argument.rules.stream().map(rule -> context.serialize(rule, new TypeToken(){}.getType())).forEach(array::add); + json.add("rules", array); + } + + return json; + } + } } } diff --git a/src/main/java/org/quiltmc/launchermeta/version/v1/Rule.java b/src/main/java/org/quiltmc/launchermeta/version/v1/Rule.java index f6851b8..66a5c6e 100644 --- a/src/main/java/org/quiltmc/launchermeta/version/v1/Rule.java +++ b/src/main/java/org/quiltmc/launchermeta/version/v1/Rule.java @@ -98,9 +98,29 @@ public static class Features { @Nullable private Boolean hasCustomResolution; - public Features(@Nullable Boolean isDemoUser, @Nullable Boolean hasCustomResolution) { + @SerializedName("has_quick_plays_support") + @Nullable + private Boolean hasQuickPlaysSupport; + + @SerializedName("is_quick_play_singleplayer") + @Nullable + private Boolean isQuickPlaySinglePlayer; + + @SerializedName("is_quick_play_multiplayer") + @Nullable + private Boolean isQuickPlayMultiPlayer; + + @SerializedName("is_quick_play_realms") + @Nullable + private Boolean isQuickPlayRealms; + + public Features(@Nullable Boolean isDemoUser, @Nullable Boolean hasCustomResolution, @Nullable Boolean hasQuickPlaysSupport, @Nullable Boolean isQuickPlaySinglePlayer, @Nullable Boolean isQuickPlayMultiPlayer, @Nullable Boolean isQuickPlayRealms) { this.isDemoUser = isDemoUser; this.hasCustomResolution = hasCustomResolution; + this.hasQuickPlaysSupport = hasQuickPlaysSupport; + this.isQuickPlaySinglePlayer = isQuickPlaySinglePlayer; + this.isQuickPlayMultiPlayer = isQuickPlayMultiPlayer; + this.isQuickPlayRealms = isQuickPlayRealms; } public Optional getDemoUser() { @@ -111,6 +131,22 @@ public Optional getHasCustomResolution() { return Optional.ofNullable(hasCustomResolution); } + public Optional getHasQuickPlaysSupport() { + return Optional.ofNullable(hasQuickPlaysSupport); + } + + public Optional getIsQuickPlaySinglePlayer() { + return Optional.ofNullable(isQuickPlaySinglePlayer); + } + + public Optional getIsQuickPlayMultiPlayer() { + return Optional.ofNullable(isQuickPlayMultiPlayer); + } + + public Optional getIsQuickPlayRealms() { + return Optional.ofNullable(isQuickPlayRealms); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/org/quiltmc/launchermeta/version/v1/Version.java b/src/main/java/org/quiltmc/launchermeta/version/v1/Version.java index c93d6d1..b977e3a 100644 --- a/src/main/java/org/quiltmc/launchermeta/version/v1/Version.java +++ b/src/main/java/org/quiltmc/launchermeta/version/v1/Version.java @@ -28,6 +28,7 @@ public class Version { public static final Gson GSON = new GsonBuilder() .registerTypeAdapter(Arguments.Argument.class, new Arguments.Argument.Parser()) + .registerTypeAdapter(Arguments.Argument.class, new Arguments.Argument.Serializer()) .create(); @Nullable diff --git a/src/main/java/org/quiltmc/launchermeta/version_manifest/VersionEntry.java b/src/main/java/org/quiltmc/launchermeta/version_manifest/VersionEntry.java index 1a05cf8..c9c3c5f 100644 --- a/src/main/java/org/quiltmc/launchermeta/version_manifest/VersionEntry.java +++ b/src/main/java/org/quiltmc/launchermeta/version_manifest/VersionEntry.java @@ -15,19 +15,31 @@ */ package org.quiltmc.launchermeta.version_manifest; +import java.util.Objects; +import java.util.Optional; + public class VersionEntry { private final String id; private final String type; private final String url; private final String time; private final String releaseTime; + private final String sha1; + private final int complianceLevel; + @Deprecated public VersionEntry(String id, String type, String url, String time, String releaseTime) { + this(id, type, url, time, releaseTime, null, 0); + } + + public VersionEntry(String id, String type, String url, String time, String releaseTime, String sha1, int complianceLevel) { this.id = id; this.type = type; this.url = url; this.time = time; this.releaseTime = releaseTime; + this.sha1 = sha1; + this.complianceLevel = complianceLevel; } public String getId() { @@ -50,11 +62,19 @@ public String getReleaseTime() { return releaseTime; } + public Optional getSha1() { + return Optional.ofNullable(sha1); + } + + public int getComplianceLevel() { + return complianceLevel; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; VersionEntry versionEntry = (VersionEntry) o; - return id.equals(versionEntry.id) && type.equals(versionEntry.type) && url.equals(versionEntry.url) && time.equals(versionEntry.time) && releaseTime.equals(versionEntry.releaseTime); + return id.equals(versionEntry.id) && type.equals(versionEntry.type) && url.equals(versionEntry.url) && time.equals(versionEntry.time) && releaseTime.equals(versionEntry.releaseTime) && Objects.equals(sha1, versionEntry.sha1) && complianceLevel == versionEntry.complianceLevel; } } diff --git a/src/test/java/org/quiltmc/launchermeta/version/v1/VersionTest.java b/src/test/java/org/quiltmc/launchermeta/version/v1/VersionTest.java index 016edc7..daecbe3 100644 --- a/src/test/java/org/quiltmc/launchermeta/version/v1/VersionTest.java +++ b/src/test/java/org/quiltmc/launchermeta/version/v1/VersionTest.java @@ -18,27 +18,36 @@ import java.io.IOException; import com.google.gson.JsonElement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.quiltmc.launchermeta.TestUtil; import org.quiltmc.launchermeta.version_manifest.VersionManifest; -import org.quiltmc.launchermeta.version_manifest.VersionManifestTest; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; public class VersionTest { - private static final String VERSION_URL = "https://launchermeta.mojang.com/v1/packages/f2affa3247f2471d3334b199d1915ce582914464/21w42a.json"; + private static final String VERSION_URL = "https://piston-meta.mojang.com/v1/packages/3ecc58bbbc2b680be6742747089cbbf3272526f9/1.20.6-rc1.json"; + private static final String MANIFEST_URL = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"; @Test - public void testParseFullJson() throws IOException { + public void testParseDoesNotThrow() throws IOException { JsonElement json = TestUtil.getJsonFromURL(VERSION_URL); assertDoesNotThrow(() -> { Version version = Version.fromJson(json); }); } + @Disabled("Manual verification passes with 1.20.6-rc1, but the order of elements is different") + @Test + public void testParseFullJson() throws IOException { + JsonElement json = TestUtil.getJsonFromURL(VERSION_URL); + Assertions.assertEquals(json, Version.GSON.toJsonTree(Version.fromJson(json))); + } + @Test public void assertNoMethodReturnsAreNull() throws IOException { - VersionManifest.fromJson(TestUtil.getJsonFromURL(VersionManifestTest.MANIFEST_URL)) + VersionManifest.fromJson(TestUtil.getJsonFromURL(MANIFEST_URL)) .getVersions() .parallelStream() .map(version -> { @@ -52,4 +61,21 @@ public void assertNoMethodReturnsAreNull() throws IOException { }) .forEach(TestUtil.checkNoMethodsReturnNull(Version.class)); } + + @Disabled("Manual verification passes with 1.20.6-rc1, but the order of elements is different") + @Test + public void assertCreatesSameJson() throws IOException { + VersionManifest.fromJson(TestUtil.getJsonFromURL(MANIFEST_URL)) + .getVersions() + .parallelStream() + .forEach(version -> { + JsonElement json = null; + try { + json = TestUtil.getJsonFromURL(version.getUrl()); + } catch (IOException e) { + e.printStackTrace(); + } + Assertions.assertEquals(Version.GSON.toJsonTree(Version.fromJson(json)), json); + }); + } } \ No newline at end of file diff --git a/src/test/java/org/quiltmc/launchermeta/version_manifest/VersionManifestTest.java b/src/test/java/org/quiltmc/launchermeta/version_manifest/VersionManifestTest.java index a0bebfe..4f4dc04 100644 --- a/src/test/java/org/quiltmc/launchermeta/version_manifest/VersionManifestTest.java +++ b/src/test/java/org/quiltmc/launchermeta/version_manifest/VersionManifestTest.java @@ -17,15 +17,22 @@ import java.io.IOException; import java.util.List; +import java.util.stream.Stream; import com.google.gson.JsonElement; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; + import org.quiltmc.launchermeta.TestUtil; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; public class VersionManifestTest { - public static final String MANIFEST_URL = "https://launchermeta.mojang.com/mc/game/version_manifest.json"; + private static final String MANIFEST_URL = "https://launchermeta.mojang.com/mc/game/version_manifest.json"; + private static final String MANIFEST_URL_V2 = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json"; private static final String TEST_JSON = """ { @@ -42,10 +49,30 @@ public class VersionManifestTest { }] } """; + private static final String TEST_JSON_V2 = """ + { + "latest": { + "release": "1.17.1", + "snapshot": "21w42a" + }, + "versions": [{ + "id": "21w42a", + "type": "snapshot", + "url": "https://piston-meta.mojang.com/v1/packages/3ce8fdf60e69bfb0944e479ada4cf6b60dcc3995/21w42a.json", + "time": "2021-10-20T12:46:24+00:00", + "releaseTime": "2021-10-20T12:41:25+00:00", + "sha1": "3ce8fdf60e69bfb0944e479ada4cf6b60dcc3995", + "complianceLevel": 1 + }] + } + """; + private static final VersionManifest VERSION_MANIFEST = new VersionManifest(new LatestVersions("1.17.1", "21w42a"), List.of(new VersionEntry("21w42a", "snapshot", "https://launchermeta.mojang.com/v1/packages/f2affa3247f2471d3334b199d1915ce582914464/21w42a.json", "2021-10-20T12:46:24+00:00", "2021-10-20T12:41:25+00:00"))); + public static final VersionManifest VERSION_MANIFEST_V2 = new VersionManifest(new LatestVersions("1.17.1", "21w42a"), List.of(new VersionEntry("21w42a", "snapshot", "https://piston-meta.mojang.com/v1/packages/3ce8fdf60e69bfb0944e479ada4cf6b60dcc3995/21w42a.json", "2021-10-20T12:46:24+00:00", "2021-10-20T12:41:25+00:00", "3ce8fdf60e69bfb0944e479ada4cf6b60dcc3995", 1))); - @Test - public void testParseFullJson() throws IOException { - JsonElement json = TestUtil.getJsonFromURL(VersionManifestTest.MANIFEST_URL); + @ParameterizedTest + @ValueSource(strings = {MANIFEST_URL, MANIFEST_URL_V2}) + void testParseFullJson(String url) throws IOException { + JsonElement json = TestUtil.getJsonFromURL(url); VersionManifest manifest = VersionManifest.fromJson(json); assertEquals(manifest.getVersions().size(), json.getAsJsonObject().get("versions").getAsJsonArray().size(), "Size of version array matches json"); @@ -53,17 +80,35 @@ public void testParseFullJson() throws IOException { } @Test - public void testParseTestJson() { - VersionManifest actual = VersionManifest.fromString(TEST_JSON); - VersionManifest expected = new VersionManifest(new LatestVersions("1.17.1", "21w42a"), - List.of(new VersionEntry("21w42a", "snapshot", "https://launchermeta.mojang.com/v1/packages/f2affa3247f2471d3334b199d1915ce582914464/21w42a.json", "2021-10-20T12:46:24+00:00", "2021-10-20T12:41:25+00:00"))); + void testParseFullJsonV2HasShaAnCompliance() throws IOException { + JsonElement json = TestUtil.getJsonFromURL(MANIFEST_URL_V2); + VersionManifest manifest = VersionManifest.fromJson(json); + String latestVersion = manifest.getLatestVersions().getRelease(); + VersionEntry latestEntry = manifest.getVersions().stream() + .filter(entry -> entry.getId().equals(latestVersion)) + .findFirst() + .orElseThrow(); + assertNotNull(latestEntry.getSha1(), "Latest version has a sha1"); + assertNotEquals(latestEntry.getComplianceLevel(), 0, "Latest version has a compliance level"); + } - assertEquals(actual, expected, "Actual parse matches expected result"); + @ParameterizedTest + @MethodSource("provideManifest") + void testParseTestJson(String json, VersionManifest manifest) { + VersionManifest actual = VersionManifest.fromString(json); + assertEquals(actual, manifest, "Actual parse matches expected result"); } - @Test - public void assertNoMethodReturnsAreNull() throws IOException { - TestUtil.checkNoMethodsReturnNull(VersionManifest.class) - .accept(VersionManifest.fromJson(TestUtil.getJsonFromURL(VersionManifestTest.MANIFEST_URL))); + @ParameterizedTest + @ValueSource(strings = {MANIFEST_URL, MANIFEST_URL_V2}) + void checkRemoteNoNulls(String url) throws IOException { + TestUtil.checkNoMethodsReturnNull(VersionManifest.class).accept(VersionManifest.fromJson(TestUtil.getJsonFromURL(url))); + } + + private static Stream provideManifest() { + return Stream.of( + Arguments.of(TEST_JSON, VERSION_MANIFEST), + Arguments.of(TEST_JSON_V2, VERSION_MANIFEST_V2) + ); } } \ No newline at end of file