beet-observer 0.1.0__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- beet_observer/__init__.py +1 -1
- beet_observer/data_pack.py +168 -0
- beet_observer/plugin.py +41 -2
- beet_observer/resource_pack.py +5 -0
- {beet_observer-0.1.0.dist-info → beet_observer-0.2.1.dist-info}/METADATA +1 -1
- beet_observer-0.2.1.dist-info/RECORD +8 -0
- beet_observer-0.1.0.dist-info/RECORD +0 -6
- {beet_observer-0.1.0.dist-info → beet_observer-0.2.1.dist-info}/LICENSE +0 -0
- {beet_observer-0.1.0.dist-info → beet_observer-0.2.1.dist-info}/WHEEL +0 -0
beet_observer/__init__.py
CHANGED
@@ -0,0 +1,168 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from beet import Context, NamespaceProxy
|
4
|
+
|
5
|
+
|
6
|
+
def gen_dp_overlays(ctx: Context, ctx_overlay: Context, overlay_dir: str) -> None:
|
7
|
+
"""
|
8
|
+
Generates overlays between two datapacks.
|
9
|
+
|
10
|
+
Keyword arguments:</br>
|
11
|
+
`ctx` -- the build context</br>
|
12
|
+
`ctx_overlay` -- the overlay context</br>
|
13
|
+
`overlay_dir` -- the directory of the overlay</br>
|
14
|
+
"""
|
15
|
+
# create list of all datapack file types
|
16
|
+
file_types: list[tuple[NamespaceProxy[Any], NamespaceProxy[Any]]] = [
|
17
|
+
(ctx.data.advancements, ctx_overlay.data.advancements),
|
18
|
+
(ctx.data.functions, ctx_overlay.data.functions),
|
19
|
+
(ctx.data.item_modifiers, ctx_overlay.data.item_modifiers),
|
20
|
+
(ctx.data.loot_tables, ctx_overlay.data.loot_tables),
|
21
|
+
(ctx.data.predicates, ctx_overlay.data.predicates),
|
22
|
+
(ctx.data.recipes, ctx_overlay.data.recipes),
|
23
|
+
(ctx.data.trim_pattern, ctx_overlay.data.trim_pattern),
|
24
|
+
(ctx.data.trim_material, ctx_overlay.data.trim_material),
|
25
|
+
(ctx.data.structures, ctx_overlay.data.structures),
|
26
|
+
(ctx.data.chat_type, ctx_overlay.data.chat_type),
|
27
|
+
(ctx.data.damage_type, ctx_overlay.data.damage_type),
|
28
|
+
(ctx.data.banner_patterns, ctx_overlay.data.banner_patterns),
|
29
|
+
(ctx.data.wolf_variants, ctx_overlay.data.wolf_variants),
|
30
|
+
(ctx.data.enchantments, ctx_overlay.data.enchantments),
|
31
|
+
(ctx.data.enchantment_providers, ctx_overlay.data.enchantment_providers),
|
32
|
+
(ctx.data.jukebox_songs, ctx_overlay.data.jukebox_songs),
|
33
|
+
(ctx.data.painting_variants, ctx_overlay.data.painting_variants),
|
34
|
+
(ctx.data.block_tags, ctx_overlay.data.block_tags),
|
35
|
+
(ctx.data.entity_type_tags, ctx_overlay.data.entity_type_tags),
|
36
|
+
(ctx.data.fluid_tags, ctx_overlay.data.fluid_tags),
|
37
|
+
(ctx.data.function_tags, ctx_overlay.data.function_tags),
|
38
|
+
(ctx.data.game_event_tags, ctx_overlay.data.game_event_tags),
|
39
|
+
(ctx.data.item_tags, ctx_overlay.data.item_tags),
|
40
|
+
(ctx.data.chat_type_tags, ctx_overlay.data.chat_type_tags),
|
41
|
+
(ctx.data.damage_type_tags, ctx_overlay.data.damage_type_tags),
|
42
|
+
(ctx.data.banner_pattern_tags, ctx_overlay.data.banner_pattern_tags),
|
43
|
+
(ctx.data.cat_variant_tags, ctx_overlay.data.cat_variant_tags),
|
44
|
+
(ctx.data.enchantment_tags, ctx_overlay.data.enchantment_tags),
|
45
|
+
(ctx.data.instrument_tags, ctx_overlay.data.instrument_tags),
|
46
|
+
(ctx.data.painting_variant_tags, ctx_overlay.data.painting_variant_tags),
|
47
|
+
(
|
48
|
+
ctx.data.point_of_interest_type_tags,
|
49
|
+
ctx_overlay.data.point_of_interest_type_tags,
|
50
|
+
),
|
51
|
+
]
|
52
|
+
# for each file type, check for required overlays
|
53
|
+
for registry, registry_overlay in file_types:
|
54
|
+
check_registry(ctx, ctx_overlay, overlay_dir, registry, registry_overlay)
|
55
|
+
|
56
|
+
# get pack.mcmeta overlay entries
|
57
|
+
mcmeta: dict[str, dict[str, list[dict[str, Any]]]] = ctx.data.mcmeta.data.copy()
|
58
|
+
if "overlays" not in mcmeta:
|
59
|
+
mcmeta["overlays"] = {}
|
60
|
+
if "entries" not in mcmeta["overlays"]:
|
61
|
+
mcmeta["overlays"]["entries"] = []
|
62
|
+
entries = mcmeta["overlays"]["entries"]
|
63
|
+
|
64
|
+
# add overlays to pack.mcmeta
|
65
|
+
for overlay in ctx.data.overlays:
|
66
|
+
# check if it's the top-level overlay
|
67
|
+
if overlay == ctx.meta["observer"]["default_dir_dp"]:
|
68
|
+
# delete pack.mcmeta from overlay (required for tests)
|
69
|
+
default_dir = ctx.meta["observer"]["default_dir_dp"]
|
70
|
+
if ctx.data.overlays[default_dir].mcmeta:
|
71
|
+
del ctx.data.overlays[default_dir].mcmeta
|
72
|
+
|
73
|
+
# get pack format from build context
|
74
|
+
if "default_format" in ctx.meta["observer"]:
|
75
|
+
formats = ctx.meta["observer"]["default_format"]
|
76
|
+
else:
|
77
|
+
formats = ctx.data.mcmeta.data["pack"]["pack_format"]
|
78
|
+
else:
|
79
|
+
# get formats from overlay pack
|
80
|
+
if "supported_formats" in ctx_overlay.data.mcmeta.data["pack"]:
|
81
|
+
formats = ctx_overlay.data.mcmeta.data["pack"]["supported_formats"]
|
82
|
+
else:
|
83
|
+
formats = ctx_overlay.data.mcmeta.data["pack"]["pack_format"]
|
84
|
+
|
85
|
+
# update pack.mcmeta overlay entries
|
86
|
+
entries.append(
|
87
|
+
{
|
88
|
+
"formats": formats,
|
89
|
+
"directory": overlay,
|
90
|
+
}
|
91
|
+
)
|
92
|
+
|
93
|
+
# save overlay entries in pack.mcmeta
|
94
|
+
if len(entries) > 0:
|
95
|
+
ctx.data.mcmeta.data.update({"overlays": {"entries": entries}})
|
96
|
+
|
97
|
+
|
98
|
+
def check_registry(
|
99
|
+
ctx: Context,
|
100
|
+
ctx_overlay: Context,
|
101
|
+
overlay_dir: str,
|
102
|
+
registry: NamespaceProxy[Any],
|
103
|
+
registry_overlay: NamespaceProxy[Any],
|
104
|
+
) -> None:
|
105
|
+
"""
|
106
|
+
Generates overlays for each namespace proxy.
|
107
|
+
|
108
|
+
Keyword arguments:</br>
|
109
|
+
`ctx` -- the build context</br>
|
110
|
+
`ctx_overlay` -- the overlay context</br>
|
111
|
+
`overlay_dir` -- the directory of the overlay</br>
|
112
|
+
`registry` -- the namespace proxy from the build context</br>
|
113
|
+
`registry_overlay` -- the namespace proxy from the overlay context</br>
|
114
|
+
"""
|
115
|
+
# check each file in the build pack
|
116
|
+
for name in list(registry):
|
117
|
+
if name in registry_overlay:
|
118
|
+
# exists in both, so check if an overlay is needed
|
119
|
+
gen_registry_overlay(ctx, overlay_dir, name, registry, registry_overlay)
|
120
|
+
else:
|
121
|
+
# exists only in overlay, so create a deletion overlay
|
122
|
+
gen_registry_overlay(
|
123
|
+
ctx, overlay_dir, name, registry, registry_overlay, "deletion"
|
124
|
+
)
|
125
|
+
|
126
|
+
# for all remaining files (of this type) in the overlay pack, add to build pack as an overlay
|
127
|
+
for name in list(registry_overlay):
|
128
|
+
gen_registry_overlay(
|
129
|
+
ctx, overlay_dir, name, registry, registry_overlay, "addition"
|
130
|
+
)
|
131
|
+
|
132
|
+
|
133
|
+
def gen_registry_overlay(
|
134
|
+
ctx: Context,
|
135
|
+
overlay_dir: str,
|
136
|
+
name: str,
|
137
|
+
registry: NamespaceProxy[Any],
|
138
|
+
registry_overlay: NamespaceProxy[Any],
|
139
|
+
type: str = "",
|
140
|
+
) -> None:
|
141
|
+
"""
|
142
|
+
Checks if two functions have the same contents and generate an overlay if they don't.
|
143
|
+
|
144
|
+
Keyword arguments:</br>
|
145
|
+
`ctx` -- the build context</br>
|
146
|
+
`overlay_dir` -- the directory of the generated overlay</br>
|
147
|
+
`name` -- the name of the file</br>
|
148
|
+
`registry` -- the namespace proxy from the build context</br>
|
149
|
+
`registry_overlay` -- the namespace proxy from the overlay context</br>
|
150
|
+
`type` -- either "deletion" or "addition" (default: `""`)</br>
|
151
|
+
"""
|
152
|
+
if type == "deletion":
|
153
|
+
# move file from build pack to overlay in build pack
|
154
|
+
default_dir = ctx.meta["observer"]["default_dir_dp"]
|
155
|
+
ctx.data.overlays[default_dir][name] = registry[name]
|
156
|
+
del registry[name]
|
157
|
+
elif type == "addition":
|
158
|
+
# move function from overlay pack to overlay in build pack
|
159
|
+
ctx.data.overlays[overlay_dir][name] = registry_overlay[name]
|
160
|
+
else:
|
161
|
+
# check if files are exactly the same
|
162
|
+
if registry[name] != registry_overlay[name]:
|
163
|
+
# move function from overlay pack to overlay in build pack
|
164
|
+
ctx.data.overlays[overlay_dir][name] = registry_overlay[name]
|
165
|
+
|
166
|
+
# remove file from overlay pack
|
167
|
+
if name in registry_overlay:
|
168
|
+
del registry_overlay[name]
|
beet_observer/plugin.py
CHANGED
@@ -1,5 +1,44 @@
|
|
1
|
-
from beet import Context
|
1
|
+
from beet import Context, run_beet
|
2
|
+
|
3
|
+
from .data_pack import *
|
4
|
+
from .resource_pack import *
|
2
5
|
|
3
6
|
|
4
7
|
def beet_default(ctx: Context):
|
5
|
-
|
8
|
+
if "observer" not in ctx.meta:
|
9
|
+
return
|
10
|
+
# get default directories
|
11
|
+
if "default_dir" not in ctx.meta["observer"]:
|
12
|
+
# default dir not defined
|
13
|
+
ctx.meta["observer"]["default_dir_dp"] = "default_overlay"
|
14
|
+
ctx.meta["observer"]["default_dir_rp"] = "default_overlay"
|
15
|
+
elif isinstance(ctx.meta["observer"]["default_dir"], str):
|
16
|
+
# default dir is the same for dp and rp
|
17
|
+
ctx.meta["observer"]["default_dir_dp"] = ctx.meta["observer"]["default_dir"]
|
18
|
+
ctx.meta["observer"]["default_dir_rp"] = ctx.meta["observer"]["default_dir"]
|
19
|
+
else:
|
20
|
+
# default dir is different for dp and rp
|
21
|
+
ctx.meta["observer"]["default_dir_dp"] = ctx.meta["observer"]["default_dir"][
|
22
|
+
"dp"
|
23
|
+
]
|
24
|
+
ctx.meta["observer"]["default_dir_rp"] = ctx.meta["observer"]["default_dir"][
|
25
|
+
"rp"
|
26
|
+
]
|
27
|
+
# loop through all overlays
|
28
|
+
for overlay in ctx.meta["observer"]["overlays"]:
|
29
|
+
# create relative path
|
30
|
+
path = f"{ctx.directory}/{overlay['process']}"
|
31
|
+
# generate context for overlay pack
|
32
|
+
with run_beet(
|
33
|
+
config={"data_pack": {"load": "."}, "resource_pack": {"load": "."}},
|
34
|
+
directory=path,
|
35
|
+
) as ctx_overlay:
|
36
|
+
if "directory" not in overlay:
|
37
|
+
dp_dir = f"overlay_{ctx_overlay.data.pack_format}"
|
38
|
+
rp_dir = f"overlay_{ctx_overlay.assets.pack_format}"
|
39
|
+
else:
|
40
|
+
dp_dir = overlay["directory"]
|
41
|
+
rp_dir = overlay["directory"]
|
42
|
+
# compare build pack and overlay pack
|
43
|
+
gen_dp_overlays(ctx, ctx_overlay, dp_dir)
|
44
|
+
gen_rp_overlays(ctx, ctx_overlay, rp_dir)
|
@@ -0,0 +1,8 @@
|
|
1
|
+
beet_observer/__init__.py,sha256=wrNZq4cbCCTtIPOQhShOufEQmAhkL5Ww1yOOzF74DTw,45
|
2
|
+
beet_observer/data_pack.py,sha256=OYGy9vDePpWyDhVpTl2Y-P49UEhsivihOqo17dfNKTM,7166
|
3
|
+
beet_observer/plugin.py,sha256=DGpWvV2q6yeJ_EyBLShigZl4dutN2yCFDKzzcCGiu8o,1808
|
4
|
+
beet_observer/resource_pack.py,sha256=ePNdQjeMrEKEkLdDBsnHcMdrne8g505Cd8vfzX5S_cc,111
|
5
|
+
beet_observer-0.2.1.dist-info/LICENSE,sha256=oBbP6j7sgG9darFSRZxV7iO8yPR1aZiDspSK3mcLpXI,1062
|
6
|
+
beet_observer-0.2.1.dist-info/METADATA,sha256=WUsicEsv5Vs3qknF4a_rb9KuwQT2QR5WjMPP9lLHnIs,633
|
7
|
+
beet_observer-0.2.1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
8
|
+
beet_observer-0.2.1.dist-info/RECORD,,
|
@@ -1,6 +0,0 @@
|
|
1
|
-
beet_observer/__init__.py,sha256=8wK7UYe2MSHQIJxHDkITKHHyF12XajTz0V6ch1WRbcc,45
|
2
|
-
beet_observer/plugin.py,sha256=WduK3CPT2uVndkKst9yOzXWrU2gqafNXi3A0s7BXlcw,70
|
3
|
-
beet_observer-0.1.0.dist-info/LICENSE,sha256=oBbP6j7sgG9darFSRZxV7iO8yPR1aZiDspSK3mcLpXI,1062
|
4
|
-
beet_observer-0.1.0.dist-info/METADATA,sha256=BJ2V2Y0qO4QMXTUauoQb-u8yma_R8mLDyy4VZ2jOqXY,633
|
5
|
-
beet_observer-0.1.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
6
|
-
beet_observer-0.1.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|