From ca1b3bbd49ee45508efc974fabb33a8a8fd23b78 Mon Sep 17 00:00:00 2001 From: edayot Date: Mon, 2 Mar 2026 19:40:24 +0100 Subject: [PATCH 1/5] support for empty filename in beet --- examples/code_void/add_header.py | 9 +++++++++ examples/code_void/beet.yaml | 10 ++++++++++ .../code_void/data/test/functions/...mcfunction | 0 .../code_void/data/test/functions/..mcfunction | 0 examples/code_void/data/test/functions/.mcfunction | 0 .../data/test/functions/.mcfunction.mcfunction | 0 .../functions/.mcfunction.mcfunction.mcfunction | 0 .../code_void/data/test/functions/a.mcfunction | 0 .../data/test/functions/a.py.git.mcfunction | 0 .../code_void/data/test/functions/a/...mcfunction | 0 .../code_void/data/test/functions/a/..mcfunction | 0 .../code_void/data/test/functions/a/.mcfunction | 0 .../data/test/functions/a/.mcfunction.mcfunction | 0 .../code_void/data/test/functions/a/a.mcfunction | 0 .../data/test/functions/a/a.py.git.mcfunction | 0 src/beet/library/base.py | 2 -- src/beet/library/utils.py | 14 +++++++++++++- .../data/namespace/function/.mcfunction | 1 + .../data/namespace/function/a/.mcfunction | 1 + .../data/test/function/...mcfunction | 1 + .../data/test/function/..mcfunction | 1 + .../data/test/function/.mcfunction | 1 + .../data/test/function/.mcfunction.mcfunction | 1 + .../function/.mcfunction.mcfunction.mcfunction | 1 + .../data/test/function/a.mcfunction | 1 + .../data/test/function/a.py.git.mcfunction | 1 + .../data/test/function/a/...mcfunction | 1 + .../data/test/function/a/..mcfunction | 1 + .../data/test/function/a/.mcfunction | 1 + .../data/test/function/a/.mcfunction.mcfunction | 1 + .../data/test/function/a/a.mcfunction | 1 + .../data/test/function/a/a.py.git.mcfunction | 1 + .../pack.mcmeta | 13 +++++++++++++ .../pack.mcmeta | 13 +++++++++++++ 34 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 examples/code_void/add_header.py create mode 100644 examples/code_void/beet.yaml create mode 100644 examples/code_void/data/test/functions/...mcfunction create mode 100644 examples/code_void/data/test/functions/..mcfunction create mode 100644 examples/code_void/data/test/functions/.mcfunction create mode 100644 examples/code_void/data/test/functions/.mcfunction.mcfunction create mode 100644 examples/code_void/data/test/functions/.mcfunction.mcfunction.mcfunction create mode 100644 examples/code_void/data/test/functions/a.mcfunction create mode 100644 examples/code_void/data/test/functions/a.py.git.mcfunction create mode 100644 examples/code_void/data/test/functions/a/...mcfunction create mode 100644 examples/code_void/data/test/functions/a/..mcfunction create mode 100644 examples/code_void/data/test/functions/a/.mcfunction create mode 100644 examples/code_void/data/test/functions/a/.mcfunction.mcfunction create mode 100644 examples/code_void/data/test/functions/a/a.mcfunction create mode 100644 examples/code_void/data/test/functions/a/a.py.git.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/a/.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/...mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/..mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.py.git.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/...mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/..mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.py.git.mcfunction create mode 100644 tests/snapshots/examples__build_code_void__0.data_pack/pack.mcmeta create mode 100644 tests/snapshots/examples__build_code_void__1.resource_pack/pack.mcmeta diff --git a/examples/code_void/add_header.py b/examples/code_void/add_header.py new file mode 100644 index 000000000..afeeb48ea --- /dev/null +++ b/examples/code_void/add_header.py @@ -0,0 +1,9 @@ +from beet import Context, Function + + +def beet_default(ctx: Context): + for f in ctx.data.functions.keys(): + ctx.data.functions[f] = Function(f"say {f}") + + ctx.data.functions["namespace:"] = Function("give me sugar") + ctx.data.functions["namespace:a/"] = Function("give me apple") diff --git a/examples/code_void/beet.yaml b/examples/code_void/beet.yaml new file mode 100644 index 000000000..6ff5ba1b2 --- /dev/null +++ b/examples/code_void/beet.yaml @@ -0,0 +1,10 @@ +data_pack: + load: [.] +resource_pack: + load: [.] + +output: build + + +pipeline: + - add_header diff --git a/examples/code_void/data/test/functions/...mcfunction b/examples/code_void/data/test/functions/...mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/..mcfunction b/examples/code_void/data/test/functions/..mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/.mcfunction b/examples/code_void/data/test/functions/.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/.mcfunction.mcfunction b/examples/code_void/data/test/functions/.mcfunction.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/.mcfunction.mcfunction.mcfunction b/examples/code_void/data/test/functions/.mcfunction.mcfunction.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a.mcfunction b/examples/code_void/data/test/functions/a.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a.py.git.mcfunction b/examples/code_void/data/test/functions/a.py.git.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a/...mcfunction b/examples/code_void/data/test/functions/a/...mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a/..mcfunction b/examples/code_void/data/test/functions/a/..mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a/.mcfunction b/examples/code_void/data/test/functions/a/.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a/.mcfunction.mcfunction b/examples/code_void/data/test/functions/a/.mcfunction.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a/a.mcfunction b/examples/code_void/data/test/functions/a/a.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/examples/code_void/data/test/functions/a/a.py.git.mcfunction b/examples/code_void/data/test/functions/a/a.py.git.mcfunction new file mode 100644 index 000000000..e69de29bb diff --git a/src/beet/library/base.py b/src/beet/library/base.py index 12060e462..9e6ca18ec 100644 --- a/src/beet/library/base.py +++ b/src/beet/library/base.py @@ -696,8 +696,6 @@ class NamespaceProxy( def split_key(self, key: str) -> Tuple[str, str]: namespace, _, file_path = key.partition(":") - if not file_path: - raise KeyError(key) return namespace, file_path def join_key(self, key1: str, key2: str) -> str: diff --git a/src/beet/library/utils.py b/src/beet/library/utils.py index 9b158c02d..35b6e6ba7 100644 --- a/src/beet/library/utils.py +++ b/src/beet/library/utils.py @@ -62,10 +62,22 @@ def list_origin_folders(prefix: str, origin: FileOrigin) -> Dict[str, List[PureP return folders +def modified_suffixes(path: PurePath) -> List[str]: + """ + Equivalent to path.suffixes but support file with empty name + """ + name = path.name + if name.endswith("."): + return [] + if name.startswith("."): + name = name[1:] + return ["." + suffix for suffix in name.split(".")] + return path.suffixes + def list_extensions(path: PurePath) -> List[str]: extensions: List[str] = list( - accumulate(reversed(path.suffixes), lambda a, b: b + a) + accumulate(reversed(modified_suffixes(path)), lambda a, b: b + a) ) extensions.reverse() extensions.append("") diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/.mcfunction new file mode 100644 index 000000000..270f0d31e --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/.mcfunction @@ -0,0 +1 @@ +give me sugar \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/a/.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/a/.mcfunction new file mode 100644 index 000000000..97977d59e --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/namespace/function/a/.mcfunction @@ -0,0 +1 @@ +give me apple \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/...mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/...mcfunction new file mode 100644 index 000000000..7cf0f2d50 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/...mcfunction @@ -0,0 +1 @@ +say test:.. \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/..mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/..mcfunction new file mode 100644 index 000000000..8221fa324 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/..mcfunction @@ -0,0 +1 @@ +say test:. \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction new file mode 100644 index 000000000..a7e868a82 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction @@ -0,0 +1 @@ +say test: \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction new file mode 100644 index 000000000..3768548ff --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction @@ -0,0 +1 @@ +say test:.mcfunction \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction.mcfunction new file mode 100644 index 000000000..da3c1bc44 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/.mcfunction.mcfunction.mcfunction @@ -0,0 +1 @@ +say test:.mcfunction.mcfunction \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.mcfunction new file mode 100644 index 000000000..cc2102487 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.mcfunction @@ -0,0 +1 @@ +say test:a \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.py.git.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.py.git.mcfunction new file mode 100644 index 000000000..bcf19adaa --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a.py.git.mcfunction @@ -0,0 +1 @@ +say test:a.py.git \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/...mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/...mcfunction new file mode 100644 index 000000000..f9e1589cf --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/...mcfunction @@ -0,0 +1 @@ +say test:a/.. \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/..mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/..mcfunction new file mode 100644 index 000000000..e470c398e --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/..mcfunction @@ -0,0 +1 @@ +say test:a/. \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction new file mode 100644 index 000000000..7282533ca --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction @@ -0,0 +1 @@ +say test:a/ \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction.mcfunction new file mode 100644 index 000000000..109384e11 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/.mcfunction.mcfunction @@ -0,0 +1 @@ +say test:a/.mcfunction \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.mcfunction new file mode 100644 index 000000000..71bd910fc --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.mcfunction @@ -0,0 +1 @@ +say test:a/a \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.py.git.mcfunction b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.py.git.mcfunction new file mode 100644 index 000000000..72778d120 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/data/test/function/a/a.py.git.mcfunction @@ -0,0 +1 @@ +say test:a/a.py.git \ No newline at end of file diff --git a/tests/snapshots/examples__build_code_void__0.data_pack/pack.mcmeta b/tests/snapshots/examples__build_code_void__0.data_pack/pack.mcmeta new file mode 100644 index 000000000..48d78feb1 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/pack.mcmeta @@ -0,0 +1,13 @@ +{ + "pack": { + "min_format": [ + 94, + 1 + ], + "max_format": [ + 94, + 1 + ], + "description": "" + } +} diff --git a/tests/snapshots/examples__build_code_void__1.resource_pack/pack.mcmeta b/tests/snapshots/examples__build_code_void__1.resource_pack/pack.mcmeta new file mode 100644 index 000000000..30f6abde7 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__1.resource_pack/pack.mcmeta @@ -0,0 +1,13 @@ +{ + "pack": { + "min_format": [ + 75, + 0 + ], + "max_format": [ + 75, + 0 + ], + "description": "" + } +} From 63f5a982602dd9f55f4a9070713a45e12c58c77f Mon Sep 17 00:00:00 2001 From: edayot Date: Sat, 7 Mar 2026 17:06:44 +0100 Subject: [PATCH 2/5] feat: support for empty path in bolt & mecha --- .../bolt/examples/bolt_empty_path/beet.yml | 8 +++ .../src/data/demo/functions/.mcfunction | 23 +++++++++ packages/bolt/src/bolt/parse.py | 4 +- ...examples__build_bolt_empty_path__0.pack.md | 51 +++++++++++++++++++ .../mecha/examples/mecha_empty_path/beet.yml | 7 +++ .../data/name/function/test.mcfunction | 5 ++ packages/mecha/src/mecha/parse.py | 17 ++++++- ...xamples__build_mecha_empty_path__0.pack.md | 32 ++++++++++++ 8 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 packages/bolt/examples/bolt_empty_path/beet.yml create mode 100644 packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction create mode 100644 packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md create mode 100644 packages/mecha/examples/mecha_empty_path/beet.yml create mode 100644 packages/mecha/examples/mecha_empty_path/data/name/function/test.mcfunction create mode 100644 packages/mecha/tests/snapshots/examples__build_mecha_empty_path__0.pack.md diff --git a/packages/bolt/examples/bolt_empty_path/beet.yml b/packages/bolt/examples/bolt_empty_path/beet.yml new file mode 100644 index 000000000..3993c05c4 --- /dev/null +++ b/packages/bolt/examples/bolt_empty_path/beet.yml @@ -0,0 +1,8 @@ +require: + - bolt +data_pack: + load: [src] +pipeline: + - mecha + +output: build \ No newline at end of file diff --git a/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction b/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction new file mode 100644 index 000000000..649d48a98 --- /dev/null +++ b/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction @@ -0,0 +1,23 @@ + + +# defining a function inline to run it +execute run function ./bar: + say fooo + +# just defining a function +function ./foo: + say barr + +# calling an empty function +function dm: + +# next command +say YOLO + +# defining a function +function namespace:error: + say error + + + + diff --git a/packages/bolt/src/bolt/parse.py b/packages/bolt/src/bolt/parse.py index f521faa42..1869a9247 100644 --- a/packages/bolt/src/bolt/parse.py +++ b/packages/bolt/src/bolt/parse.py @@ -88,7 +88,9 @@ CommentDisambiguation, CompilationDatabase, MultilineParser, + NoTagConstraint, Parser, + ResourceLocationParser, consume_line_continuation, delegate, get_stream_properties, @@ -317,7 +319,7 @@ def get_bolt_parsers( literal_parser=delegate("bolt:macro_literal"), argument_parser=delegate("bolt:macro_argument"), resource_location_parser=DisableInterpolationParser( - delegate("resource_location") + NoTagConstraint(ResourceLocationParser(allow_empty_path=False)) ), json_properties_parser=DisableInterpolationParser( AdjacentConstraint(MultilineParser(delegate("json_object")), r"\{") diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md new file mode 100644 index 000000000..f135ef0f4 --- /dev/null +++ b/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md @@ -0,0 +1,51 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "min_format": [ + 94, + 1 + ], + "max_format": [ + 94, + 1 + ], + "description": "" + } +} +``` + +### demo + +`@function demo:` + +```mcfunction +function demo:bar +function dm: +say YOLO +``` + +`@function demo:bar` + +```mcfunction +say fooo +``` + +`@function demo:foo` + +```mcfunction +say barr +``` + +### namespace + +`@function namespace:error` + +```mcfunction +say error +``` diff --git a/packages/mecha/examples/mecha_empty_path/beet.yml b/packages/mecha/examples/mecha_empty_path/beet.yml new file mode 100644 index 000000000..add9459b5 --- /dev/null +++ b/packages/mecha/examples/mecha_empty_path/beet.yml @@ -0,0 +1,7 @@ + + +data_pack: + load: . + +pipeline: + - mecha \ No newline at end of file diff --git a/packages/mecha/examples/mecha_empty_path/data/name/function/test.mcfunction b/packages/mecha/examples/mecha_empty_path/data/name/function/test.mcfunction new file mode 100644 index 000000000..fd1905979 --- /dev/null +++ b/packages/mecha/examples/mecha_empty_path/data/name/function/test.mcfunction @@ -0,0 +1,5 @@ +function jojo: +function jojo +function jojo:bar + +data modify storage dm: test set value "" diff --git a/packages/mecha/src/mecha/parse.py b/packages/mecha/src/mecha/parse.py index 13292fea2..2333f12b6 100644 --- a/packages/mecha/src/mecha/parse.py +++ b/packages/mecha/src/mecha/parse.py @@ -67,6 +67,8 @@ "NUMBER_PATTERN", "JSON_STRING_PATTERN", "NBT_QUOTED_STRING_PATTERN", + "RESOURCE_LOCATION_PATTERN", + "RESOURCE_LOCATION_REQUIRE_PATH_PATTERN", ] @@ -1351,12 +1353,25 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) +RESOURCE_LOCATION_PATTERN = r"#?(?:[0-9a-z_\-\.]+:(?:[0-9a-z_./-]+|(?![ \t\r]*\n[ \t]+\S))|[0-9a-z_./-]+)" +RESOURCE_LOCATION_REQUIRE_PATH_PATTERN = ( + r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+" +) + + @dataclass class ResourceLocationParser: """Parser for resource locations.""" + allow_empty_path: bool = True + def __call__(self, stream: TokenStream) -> AstResourceLocation: - with stream.syntax(resource_location=r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+"): + pattern = ( + RESOURCE_LOCATION_PATTERN + if self.allow_empty_path + else RESOURCE_LOCATION_REQUIRE_PATH_PATTERN + ) + with stream.syntax(resource_location=pattern): token = stream.expect("resource_location") value = token.value diff --git a/packages/mecha/tests/snapshots/examples__build_mecha_empty_path__0.pack.md b/packages/mecha/tests/snapshots/examples__build_mecha_empty_path__0.pack.md new file mode 100644 index 000000000..991cfc283 --- /dev/null +++ b/packages/mecha/tests/snapshots/examples__build_mecha_empty_path__0.pack.md @@ -0,0 +1,32 @@ +# Lectern snapshot + +## Data pack + +`@data_pack pack.mcmeta` + +```json +{ + "pack": { + "min_format": [ + 94, + 1 + ], + "max_format": [ + 94, + 1 + ], + "description": "" + } +} +``` + +### name + +`@function name:test` + +```mcfunction +function jojo: +function jojo +function jojo:bar +data modify storage dm: test set value "" +``` From 42ff1a4dba85bd9f87e2c5875aee591428617f07 Mon Sep 17 00:00:00 2001 From: edayot Date: Sat, 7 Mar 2026 17:24:12 +0100 Subject: [PATCH 3/5] testing limits --- .../src/data/demo/functions/.mcfunction | 29 +++++++ ...examples__build_bolt_empty_path__0.pack.md | 76 +++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction b/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction index 649d48a98..68c945452 100644 --- a/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction +++ b/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction @@ -17,7 +17,36 @@ say YOLO # defining a function function namespace:error: say error + execute run function ~/nested: + say from nested 1 + execute run function ~/nested: + say from nested 2 +#defining an empty function +function namespace:: + say hello from empty function + execute run function ~/nested: + say from nested 1 + execute run function ~/nested: + say from nested 2 + + +function namespace:defining/: + say weird syntax but it work + execute run function ~/nested: + say from nested 1 + execute run function ~/nested: + say from nested 2 + + +function dm:: + say definig this function referenced + + execute run function ~/nested: + say from nested 1 + execute run function ~/nested: + say from nested 2 + diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md index f135ef0f4..7186ef420 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md @@ -44,8 +44,84 @@ say barr ### namespace +`@function namespace:error/nested/nested` + +```mcfunction +say from nested 2 +``` + +`@function namespace:error/nested` + +```mcfunction +say from nested 1 +function namespace:error/nested/nested +``` + +`@function namespace:nested/nested` + +```mcfunction +say from nested 2 +``` + +`@function namespace:nested` + +```mcfunction +say from nested 1 +function namespace:nested/nested +``` + +`@function namespace:defining/nested/nested` + +```mcfunction +say from nested 2 +``` + +`@function namespace:defining/nested` + +```mcfunction +say from nested 1 +function namespace:defining/nested/nested +``` + `@function namespace:error` ```mcfunction say error +function namespace:error/nested +``` + +`@function namespace:` + +```mcfunction +say hello from empty function +function namespace:nested +``` + +`@function namespace:defining/` + +```mcfunction +say weird syntax but it work +function namespace:defining/nested +``` + +### dm + +`@function dm:nested/nested` + +```mcfunction +say from nested 2 +``` + +`@function dm:nested` + +```mcfunction +say from nested 1 +function dm:nested/nested +``` + +`@function dm:` + +```mcfunction +say definig this function referenced +function dm:nested ``` From ed3f039b72c3e981daaf883a241acd62f1c667fd Mon Sep 17 00:00:00 2001 From: edayot Date: Sat, 7 Mar 2026 17:26:20 +0100 Subject: [PATCH 4/5] run ruff --- packages/mecha/src/mecha/parse.py | 6 +++--- src/beet/library/utils.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mecha/src/mecha/parse.py b/packages/mecha/src/mecha/parse.py index 2333f12b6..ab2619dcf 100644 --- a/packages/mecha/src/mecha/parse.py +++ b/packages/mecha/src/mecha/parse.py @@ -1353,10 +1353,10 @@ def __call__(self, stream: TokenStream) -> Any: return self.parser(stream) -RESOURCE_LOCATION_PATTERN = r"#?(?:[0-9a-z_\-\.]+:(?:[0-9a-z_./-]+|(?![ \t\r]*\n[ \t]+\S))|[0-9a-z_./-]+)" -RESOURCE_LOCATION_REQUIRE_PATH_PATTERN = ( - r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+" +RESOURCE_LOCATION_PATTERN = ( + r"#?(?:[0-9a-z_\-\.]+:(?:[0-9a-z_./-]+|(?![ \t\r]*\n[ \t]+\S))|[0-9a-z_./-]+)" ) +RESOURCE_LOCATION_REQUIRE_PATH_PATTERN = r"#?(?:[0-9a-z_\-\.]+:)?[0-9a-z_./-]+" @dataclass diff --git a/src/beet/library/utils.py b/src/beet/library/utils.py index 35b6e6ba7..e96f2bac8 100644 --- a/src/beet/library/utils.py +++ b/src/beet/library/utils.py @@ -62,6 +62,7 @@ def list_origin_folders(prefix: str, origin: FileOrigin) -> Dict[str, List[PureP return folders + def modified_suffixes(path: PurePath) -> List[str]: """ Equivalent to path.suffixes but support file with empty name From 29cf0e65b644c1bcae4fc02b9f84cdd3bca308be Mon Sep 17 00:00:00 2001 From: edayot Date: Sun, 8 Mar 2026 14:49:15 +0100 Subject: [PATCH 5/5] adding more tests, and failing tests --- .../src/data/demo/functions/.mcfunction | 11 ++++++ .../tests/resources/bolt_examples.mcfunction | 16 +++++++++ .../tests/snapshots/bolt__parse_381__0.txt | 5 +++ .../tests/snapshots/bolt__parse_382__0.txt | 31 ++++++++++++++++ .../tests/snapshots/bolt__parse_382__1.txt | 4 +++ .../tests/snapshots/bolt__parse_383__0.txt | 35 +++++++++++++++++++ .../tests/snapshots/bolt__parse_383__1.txt | 4 +++ .../tests/snapshots/bolt__parse_384__0.txt | 5 +++ .../tests/snapshots/bolt__parse_385__0.txt | 35 +++++++++++++++++++ .../tests/snapshots/bolt__parse_385__1.txt | 4 +++ .../tests/snapshots/bolt__parse_386__0.txt | 18 ++++++++++ .../tests/snapshots/bolt__parse_386__1.txt | 4 +++ ...examples__build_bolt_empty_path__0.pack.md | 2 ++ 13 files changed, 174 insertions(+) create mode 100644 packages/bolt/tests/snapshots/bolt__parse_381__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_382__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_382__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_383__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_383__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_384__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_385__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_385__1.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_386__0.txt create mode 100644 packages/bolt/tests/snapshots/bolt__parse_386__1.txt diff --git a/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction b/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction index 68c945452..2b93bb578 100644 --- a/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction +++ b/packages/bolt/examples/bolt_empty_path/src/data/demo/functions/.mcfunction @@ -50,3 +50,14 @@ function dm:: +#calling an empty tag +function #name: + + + + +#calling an empty tag +function #name:name/ + + + diff --git a/packages/bolt/tests/resources/bolt_examples.mcfunction b/packages/bolt/tests/resources/bolt_examples.mcfunction index df142151e..889da9cff 100644 --- a/packages/bolt/tests/resources/bolt_examples.mcfunction +++ b/packages/bolt/tests/resources/bolt_examples.mcfunction @@ -1393,3 +1393,19 @@ def a(v): x = None with a(1) as x, a(x) as y: say y +### +function minecraft:name: +### +function foo: +say aaa +### +function foo: + say aaa +### +function :: +### +function namespace:path/: + say boooo +### +function namespace:path/ + diff --git a/packages/bolt/tests/snapshots/bolt__parse_381__0.txt b/packages/bolt/tests/snapshots/bolt__parse_381__0.txt new file mode 100644 index 000000000..0d309c853 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_381__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected non-empty block. +# line 1, column 24 +# 1 | function minecraft:name: +# : ^ +function minecraft:name: diff --git a/packages/bolt/tests/snapshots/bolt__parse_382__0.txt b/packages/bolt/tests/snapshots/bolt__parse_382__0.txt new file mode 100644 index 000000000..ff6b56a39 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_382__0.txt @@ -0,0 +1,31 @@ +function foo: +say aaa +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=8) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=13, lineno=1, colno=14) + is_tag: False + namespace: 'foo' + path: '' + + location: SourceLocation(pos=14, lineno=2, colno=1) + end_location: SourceLocation(pos=21, lineno=2, colno=8) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=8) + fragments: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=21, lineno=2, colno=8) + value: 'aaa' diff --git a/packages/bolt/tests/snapshots/bolt__parse_382__1.txt b/packages/bolt/tests/snapshots/bolt__parse_382__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_382__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_383__0.txt b/packages/bolt/tests/snapshots/bolt__parse_383__0.txt new file mode 100644 index 000000000..7131b925a --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_383__0.txt @@ -0,0 +1,35 @@ +function foo: + say aaa +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + identifier: 'function:name:commands' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=12, lineno=1, colno=13) + is_tag: False + namespace: None + path: 'foo' + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + commands: + + location: SourceLocation(pos=18, lineno=2, colno=5) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=22, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + fragments: + + location: SourceLocation(pos=22, lineno=2, colno=9) + end_location: SourceLocation(pos=25, lineno=2, colno=12) + value: 'aaa' diff --git a/packages/bolt/tests/snapshots/bolt__parse_383__1.txt b/packages/bolt/tests/snapshots/bolt__parse_383__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_383__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_384__0.txt b/packages/bolt/tests/snapshots/bolt__parse_384__0.txt new file mode 100644 index 000000000..52ab52843 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_384__0.txt @@ -0,0 +1,5 @@ +#>ERROR Expected bracket '[', curly '{', docstring, ellipsis, false, identifier or 5 other tokens but got colon ':'. +# line 1, column 11 +# 1 | function :: +# : ^ +function :: diff --git a/packages/bolt/tests/snapshots/bolt__parse_385__0.txt b/packages/bolt/tests/snapshots/bolt__parse_385__0.txt new file mode 100644 index 000000000..6f28e15ff --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_385__0.txt @@ -0,0 +1,35 @@ +function namespace:path/: + say boooo +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + identifier: 'function:name:commands' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + is_tag: False + namespace: 'namespace' + path: 'path/' + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + commands: + + location: SourceLocation(pos=30, lineno=2, colno=5) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + identifier: 'say:message' + arguments: + + location: SourceLocation(pos=34, lineno=2, colno=9) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + fragments: + + location: SourceLocation(pos=34, lineno=2, colno=9) + end_location: SourceLocation(pos=39, lineno=2, colno=14) + value: 'boooo' diff --git a/packages/bolt/tests/snapshots/bolt__parse_385__1.txt b/packages/bolt/tests/snapshots/bolt__parse_385__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_385__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/bolt__parse_386__0.txt b/packages/bolt/tests/snapshots/bolt__parse_386__0.txt new file mode 100644 index 000000000..7210a4094 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_386__0.txt @@ -0,0 +1,18 @@ +function namespace:path/ + +--- + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=26, lineno=3, colno=1) + commands: + + location: SourceLocation(pos=0, lineno=1, colno=1) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + identifier: 'function:name' + arguments: + + location: SourceLocation(pos=9, lineno=1, colno=10) + end_location: SourceLocation(pos=24, lineno=1, colno=25) + is_tag: False + namespace: 'namespace' + path: 'path/' diff --git a/packages/bolt/tests/snapshots/bolt__parse_386__1.txt b/packages/bolt/tests/snapshots/bolt__parse_386__1.txt new file mode 100644 index 000000000..b7d106222 --- /dev/null +++ b/packages/bolt/tests/snapshots/bolt__parse_386__1.txt @@ -0,0 +1,4 @@ +# Nothing +--- +output = None +--- diff --git a/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md b/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md index 7186ef420..b40053440 100644 --- a/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md +++ b/packages/bolt/tests/snapshots/examples__build_bolt_empty_path__0.pack.md @@ -28,6 +28,8 @@ function demo:bar function dm: say YOLO +function #name: +function #name:name/ ``` `@function demo:bar`