Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 37 additions & 16 deletions beet/library/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -775,15 +775,22 @@ def merge(self, other: "Mcmeta") -> bool: # type: ignore
overlays: Any = self.data.setdefault("overlays", {})
for entry in overlays.setdefault("entries", []):
if entry.get("directory") == other_entry.get("directory"):
entry["formats"] = deepcopy(other_entry.get("formats"))
if (value := deepcopy(other_entry.get("formats"))) is None:
entry.pop("formats", None)
else:
entry["formats"] = value
if (
x := deepcopy(other_entry.get("min_format"))
) is not None:
entry["min_format"] = x
value := deepcopy(other_entry.get("min_format"))
) is None:
entry.pop("min_format", None)
else:
entry["min_format"] = value
if (
x := deepcopy(other_entry.get("max_format"))
) is not None:
entry["max_format"] = x
value := deepcopy(other_entry.get("max_format"))
) is None:
entry.pop("max_format", None)
else:
entry["max_format"] = value
break
else:
overlays["entries"].append(deepcopy(other_entry))
Expand Down Expand Up @@ -1188,8 +1195,8 @@ def merge(
super().merge(other) # type: ignore

if isinstance(self, Pack) and isinstance(other, Pack):
self.extra.merge(other.extra) # type: ignore
self.overlays.merge(other.overlays) # type: ignore
self.extra.merge(other.extra) # type: ignore

empty_namespaces = [key for key, value in self.items() if not value] # type: ignore
for namespace in empty_namespaces:
Expand Down Expand Up @@ -1321,14 +1328,23 @@ def supported_formats(self, value: Optional[SupportedFormats]):
overlays: Any = self.overlay_parent.mcmeta.data.setdefault("overlays", {})
for entry in overlays.setdefault("entries", []):
if entry.get("directory") == self.overlay_name:
entry["formats"] = value
if value is None:
entry.pop("formats", None)
else:
entry["formats"] = value
break
else:
overlays["entries"].append(
{"formats": value, "directory": self.overlay_name}
)
if value is not None:
overlays["entries"].append(
{"formats": value, "directory": self.overlay_name}
)
else:
overlays["entries"].append({"directory": self.overlay_name})
else:
self.mcmeta.data.setdefault("pack", {})["supported_formats"] = value
if value is None:
self.mcmeta.data.setdefault("pack", {}).pop("supported_formats", None)
else:
self.mcmeta.data.setdefault("pack", {})["supported_formats"] = value

@property
def min_format(self) -> Optional[FormatSpecifier]:
Expand Down Expand Up @@ -1356,6 +1372,8 @@ def min_format(self, value: Optional[FormatSpecifier]):
overlays["entries"].append(
{"directory": self.overlay_name, "min_format": value}
)
else:
overlays["entries"].append({"directory": self.overlay_name})
pack = self.mcmeta.data.setdefault("pack", {})
if value is None:
pack.pop("min_format", None)
Expand Down Expand Up @@ -1384,9 +1402,12 @@ def max_format(self, value: Optional[FormatSpecifier]):
entry["max_format"] = value
break
else:
overlays["entries"].append(
{"directory": self.overlay_name, "max_format": value}
)
if value is None:
overlays["entries"].append({"directory": self.overlay_name})
else:
overlays["entries"].append(
{"directory": self.overlay_name, "max_format": value}
)
pack = self.mcmeta.data.setdefault("pack", {})
if value is None:
pack.pop("max_format", None)
Expand Down
2 changes: 1 addition & 1 deletion beet/toolchain/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ def build(self) -> Iterator[Context]:
project_root=self.root,
minecraft_version=self.config.minecraft or LATEST_MINECRAFT_VERSION,
directory=self.project.directory,
output_directory=self.project.output_directory,
output_directory=self.project.output_directory if self.root else None,
meta=meta,
cache=cache,
worker=stack.enter_context(self.project.worker_pool.handle()),
Expand Down
3 changes: 3 additions & 0 deletions examples/load_subproject_package_overlays_formats/beet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
require: [demo]

output: build
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from beet import Context, subproject


def beet_default(ctx: Context):
ctx.require(subproject("@demo"))
15 changes: 15 additions & 0 deletions examples/load_subproject_package_overlays_formats/demo/beet.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@



data_pack:
load: ["."]
min_format: 88
max_format: 88
overlays:
- directory: my_overlay
min_format: 85
max_format: 91
pack_format: 85


output: build
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
say HELLO
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"test": "original"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
say WORLD
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"test": "overlay"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
say HELLO
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"test": "original"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
say WORLD
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"test": "overlay"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"pack": {
"description": "",
"min_format": 88,
"max_format": 88
},
"overlays": {
"entries": [
{
"directory": "my_overlay",
"min_format": 85,
"max_format": 91
}
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"pack": {
"min_format": [
69,
0
],
"max_format": [
69,
0
],
"description": ""
}
}
61 changes: 61 additions & 0 deletions tests/test_data_pack.py
Original file line number Diff line number Diff line change
Expand Up @@ -795,6 +795,67 @@ def test_overlay():
assert s1 == s2
assert len(s1) == 6

a, b = DataPack(min_format=(88, 0), max_format=(88, 0)), DataPack(
min_format=(99, 0), max_format=(99, 0)
)
a.merge(b)
assert a.min_format == (99, 0)
assert a.max_format == (99, 0)
assert a.pack_format is None

a, b = DataPack(min_format=88, max_format=88), DataPack(
min_format=99, max_format=99
)
a.merge(b)
assert a.min_format == 99
assert a.max_format == 99
assert a.pack_format is None

a, b = DataPack(pack_format=88), DataPack(pack_format=99)
a.merge(b)
assert a.pack_format == 99
assert a.min_format is None
assert a.max_format is None

a, b = DataPack(min_format=(88, 0), max_format=(88, 0)), DataPack(pack_format=99)
a.merge(b)
assert a.pack_format == 99
assert a.min_format is None
assert a.max_format is None

a, b = DataPack(min_format=88, max_format=88), DataPack(pack_format=99)
overlay = b.overlays.setdefault("overlay")
overlay.min_format = 77
overlay.max_format = 77
a.merge(b)

assert a.pack_format == 99
assert a.min_format is None
assert a.max_format is None
assert a.overlays["overlay"].min_format == 77
assert a.overlays["overlay"].max_format == 77

a, b = DataPack(min_format=88, max_format=88), DataPack(
min_format=99, max_format=99
)
overlayA = a.overlays.setdefault("overlay")
overlayA.min_format = 66
overlayA.max_format = 66
overlayA.functions.setdefault("demo:thing", Function()).append("say hi from A")
overlayB = b.overlays.setdefault("overlay")
overlayB.min_format = 77
overlayB.max_format = 77
overlayB.functions.setdefault("demo:thing", Function()).append("say hi from B")
a.merge(b)
assert a.pack_format is None
assert a.min_format == 99
assert a.max_format == 99
assert a.overlays["overlay"].min_format == 77
assert a.overlays["overlay"].max_format == 77
assert a.overlays["overlay"].functions["demo:thing"].lines == [
"say hi from B",
]


def test_merge_overlays():
m = Mcmeta()
Expand Down