From 921a4ac4ecfb6ecec060f9a201cdcff65e68a220 Mon Sep 17 00:00:00 2001 From: edayot Date: Sat, 17 Jan 2026 17:29:48 +0100 Subject: [PATCH 1/3] fix: list as root #491 --- packages/mecha/examples/list/beet.yaml | 8 +++++ .../list/data/test/function/test.mcfunction | 4 +++ packages/mecha/src/mecha/parse.py | 7 +++-- .../snapshots/examples__build_list__0.pack.md | 30 +++++++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 packages/mecha/examples/list/beet.yaml create mode 100644 packages/mecha/examples/list/data/test/function/test.mcfunction create mode 100644 packages/mecha/tests/snapshots/examples__build_list__0.pack.md diff --git a/packages/mecha/examples/list/beet.yaml b/packages/mecha/examples/list/beet.yaml new file mode 100644 index 000000000..9bfe8ec23 --- /dev/null +++ b/packages/mecha/examples/list/beet.yaml @@ -0,0 +1,8 @@ + + +data_pack: + load: . + + +pipeline: + - mecha \ No newline at end of file diff --git a/packages/mecha/examples/list/data/test/function/test.mcfunction b/packages/mecha/examples/list/data/test/function/test.mcfunction new file mode 100644 index 000000000..7bc1c81b8 --- /dev/null +++ b/packages/mecha/examples/list/data/test/function/test.mcfunction @@ -0,0 +1,4 @@ +item modify entity @s armor.feet [{function:"minecraft:set_components",components:{"minecraft:equippable":{slot:"feet",asset_id:"minecraft:netherite"}}}] + + +execute if predicate [{condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:5},{condition:"minecraft:value_check",value:0,range:0}]},{condition:"minecraft:reference",name:"test:l"}] run say aaa \ No newline at end of file diff --git a/packages/mecha/src/mecha/parse.py b/packages/mecha/src/mecha/parse.py index 953ab634b..024b191e7 100644 --- a/packages/mecha/src/mecha/parse.py +++ b/packages/mecha/src/mecha/parse.py @@ -238,6 +238,9 @@ def get_default_parsers() -> Dict[str, Parser]: "resource_location_or_nbt": AlternativeParser( [delegate("resource_location"), delegate("nbt_compound")] ), + "resource_location_or_nbt_list": AlternativeParser( + [delegate("resource_location_or_nbt"), delegate("nbt")] + ), "uuid": parse_uuid, "objective": BasicLiteralParser(AstObjective), "objective_criteria": BasicLiteralParser(AstObjectiveCriteria), @@ -513,10 +516,10 @@ def get_default_parsers() -> Dict[str, Parser]: delegate("resource_location_or_nbt") ), "command:argument:minecraft:loot_predicate": MultilineParser( - delegate("resource_location_or_nbt") + delegate("resource_location_or_nbt_list") ), "command:argument:minecraft:loot_modifier": MultilineParser( - delegate("resource_location_or_nbt") + delegate("resource_location_or_nbt_list") ), "command:argument:minecraft:game_profile": delegate("game_profile"), "command:argument:minecraft:gamemode": delegate("gamemode"), diff --git a/packages/mecha/tests/snapshots/examples__build_list__0.pack.md b/packages/mecha/tests/snapshots/examples__build_list__0.pack.md new file mode 100644 index 000000000..e114f12e0 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_list__0.pack.md @@ -0,0 +1,30 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "min_format": [ + 94, + 1 + ], + "max_format": [ + 94, + 1 + ], + "description": "" + } +} +``` + +### test + +`@function test:test` + +```mcfunction +item modify entity @s armor.feet [{function: "minecraft:set_components", components: {"minecraft:equippable": {slot: "feet", asset_id: "minecraft:netherite"}}}] +execute if predicate [{condition: "minecraft:all_of", terms: [{condition: "minecraft:random_chance", chance: 5}, {condition: "minecraft:value_check", value: 0, range: 0}]}, {condition: "minecraft:reference", name: "test:l"}] run say aaa +``` From 090bacbab64f97d21dde4afaf4181ea7009c70b9 Mon Sep 17 00:00:00 2001 From: edayot Date: Sat, 17 Jan 2026 18:46:47 +0100 Subject: [PATCH 2/3] implement NbtListParser --- packages/mecha/examples/basic_list/beet.yaml | 12 ++++++++++++ .../data/test/function/test.mcfunction | 18 +++++++++++++++++- packages/mecha/examples/list/beet.yaml | 8 -------- packages/mecha/src/mecha/parse.py | 12 +++++++++++- ...d => examples__build_basic_list__0.pack.md} | 1 + 5 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 packages/mecha/examples/basic_list/beet.yaml rename packages/mecha/examples/{list => basic_list}/data/test/function/test.mcfunction (54%) delete mode 100644 packages/mecha/examples/list/beet.yaml rename packages/mecha/tests/snapshots/{examples__build_list__0.pack.md => examples__build_basic_list__0.pack.md} (75%) diff --git a/packages/mecha/examples/basic_list/beet.yaml b/packages/mecha/examples/basic_list/beet.yaml new file mode 100644 index 000000000..a9808ace3 --- /dev/null +++ b/packages/mecha/examples/basic_list/beet.yaml @@ -0,0 +1,12 @@ + + +data_pack: + load: . + + +pipeline: + - mecha + +meta: + mecha: + multiline: true diff --git a/packages/mecha/examples/list/data/test/function/test.mcfunction b/packages/mecha/examples/basic_list/data/test/function/test.mcfunction similarity index 54% rename from packages/mecha/examples/list/data/test/function/test.mcfunction rename to packages/mecha/examples/basic_list/data/test/function/test.mcfunction index 7bc1c81b8..58e96ca5e 100644 --- a/packages/mecha/examples/list/data/test/function/test.mcfunction +++ b/packages/mecha/examples/basic_list/data/test/function/test.mcfunction @@ -1,4 +1,20 @@ item modify entity @s armor.feet [{function:"minecraft:set_components",components:{"minecraft:equippable":{slot:"feet",asset_id:"minecraft:netherite"}}}] -execute if predicate [{condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:5},{condition:"minecraft:value_check",value:0,range:0}]},{condition:"minecraft:reference",name:"test:l"}] run say aaa \ No newline at end of file +execute if predicate [{condition:"minecraft:all_of",terms:[{condition:"minecraft:random_chance",chance:5},{condition:"minecraft:value_check",value:0,range:0}]},{condition:"minecraft:reference",name:"test:l"}] run say aaa + + + +execute if predicate [ + { + condition:"minecraft:value_check", + name:"test:l", + value:0, + range:{min:0,max:2} + }, + [ + {condition:"minecraft:value_check",name:"test:l",value:0,range:{min:1,max:2}} + ] + ] run say bb + + diff --git a/packages/mecha/examples/list/beet.yaml b/packages/mecha/examples/list/beet.yaml deleted file mode 100644 index 9bfe8ec23..000000000 --- a/packages/mecha/examples/list/beet.yaml +++ /dev/null @@ -1,8 +0,0 @@ - - -data_pack: - load: . - - -pipeline: - - mecha \ No newline at end of file diff --git a/packages/mecha/src/mecha/parse.py b/packages/mecha/src/mecha/parse.py index 024b191e7..31707bdef 100644 --- a/packages/mecha/src/mecha/parse.py +++ b/packages/mecha/src/mecha/parse.py @@ -226,6 +226,7 @@ def get_default_parsers() -> Dict[str, Parser]: "nbt_compound_entry": nbt_parser.parse_compound_entry, "nbt_list_or_array_element": delegate("nbt"), "nbt_compound": NbtCompoundParser(delegate("nbt")), + "nbt_list": NbtListParser(delegate("nbt")), "adjacent_nbt_compound": AdjacentConstraint(delegate("nbt_compound"), r"\{"), "nbt_path": NbtPathParser( integer_parser=delegate("integer"), @@ -239,7 +240,7 @@ def get_default_parsers() -> Dict[str, Parser]: [delegate("resource_location"), delegate("nbt_compound")] ), "resource_location_or_nbt_list": AlternativeParser( - [delegate("resource_location_or_nbt"), delegate("nbt")] + [delegate("resource_location_or_nbt"), delegate("nbt_list")] ), "uuid": parse_uuid, "objective": BasicLiteralParser(AstObjective), @@ -1325,6 +1326,15 @@ class NbtCompoundParser(TypeConstraint): message: str = "Expected nbt compound." +@dataclass +class NbtListParser(TypeConstraint): + """Parser for nbt compounds.""" + + parser: Parser = field(default_factory=NbtParser) + type: Union[Type[Any], Tuple[Type[Any], ...]] = AstNbtList + message: str = "Expected list compound." + + @dataclass class AdjacentConstraint: """Constraint that ensures that there are no whitespace separators.""" diff --git a/packages/mecha/tests/snapshots/examples__build_list__0.pack.md b/packages/mecha/tests/snapshots/examples__build_basic_list__0.pack.md similarity index 75% rename from packages/mecha/tests/snapshots/examples__build_list__0.pack.md rename to packages/mecha/tests/snapshots/examples__build_basic_list__0.pack.md index e114f12e0..ca293a1de 100644 --- a/packages/mecha/tests/snapshots/examples__build_list__0.pack.md +++ b/packages/mecha/tests/snapshots/examples__build_basic_list__0.pack.md @@ -27,4 +27,5 @@ ```mcfunction item modify entity @s armor.feet [{function: "minecraft:set_components", components: {"minecraft:equippable": {slot: "feet", asset_id: "minecraft:netherite"}}}] execute if predicate [{condition: "minecraft:all_of", terms: [{condition: "minecraft:random_chance", chance: 5}, {condition: "minecraft:value_check", value: 0, range: 0}]}, {condition: "minecraft:reference", name: "test:l"}] run say aaa +execute if predicate [{condition: "minecraft:value_check", name: "test:l", value: 0, range: {min: 0, max: 2}}, [{condition: "minecraft:value_check", name: "test:l", value: 0, range: {min: 1, max: 2}}]] run say bb ``` From b977fe992129f3a793d041ebd5f3e24b7099ce83 Mon Sep 17 00:00:00 2001 From: edayot Date: Sat, 17 Jan 2026 20:42:39 +0100 Subject: [PATCH 3/3] applying suggestions --- packages/mecha/src/mecha/parse.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/mecha/src/mecha/parse.py b/packages/mecha/src/mecha/parse.py index 31707bdef..13292fea2 100644 --- a/packages/mecha/src/mecha/parse.py +++ b/packages/mecha/src/mecha/parse.py @@ -28,6 +28,7 @@ "JsonObjectParser", "NbtParser", "NbtCompoundParser", + "NbtListParser", "AdjacentConstraint", "ResourceLocationParser", "NoTagConstraint", @@ -1328,11 +1329,11 @@ class NbtCompoundParser(TypeConstraint): @dataclass class NbtListParser(TypeConstraint): - """Parser for nbt compounds.""" + """Parser for nbt list.""" parser: Parser = field(default_factory=NbtParser) type: Union[Type[Any], Tuple[Type[Any], ...]] = AstNbtList - message: str = "Expected list compound." + message: str = "Expected nbt list." @dataclass