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 CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = "0.0.1"
1
+ __version__ = "0.2.1"
2
2
 
3
3
  from .plugin import *
@@ -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
- return
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,5 @@
1
+ from beet import Context
2
+
3
+
4
+ def gen_rp_overlays(ctx: Context, ctx_overlay: Context, directory: str):
5
+ return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: beet-observer
3
- Version: 0.1.0
3
+ Version: 0.2.1
4
4
  Summary: A beet plugin to automatically generate overlays from previous datapacks
5
5
  License: MIT
6
6
  Author: BPR02
@@ -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,,