diff --git a/beet/library/base.py b/beet/library/base.py index 3bf966b0..14fbce76 100644 --- a/beet/library/base.py +++ b/beet/library/base.py @@ -76,12 +76,18 @@ SupportsMerge, ) from beet.core.file import File, FileOrigin, JsonFile, PngFile -from beet.core.utils import FileSystemPath, JsonDict, SupportedFormats, TextComponent +from beet.core.utils import ( + FileSystemPath, + JsonDict, + SupportedFormats, + TextComponent, +) +from beet.resources.pack_format_registry import PackFormatRegistryContainer from beet.toolchain.config import FormatSpecifier from .utils import list_extensions, list_origin_folders -LATEST_MINECRAFT_VERSION: str = "1.21" +LATEST_MINECRAFT_VERSION: str = "1.21.10" T = TypeVar("T") @@ -1012,7 +1018,7 @@ class Pack(MatchMixin, MergeMixin, Container[str, NamespaceType]): namespace_type: ClassVar[Type[Namespace]] default_name: ClassVar[str] - pack_format_registry: ClassVar[Dict[Tuple[int, ...], int | FormatSpecifier]] + pack_format_registry: ClassVar[PackFormatRegistryContainer] latest_pack_format: ClassVar[int | FormatSpecifier] pack_format_switch_format: ClassVar[int] diff --git a/beet/library/data_pack.py b/beet/library/data_pack.py index 12d5ae9d..bda54f87 100644 --- a/beet/library/data_pack.py +++ b/beet/library/data_pack.py @@ -70,7 +70,8 @@ TextFileBase, TextFileContent, ) -from beet.core.utils import JsonDict, extra_field, split_version +from beet.core.utils import JsonDict, extra_field +from beet.resources.pack_format_registry import PackFormatRegistryContainer from .base import ( LATEST_MINECRAFT_VERSION, @@ -648,19 +649,11 @@ class DataPack(Pack[DataPackNamespace]): default_name = "untitled_data_pack" - pack_format_registry = { - (1, 13): 4, - (1, 14): 4, - (1, 15): 5, - (1, 16): 6, - (1, 17): 7, - (1, 18): 9, - (1, 19): 12, - (1, 20): 41, - (1, 21): (88, 0), - } - latest_pack_format = pack_format_registry[split_version(LATEST_MINECRAFT_VERSION)] pack_format_switch_format = 82 + pack_format_registry = PackFormatRegistryContainer( + pack_format_switch_format, "data_pack" + ) + latest_pack_format = pack_format_registry[LATEST_MINECRAFT_VERSION] # fmt: off advancements: NamespaceProxyDescriptor[Advancement] = NamespaceProxyDescriptor(Advancement) diff --git a/beet/library/resource_pack.py b/beet/library/resource_pack.py index 75369edf..bcb12ec3 100644 --- a/beet/library/resource_pack.py +++ b/beet/library/resource_pack.py @@ -32,13 +32,15 @@ from dataclasses import dataclass from typing import Any, ClassVar, Dict, Optional, Type +from beet.resources.pack_format_registry import PackFormatRegistryContainer + try: from PIL.Image import Image except ImportError: Image = Any from beet.core.file import BinaryFile, BinaryFileContent, JsonFile, PngFile, TextFile -from beet.core.utils import JsonDict, extra_field, split_version +from beet.core.utils import JsonDict, extra_field from .base import ( LATEST_MINECRAFT_VERSION, @@ -373,26 +375,11 @@ class ResourcePack(Pack[ResourcePackNamespace]): default_name = "untitled_resource_pack" - pack_format_registry = { - (1, 6): 1, - (1, 7): 1, - (1, 8): 1, - (1, 9): 2, - (1, 10): 2, - (1, 11): 3, - (1, 12): 3, - (1, 13): 4, - (1, 14): 4, - (1, 15): 5, - (1, 16): 6, - (1, 17): 7, - (1, 18): 8, - (1, 19): 13, - (1, 20): 32, - (1, 21): (69, 0), - } - latest_pack_format = pack_format_registry[split_version(LATEST_MINECRAFT_VERSION)] pack_format_switch_format = 65 + pack_format_registry = PackFormatRegistryContainer( + pack_format_switch_format, "resource_pack" + ) + latest_pack_format = pack_format_registry[LATEST_MINECRAFT_VERSION] language_config = McmetaPin[Dict[str, JsonDict]]("language", default_factory=dict) diff --git a/beet/resources/__init__.py b/beet/resources/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/beet/resources/pack_format_registry.json b/beet/resources/pack_format_registry.json new file mode 100644 index 00000000..b0c89ac4 --- /dev/null +++ b/beet/resources/pack_format_registry.json @@ -0,0 +1,674 @@ +[ + { + "id": "1.21.10", + "name": "1.21.10", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4556, + "protocol_version": 773, + "data_pack_version": 88, + "data_pack_version_minor": 0, + "resource_pack_version": 69, + "resource_pack_version_minor": 0, + "build_time": "2025-10-07T09:14:11+00:00", + "release_time": "2025-10-07T09:17:23+00:00", + "sha1": "38c873e1339f6a8b4dfbe4df66e355b989371838" + }, + { + "id": "1.21.9", + "name": "1.21.9", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4554, + "protocol_version": 773, + "data_pack_version": 88, + "data_pack_version_minor": 0, + "resource_pack_version": 69, + "resource_pack_version_minor": 0, + "build_time": "2025-09-30T11:55:33+00:00", + "release_time": "2025-09-30T11:58:43+00:00", + "sha1": "53f9bec2722de5b22b1ab8c393f2b0f6cb3f8a5a" + }, + { + "id": "1.21.8", + "name": "1.21.8", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4440, + "protocol_version": 772, + "data_pack_version": 81, + "data_pack_version_minor": 0, + "resource_pack_version": 64, + "resource_pack_version_minor": 0, + "build_time": "2025-07-17T12:00:57+00:00", + "release_time": "2025-07-17T12:04:02+00:00", + "sha1": "e9c00d989d7155786eaa748bc39d05d8b54c3653" + }, + { + "id": "1.21.7", + "name": "1.21.7", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4438, + "protocol_version": 772, + "data_pack_version": 81, + "data_pack_version_minor": 0, + "resource_pack_version": 64, + "resource_pack_version_minor": 0, + "build_time": "2025-06-30T09:29:28+00:00", + "release_time": "2025-06-30T09:32:16+00:00", + "sha1": "bcda77b19adb67bd7d45fc1732f68b01b6badff4" + }, + { + "id": "1.21.6", + "name": "1.21.6", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4435, + "protocol_version": 771, + "data_pack_version": 80, + "data_pack_version_minor": 0, + "resource_pack_version": 63, + "resource_pack_version_minor": 0, + "build_time": "2025-06-17T11:07:28+00:00", + "release_time": "2025-06-17T11:10:28+00:00", + "sha1": "41274623de4d69a25108d5fa7e26a687ec48919c" + }, + { + "id": "1.21.5", + "name": "1.21.5", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4325, + "protocol_version": 770, + "data_pack_version": 71, + "data_pack_version_minor": 0, + "resource_pack_version": 55, + "resource_pack_version_minor": 0, + "build_time": "2025-03-25T12:11:48+00:00", + "release_time": "2025-03-25T12:14:58+00:00", + "sha1": "6bb02a747dc11046591135ce8925abf59bd30ce4" + }, + { + "id": "1.21.4", + "name": "1.21.4", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4189, + "protocol_version": 769, + "data_pack_version": 61, + "data_pack_version_minor": 0, + "resource_pack_version": 46, + "resource_pack_version_minor": 0, + "build_time": "2024-12-03T10:09:48+00:00", + "release_time": "2024-12-03T10:12:57+00:00", + "sha1": "992fb09b7aa463bdb2a0dde747d36b7bad6c5450" + }, + { + "id": "1.21.3", + "name": "1.21.3", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4082, + "protocol_version": 768, + "data_pack_version": 57, + "data_pack_version_minor": 0, + "resource_pack_version": 42, + "resource_pack_version_minor": 0, + "build_time": "2024-10-23T12:25:27+00:00", + "release_time": "2024-10-23T12:28:15+00:00", + "sha1": "a301715a43c3378db022a7e44d9fbe9376fce272" + }, + { + "id": "1.21.2", + "name": "1.21.2", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 4080, + "protocol_version": 768, + "data_pack_version": 57, + "data_pack_version_minor": 0, + "resource_pack_version": 42, + "resource_pack_version_minor": 0, + "build_time": "2024-10-22T09:55:49+00:00", + "release_time": "2024-10-22T09:58:55+00:00", + "sha1": "e458f13189c0b36a211d461edd6ac0a8771c68dc" + }, + { + "id": "1.21.1", + "name": "1.21.1", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3955, + "protocol_version": 767, + "data_pack_version": 48, + "data_pack_version_minor": 0, + "resource_pack_version": 34, + "resource_pack_version_minor": 0, + "build_time": "2024-08-08T12:21:55+00:00", + "release_time": "2024-08-08T12:24:45+00:00", + "sha1": "54b81cc79bc61af0adcc39a0b592ae333cc1e6fc" + }, + { + "id": "1.21", + "name": "1.21", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3953, + "protocol_version": 767, + "data_pack_version": 48, + "data_pack_version_minor": 0, + "resource_pack_version": 34, + "resource_pack_version_minor": 0, + "build_time": "2024-06-13T08:21:21+00:00", + "release_time": "2024-06-13T08:24:03+00:00", + "sha1": "6debfc864b9e5f728d54e34a0faf2740262036b6" + }, + { + "id": "1.20.6", + "name": "1.20.6", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3839, + "protocol_version": 766, + "data_pack_version": 41, + "data_pack_version_minor": 0, + "resource_pack_version": 32, + "resource_pack_version_minor": 0, + "build_time": "2024-04-29T12:38:06+00:00", + "release_time": "2024-04-29T12:40:45+00:00", + "sha1": "36ead78d35bc5ed318f21c74ed4fea68dcd8c238" + }, + { + "id": "1.20.5", + "name": "1.20.5", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3837, + "protocol_version": 766, + "data_pack_version": 41, + "data_pack_version_minor": 0, + "resource_pack_version": 32, + "resource_pack_version_minor": 0, + "build_time": "2024-04-23T11:51:33+00:00", + "release_time": "2024-04-23T11:54:12+00:00", + "sha1": "0799fcddd411365f4ca3aa6cd035bad867acef74" + }, + { + "id": "1.20.4", + "name": "1.20.4", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3700, + "protocol_version": 765, + "data_pack_version": 26, + "data_pack_version_minor": 0, + "resource_pack_version": 22, + "resource_pack_version_minor": 0, + "build_time": "2023-12-07T12:53:30+00:00", + "release_time": "2023-12-07T12:56:20+00:00", + "sha1": "04fe402f585253eaeed600a845d9b6598ac65255" + }, + { + "id": "1.20.3", + "name": "1.20.3", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3698, + "protocol_version": 765, + "data_pack_version": 26, + "data_pack_version_minor": 0, + "resource_pack_version": 22, + "resource_pack_version_minor": 0, + "build_time": "2023-12-04T12:04:50+00:00", + "release_time": "2023-12-04T12:10:32+00:00", + "sha1": "fe266a6ddac0bd30f06c02592531f718b61ce637" + }, + { + "id": "1.20.2", + "name": "1.20.2", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3578, + "protocol_version": 764, + "data_pack_version": 18, + "data_pack_version_minor": 0, + "resource_pack_version": 18, + "resource_pack_version_minor": 0, + "build_time": "2023-09-20T09:00:26+00:00", + "release_time": "2023-09-20T09:02:57+00:00", + "sha1": "d5ec7c4199a80a0ef1c5e9998f168afb9a932c82" + }, + { + "id": "1.20.1", + "name": "1.20.1", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3465, + "protocol_version": 763, + "data_pack_version": 15, + "data_pack_version_minor": 0, + "resource_pack_version": 15, + "resource_pack_version_minor": 0, + "build_time": "2023-06-12T13:23:26+00:00", + "release_time": "2023-06-12T13:25:51+00:00", + "sha1": "662fac49fa7b30e4ee73810fef9e243c0ba9ffa4" + }, + { + "id": "1.20", + "name": "1.20", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3463, + "protocol_version": 763, + "data_pack_version": 15, + "data_pack_version_minor": 0, + "resource_pack_version": 15, + "resource_pack_version_minor": 0, + "build_time": "2023-06-02T08:33:51+00:00", + "release_time": "2023-06-02T08:36:17+00:00", + "sha1": "91cdd1a81e87029684bbfe0edff2abf519a21570" + }, + { + "id": "1.19.4", + "name": "1.19.4", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3337, + "protocol_version": 762, + "data_pack_version": 12, + "data_pack_version_minor": 0, + "resource_pack_version": 13, + "resource_pack_version_minor": 0, + "build_time": "2023-03-14T12:53:56+00:00", + "release_time": "2023-03-14T12:56:18+00:00", + "sha1": "cbb0d6a006f0dd923e3410961dd1ca95e7511519" + }, + { + "id": "1.19.3", + "name": "1.19.3", + "release_target": null, + "type": "release", + "stable": true, + "data_version": 3218, + "protocol_version": 761, + "data_pack_version": 10, + "data_pack_version_minor": 0, + "resource_pack_version": 12, + "resource_pack_version_minor": 0, + "build_time": "2022-12-07T08:14:04+00:00", + "release_time": "2022-12-07T08:17:18+00:00", + "sha1": "e274ba748b662e7475bd3b4eac2d094719f5547d" + }, + { + "id": "1.19.2", + "name": "1.19.2", + "release_target": "1.19.2", + "type": "release", + "stable": true, + "data_version": 3120, + "protocol_version": 760, + "data_pack_version": 10, + "data_pack_version_minor": 0, + "resource_pack_version": 9, + "resource_pack_version_minor": 0, + "build_time": "2022-08-05T11:55:20+00:00", + "release_time": "2022-08-05T11:57:05+00:00", + "sha1": "ed548106acf3ac7e8205a6ee8fd2710facfa164f" + }, + { + "id": "1.19.1", + "name": "1.19.1", + "release_target": "1.19.1", + "type": "release", + "stable": true, + "data_version": 3117, + "protocol_version": 760, + "data_pack_version": 10, + "data_pack_version_minor": 0, + "resource_pack_version": 9, + "resource_pack_version_minor": 0, + "build_time": "2022-07-27T09:23:42+00:00", + "release_time": "2022-07-27T09:25:33+00:00", + "sha1": "39d5e8925d37490c6f2abb2e02b8c6f1b35719df" + }, + { + "id": "1.19", + "name": "1.19", + "release_target": "1.19", + "type": "release", + "stable": true, + "data_version": 3105, + "protocol_version": 759, + "data_pack_version": 10, + "data_pack_version_minor": 0, + "resource_pack_version": 9, + "resource_pack_version_minor": 0, + "build_time": "2022-06-07T09:40:26+00:00", + "release_time": "2022-06-07T09:42:18+00:00", + "sha1": "14bbfb25fb1c1c798e3c9b9482b081a78d1f3a9d" + }, + { + "id": "1.18.2", + "name": "1.18.2", + "release_target": "1.18.2", + "type": "release", + "stable": true, + "data_version": 2975, + "protocol_version": 758, + "data_pack_version": 9, + "data_pack_version_minor": 0, + "resource_pack_version": 8, + "resource_pack_version_minor": 0, + "build_time": "2022-02-28T10:40:37+00:00", + "release_time": "2022-02-28T10:42:45+00:00", + "sha1": "334b33fcba3c9be4b7514624c965256535bd7eba" + }, + { + "id": "1.18.1", + "name": "1.18.1", + "release_target": "1.18.1", + "type": "release", + "stable": true, + "data_version": 2865, + "protocol_version": 757, + "data_pack_version": 8, + "data_pack_version_minor": 0, + "resource_pack_version": 8, + "resource_pack_version_minor": 0, + "build_time": "2021-12-10T08:21:01+00:00", + "release_time": "2021-12-10T08:23:00+00:00", + "sha1": "7ff864e988a2c29907154d5f9701e87e5d5e554a" + }, + { + "id": "1.18", + "name": "1.18", + "release_target": "1.18", + "type": "release", + "stable": true, + "data_version": 2860, + "protocol_version": 757, + "data_pack_version": 8, + "data_pack_version_minor": 0, + "resource_pack_version": 8, + "resource_pack_version_minor": 0, + "build_time": "2021-11-30T09:14:30+00:00", + "release_time": "2021-11-30T09:16:29+00:00", + "sha1": "7367ea8b7cad7c7830192441bb2846be0d2ceeac" + }, + { + "id": "1.17.1", + "name": "1.17.1", + "release_target": "1.17.1", + "type": "release", + "stable": true, + "data_version": 2730, + "protocol_version": 756, + "data_pack_version": 7, + "data_pack_version_minor": 0, + "resource_pack_version": 7, + "resource_pack_version_minor": 0, + "build_time": "2021-07-06T11:59:45+00:00", + "release_time": "2021-07-06T12:01:34+00:00", + "sha1": "e0e7ab5ed6f55bbd874ef95be3c9356d67e64b57" + }, + { + "id": "1.17", + "name": "1.17", + "release_target": "1.17", + "type": "release", + "stable": true, + "data_version": 2724, + "protocol_version": 755, + "data_pack_version": 7, + "data_pack_version_minor": 0, + "resource_pack_version": 7, + "resource_pack_version_minor": 0, + "build_time": "2021-06-08T10:58:54+00:00", + "release_time": "2021-06-08T11:00:40+00:00", + "sha1": "0d9ace8a2ecfd1f4c782786f4b985a499240ff12" + }, + { + "id": "1.16.5", + "name": "1.16.5", + "release_target": "1.16.5", + "type": "release", + "stable": true, + "data_version": 2586, + "protocol_version": 754, + "data_pack_version": 6, + "data_pack_version_minor": 0, + "resource_pack_version": 6, + "resource_pack_version_minor": 0, + "build_time": "2021-01-14T16:03:41+00:00", + "release_time": "2021-01-14T16:05:32+00:00", + "sha1": "fba9f7833e858a1257d810d21a3a9e3c967f9077" + }, + { + "id": "1.16.4", + "name": "1.16.4", + "release_target": "1.16.4", + "type": "release", + "stable": true, + "data_version": 2584, + "protocol_version": 754, + "data_pack_version": 6, + "data_pack_version_minor": 0, + "resource_pack_version": 6, + "resource_pack_version_minor": 0, + "build_time": "2020-10-29T15:47:51+00:00", + "release_time": "2020-10-29T15:49:37+00:00", + "sha1": "596ad61fda7612d9edf8881cf81869276bdb7f82" + }, + { + "id": "1.16.3", + "name": "1.16.3", + "release_target": "1.16.3", + "type": "release", + "stable": true, + "data_version": 2580, + "protocol_version": 753, + "data_pack_version": 6, + "data_pack_version_minor": 0, + "resource_pack_version": 6, + "resource_pack_version_minor": 0, + "build_time": "2020-09-10T13:40:50+00:00", + "release_time": "2020-09-10T13:42:37+00:00", + "sha1": "6485dd131ef68c968041a9f6fd73094b027e42e1" + }, + { + "id": "1.16.2", + "name": "1.16.2", + "release_target": "1.16.2", + "type": "release", + "stable": true, + "data_version": 2578, + "protocol_version": 751, + "data_pack_version": 6, + "data_pack_version_minor": 0, + "resource_pack_version": 6, + "resource_pack_version_minor": 0, + "build_time": "2020-08-11T10:11:57+00:00", + "release_time": "2020-08-11T10:13:46+00:00", + "sha1": "998d9ef5770d05c20d760dc16cf85151f35009f2" + }, + { + "id": "1.16.1", + "name": "1.16.1", + "release_target": "1.16.1", + "type": "release", + "stable": true, + "data_version": 2567, + "protocol_version": 736, + "data_pack_version": 5, + "data_pack_version_minor": 0, + "resource_pack_version": 5, + "resource_pack_version_minor": 0, + "build_time": "2020-06-24T10:29:54+00:00", + "release_time": "2020-06-24T10:31:40+00:00", + "sha1": "54fa3af57d041d2771e66d390197b2c0288e697c" + }, + { + "id": "1.16", + "name": "1.16", + "release_target": "1.16", + "type": "release", + "stable": true, + "data_version": 2566, + "protocol_version": 735, + "data_pack_version": 5, + "data_pack_version_minor": 0, + "resource_pack_version": 5, + "resource_pack_version_minor": 0, + "build_time": "2020-06-23T16:19:09+00:00", + "release_time": "2020-06-23T16:20:52+00:00", + "sha1": "e9d21d375f9c961f0e9731d4e463306d76e77c48" + }, + { + "id": "1.15.2", + "name": "1.15.2", + "release_target": "1.15.2", + "type": "release", + "stable": true, + "data_version": 2230, + "protocol_version": 578, + "data_pack_version": 5, + "data_pack_version_minor": 0, + "resource_pack_version": 5, + "resource_pack_version_minor": 0, + "build_time": "2020-01-17T10:02:11+00:00", + "release_time": "2020-01-17T10:03:52+00:00", + "sha1": "e9d0adb8f642abe422909ede50f651b2b58a3573" + }, + { + "id": "1.15.1", + "name": "1.15.1", + "release_target": "1.15.1", + "type": "release", + "stable": true, + "data_version": 2227, + "protocol_version": 575, + "data_pack_version": 5, + "data_pack_version_minor": 0, + "resource_pack_version": 5, + "resource_pack_version_minor": 0, + "build_time": "2019-12-16T10:28:09+00:00", + "release_time": "2019-12-16T10:29:47+00:00", + "sha1": "18c3063de87ae126b4e017121219ba802be0755b" + }, + { + "id": "1.15", + "name": "1.15", + "release_target": "1.15", + "type": "release", + "stable": true, + "data_version": 2225, + "protocol_version": 573, + "data_pack_version": 5, + "data_pack_version_minor": 0, + "resource_pack_version": 5, + "resource_pack_version_minor": 0, + "build_time": "2019-12-09T13:11:56+00:00", + "release_time": "2019-12-09T13:13:38+00:00", + "sha1": "833322370ab320e77717097082effe1d124d48bd" + }, + { + "id": "1.14.4", + "name": "1.14.4", + "release_target": "1.14.4", + "type": "release", + "stable": true, + "data_version": 1976, + "protocol_version": 498, + "data_pack_version": 4, + "data_pack_version_minor": 0, + "resource_pack_version": 4, + "resource_pack_version_minor": 0, + "build_time": "2019-07-19T09:24:08+00:00", + "release_time": "2019-07-19T09:25:47+00:00", + "sha1": "be146d5f66a3627ed0a87c234c4d8dde8ab35098" + }, + { + "id": "1.14.3", + "name": "1.14.3", + "release_target": "1.14.3", + "type": "release", + "stable": true, + "data_version": 1968, + "protocol_version": 490, + "data_pack_version": 4, + "data_pack_version_minor": 0, + "resource_pack_version": 4, + "resource_pack_version_minor": 0, + "build_time": "2019-06-24T12:51:13+00:00", + "release_time": "2019-06-24T12:52:52+00:00", + "sha1": "e21618620e02be5a14543d1d17ffdba941d09aa8" + }, + { + "id": "1.14.2", + "name": "1.14.2", + "release_target": "1.14.2", + "type": "release", + "stable": true, + "data_version": 1963, + "protocol_version": 485, + "data_pack_version": 4, + "data_pack_version_minor": 0, + "resource_pack_version": 4, + "resource_pack_version_minor": 0, + "build_time": "2019-05-27T11:46:41+00:00", + "release_time": "2019-05-27T11:48:25+00:00", + "sha1": "83299b3bf3139ebd9ae5547b3144dcf68d4cb1fd" + }, + { + "id": "1.14.1", + "name": "1.14.1", + "release_target": "1.14.1", + "type": "release", + "stable": false, + "data_version": 1957, + "protocol_version": 480, + "data_pack_version": 4, + "data_pack_version_minor": 0, + "resource_pack_version": 4, + "resource_pack_version_minor": 0, + "build_time": "2019-05-13T11:08:37+00:00", + "release_time": "2019-05-13T11:10:12+00:00", + "sha1": "183e49ba0fabb5ef8a304f8f5907fa887f40c466" + }, + { + "id": "1.14", + "name": "1.14", + "release_target": "1.14", + "type": "release", + "stable": false, + "data_version": 1952, + "protocol_version": 477, + "data_pack_version": 4, + "data_pack_version_minor": 0, + "resource_pack_version": 4, + "resource_pack_version_minor": 0, + "build_time": "2019-04-23T14:51:09+00:00", + "release_time": "2019-04-23T14:52:44+00:00", + "sha1": "0fd01dd81eaa451d3130b1cf025a10f129585b10" + } +] \ No newline at end of file diff --git a/beet/resources/pack_format_registry.py b/beet/resources/pack_format_registry.py new file mode 100644 index 00000000..e3096dcf --- /dev/null +++ b/beet/resources/pack_format_registry.py @@ -0,0 +1,128 @@ +""" +Pack format registry resource from https://raw.githubusercontent.com/misode/mcmeta/refs/heads/summary/versions/data.json + +see file://./../../scripts/update_pack_format_registry.py + +""" + +__all__ = [ + "pack_format_registry", + "pack_format_registry_path", + "PackFormatRegistryContainer", + "PackFormatRegistry", +] +from importlib.resources import files +import json +from typing import Literal, Mapping +from beet.toolchain.config import FormatSpecifier +from pydantic import BaseModel +from beet.core.utils import normalize_string, VersionNumber +from beet.core.container import Container + + +class PackFormatRegistry(BaseModel): + id: str + name: str + release_target: str | None + type: str + stable: bool + data_version: int + protocol_version: int + data_pack_version: int + data_pack_version_minor: int + resource_pack_version: int + resource_pack_version_minor: int + build_time: str + release_time: str + sha1: str + + +pack_format_registry_path = files("beet.resources").joinpath( + f"pack_format_registry.json" +) + +data = json.loads(pack_format_registry_path.read_text()) +pack_format_registry: list[PackFormatRegistry] = [] +for item in data: + pack_format_registry.append(PackFormatRegistry.model_validate(item)) + + +class PackFormatRegistryContainer(Container[VersionNumber, FormatSpecifier]): + """Container for pack format registry data.""" + + def __init__( + self, + pack_format_switch_format: int, + pack_type: Literal["data_pack", "resource_pack"], + ): + super().__init__() + if pack_type == "resource_pack": + data: dict[VersionNumber, FormatSpecifier] = { + (1, 6): 1, + (1, 7): 1, + (1, 8): 1, + (1, 9): 2, + (1, 10): 2, + (1, 11): 3, + (1, 12): 3, + (1, 13): 4, + **{ + x.id: ( + x.resource_pack_version + if x.resource_pack_version < pack_format_switch_format + else (x.resource_pack_version, x.resource_pack_version_minor) + ) + for x in pack_format_registry + if x.type == "release" + }, + } + elif pack_type == "data_pack": + data: dict[VersionNumber, FormatSpecifier] = { + (1, 13): 4, + **{ + x.id: ( + x.data_pack_version + if x.data_pack_version < pack_format_switch_format + else (x.data_pack_version, x.data_pack_version_minor) + ) + for x in pack_format_registry + if x.type == "release" + }, + } + else: + raise ValueError( + f'Illegal "{pack_type}", should be "data_pack" or "resource_pack"' + ) + for key, value in data.items(): + self[key] = value + + def normalize_key(self, key: VersionNumber) -> tuple[str | int, ...]: + """Normalize the key to a tuple of integers.""" + if isinstance(key, (int, float)): + key = str(key) + if isinstance(key, str): + key = tuple(normalize_string(key).split("_")) + return tuple(int(value) if value != "x" else "x" for value in key) + + def missing(self, key: tuple[int, int, str]) -> FormatSpecifier: + """ + Implement the missing method to return a default value. + """ + if not isinstance(key[-1], str): + raise KeyError(key) + if key[-1] != "x": + raise KeyError(f'Version must end with "x", got {key}') + max_patch = 0 + for version in self.keys(): + normalized_version = self.normalize_key(version) + if key[0] != normalized_version[0] or key[1] != normalized_version[1]: + continue + if len(normalized_version) == 2: + # The maximum is 0 + continue + patch = normalized_version[2] + if isinstance(patch, int) and patch > max_patch: + max_patch = patch + if max_patch == 0: + return self[key[0], key[1]] + return self[key[0], key[1], max_patch] diff --git a/beet/toolchain/project.py b/beet/toolchain/project.py index 15da5f3c..0b940a74 100644 --- a/beet/toolchain/project.py +++ b/beet/toolchain/project.py @@ -26,7 +26,6 @@ intersperse, log_time, normalize_string, - split_version, ) from beet.core.watch import DirectoryWatcher, FileChanges, detect_repeated_changes from beet.library.base import LATEST_MINECRAFT_VERSION, Mcmeta @@ -356,7 +355,7 @@ def bootstrap(self, ctx: Context): max_format_default: FormatSpecifier | None = None if self.config.minecraft: format = pack.pack_format_registry.get( - split_version(self.config.minecraft), pack.latest_pack_format + self.config.minecraft, pack.latest_pack_format ) else: format = pack.latest_pack_format diff --git a/examples/basic_latest_1_20/assets/test/models/test.json b/examples/basic_latest_1_20/assets/test/models/test.json new file mode 100644 index 00000000..6b9d7a1c --- /dev/null +++ b/examples/basic_latest_1_20/assets/test/models/test.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "test:item/test" + } +} \ No newline at end of file diff --git a/examples/basic_latest_1_20/beet.yml b/examples/basic_latest_1_20/beet.yml new file mode 100644 index 00000000..37ef54ac --- /dev/null +++ b/examples/basic_latest_1_20/beet.yml @@ -0,0 +1,12 @@ +resource_pack: + load: "." +data_pack: + load: "." + +minecraft: "1.20.x" + + +pipeline: + - pipeline + +output: dist \ No newline at end of file diff --git a/examples/basic_latest_1_20/data/test/function/test.mcfunction b/examples/basic_latest_1_20/data/test/function/test.mcfunction new file mode 100644 index 00000000..493d2be1 --- /dev/null +++ b/examples/basic_latest_1_20/data/test/function/test.mcfunction @@ -0,0 +1,3 @@ +say HI + + diff --git a/examples/basic_latest_1_20/pipeline.py b/examples/basic_latest_1_20/pipeline.py new file mode 100644 index 00000000..80157a7a --- /dev/null +++ b/examples/basic_latest_1_20/pipeline.py @@ -0,0 +1,5 @@ +from beet import Context + + +def beet_default(ctx: Context): + print(ctx.assets.min_format) diff --git a/pyproject.toml b/pyproject.toml index 2b7bd168..538a5cb3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,9 +58,9 @@ autoload = "beet.contrib.default" [tool.poetry.plugins.pytest11] beet = "beet.pytest_plugin" -[tool.pytest.ini_options] -addopts = "tests beet --ignore beet/__main__.py --doctest-modules" -doctest_optionflags = "NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL ELLIPSIS" +# [tool.pytest.ini_options] +# addopts = "tests beet --ignore beet/__main__.py --doctest-modules" +# doctest_optionflags = "NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL ELLIPSIS" [tool.pyright] typeCheckingMode = "basic" @@ -103,5 +103,5 @@ extensions = ["sphinx_inline_tabs"] sidebar_hide_name = true [build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api" +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/scripts/update_pack_format_registry.py b/scripts/update_pack_format_registry.py new file mode 100644 index 00000000..17365e58 --- /dev/null +++ b/scripts/update_pack_format_registry.py @@ -0,0 +1,21 @@ +#! +import json +from typing import Any +import requests +from importlib.resources import files +from beet.resources.pack_format_registry import pack_format_registry_path + +URL = "https://raw.githubusercontent.com/misode/mcmeta/refs/heads/summary/versions/data.json" + +r = requests.get(URL) +r.raise_for_status() + + +pack_format_registry: list[dict[str, Any]] = [] +for item in r.json(): + if item["type"] == "release": + pack_format_registry.append(item) + + +with open(str(pack_format_registry_path), "w") as f: + json.dump(pack_format_registry, f, indent=2) diff --git a/setup.py b/setup.py deleted file mode 100644 index b69efa28..00000000 --- a/setup.py +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env python - -# This is a shim to allow Github to detect the package, build is done with poetry - -import setuptools - -if __name__ == "__main__": - setuptools.setup(name="beet") diff --git a/tests/snapshots/examples__build_basic_latest_1_20__0.data_pack/data/test/functions/test.mcfunction b/tests/snapshots/examples__build_basic_latest_1_20__0.data_pack/data/test/functions/test.mcfunction new file mode 100644 index 00000000..493d2be1 --- /dev/null +++ b/tests/snapshots/examples__build_basic_latest_1_20__0.data_pack/data/test/functions/test.mcfunction @@ -0,0 +1,3 @@ +say HI + + diff --git a/tests/snapshots/examples__build_basic_latest_1_20__0.data_pack/pack.mcmeta b/tests/snapshots/examples__build_basic_latest_1_20__0.data_pack/pack.mcmeta new file mode 100644 index 00000000..ee5b64aa --- /dev/null +++ b/tests/snapshots/examples__build_basic_latest_1_20__0.data_pack/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "", + "pack_format": 41 + } +} diff --git a/tests/snapshots/examples__build_basic_latest_1_20__1.resource_pack/assets/test/models/test.json b/tests/snapshots/examples__build_basic_latest_1_20__1.resource_pack/assets/test/models/test.json new file mode 100644 index 00000000..6b9d7a1c --- /dev/null +++ b/tests/snapshots/examples__build_basic_latest_1_20__1.resource_pack/assets/test/models/test.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "test:item/test" + } +} \ No newline at end of file diff --git a/tests/snapshots/examples__build_basic_latest_1_20__1.resource_pack/pack.mcmeta b/tests/snapshots/examples__build_basic_latest_1_20__1.resource_pack/pack.mcmeta new file mode 100644 index 00000000..553f3c1a --- /dev/null +++ b/tests/snapshots/examples__build_basic_latest_1_20__1.resource_pack/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "", + "pack_format": 32 + } +} diff --git a/tests/snapshots/examples__build_load_overlay__0.data_pack/overlay1/data/demo/functions/foo.mcfunction b/tests/snapshots/examples__build_load_overlay__0.data_pack/overlay1/data/demo/function/foo.mcfunction similarity index 100% rename from tests/snapshots/examples__build_load_overlay__0.data_pack/overlay1/data/demo/functions/foo.mcfunction rename to tests/snapshots/examples__build_load_overlay__0.data_pack/overlay1/data/demo/function/foo.mcfunction diff --git a/tests/snapshots/examples__build_load_overlay__0.data_pack/overlay2/data/demo/functions/foo.mcfunction b/tests/snapshots/examples__build_load_overlay__0.data_pack/overlay2/data/demo/function/foo.mcfunction similarity index 100% rename from tests/snapshots/examples__build_load_overlay__0.data_pack/overlay2/data/demo/functions/foo.mcfunction rename to tests/snapshots/examples__build_load_overlay__0.data_pack/overlay2/data/demo/function/foo.mcfunction diff --git a/tests/snapshots/examples__build_minecraft_1_18__0.data_pack/pack.mcmeta b/tests/snapshots/examples__build_minecraft_1_18__0.data_pack/pack.mcmeta index 63cba6f8..348d7555 100644 --- a/tests/snapshots/examples__build_minecraft_1_18__0.data_pack/pack.mcmeta +++ b/tests/snapshots/examples__build_minecraft_1_18__0.data_pack/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "", - "pack_format": 9 + "pack_format": 8 } } diff --git a/tests/test_pack_registry_container_type.py b/tests/test_pack_registry_container_type.py new file mode 100644 index 00000000..4fa17d3c --- /dev/null +++ b/tests/test_pack_registry_container_type.py @@ -0,0 +1,16 @@ +from beet.library.data_pack import DataPack + + +def test_registry_data(): + assert DataPack.pack_format_registry.normalize_key("1.21") == (1, 21) + assert DataPack.pack_format_registry.normalize_key("1.21.1") == (1, 21, 1) + assert DataPack.pack_format_registry.normalize_key("1.21.x") == (1, 21, "x") + + assert DataPack.pack_format_registry.missing((1, 20, "x")) == 41 + assert DataPack.pack_format_registry.missing((1, 19, "x")) == 12 + + assert DataPack.pack_format_registry.get((1, 21, 10)) == (88, 0) + assert DataPack.pack_format_registry.get((1, 21, 9)) == (88, 0) + + assert DataPack.pack_format_registry.get((1, 20)) == 15 + assert DataPack.pack_format_registry.get((1, 18)) == 8