diff --git a/beet/library/base.py b/beet/library/base.py index 05aec8ee7..14c7d0060 100644 --- a/beet/library/base.py +++ b/beet/library/base.py @@ -689,8 +689,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/beet/library/utils.py b/beet/library/utils.py index 607eee41e..74445e779 100644 --- a/beet/library/utils.py +++ b/beet/library/utils.py @@ -63,9 +63,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) # type: ignore + accumulate(reversed(modified_suffixes(path)), lambda a, b: b + a) # type: ignore ) extensions.reverse() extensions.append("") 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/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..8c5ac63e7 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__0.data_pack/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 61, + "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..79d3592b3 --- /dev/null +++ b/tests/snapshots/examples__build_code_void__1.resource_pack/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 46, + "description": "" + } +} diff --git a/tests/snapshots/modified_suffixes__paths_suffixes_aaa_mcfunction__aaa...mcfunction.json b/tests/snapshots/modified_suffixes__paths_suffixes_aaa_mcfunction__aaa...mcfunction.json new file mode 100644 index 000000000..691125b0f --- /dev/null +++ b/tests/snapshots/modified_suffixes__paths_suffixes_aaa_mcfunction__aaa...mcfunction.json @@ -0,0 +1,13 @@ +{ + "path": "aaa...mcfunction", + "suffixes": [ + ".", + ".", + ".mcfunction" + ], + "modified_suffixes": [ + ".", + ".", + ".mcfunction" + ] +} diff --git a/tests/snapshots/modified_suffixes__paths_suffixes_load_mcfunction__load.mcfunction.json b/tests/snapshots/modified_suffixes__paths_suffixes_load_mcfunction__load.mcfunction.json new file mode 100644 index 000000000..3edb137af --- /dev/null +++ b/tests/snapshots/modified_suffixes__paths_suffixes_load_mcfunction__load.mcfunction.json @@ -0,0 +1,9 @@ +{ + "path": "load.mcfunction", + "suffixes": [ + ".mcfunction" + ], + "modified_suffixes": [ + ".mcfunction" + ] +} diff --git a/tests/snapshots/modified_suffixes__paths_suffixes_load_py_mcfunction__load.py.mcfunction.json b/tests/snapshots/modified_suffixes__paths_suffixes_load_py_mcfunction__load.py.mcfunction.json new file mode 100644 index 000000000..6d85098fa --- /dev/null +++ b/tests/snapshots/modified_suffixes__paths_suffixes_load_py_mcfunction__load.py.mcfunction.json @@ -0,0 +1,11 @@ +{ + "path": "load.py.mcfunction", + "suffixes": [ + ".py", + ".mcfunction" + ], + "modified_suffixes": [ + ".py", + ".mcfunction" + ] +} diff --git a/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__...mcfunction.json b/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__...mcfunction.json new file mode 100644 index 000000000..5384de0ef --- /dev/null +++ b/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__...mcfunction.json @@ -0,0 +1,9 @@ +{ + "path": "...mcfunction", + "suffixes": [], + "modified_suffixes": [ + ".", + ".", + ".mcfunction" + ] +} diff --git a/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__..mcfunction.json b/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__..mcfunction.json new file mode 100644 index 000000000..912a10c6e --- /dev/null +++ b/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__..mcfunction.json @@ -0,0 +1,8 @@ +{ + "path": "..mcfunction", + "suffixes": [], + "modified_suffixes": [ + ".", + ".mcfunction" + ] +} diff --git a/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__.mcfunction.json b/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__.mcfunction.json new file mode 100644 index 000000000..c150e297c --- /dev/null +++ b/tests/snapshots/modified_suffixes__paths_suffixes_mcfunction__.mcfunction.json @@ -0,0 +1,7 @@ +{ + "path": ".mcfunction", + "suffixes": [], + "modified_suffixes": [ + ".mcfunction" + ] +} diff --git a/tests/snapshots/modified_suffixes__paths_suffixes_py_mcfunction__.py.mcfunction.json b/tests/snapshots/modified_suffixes__paths_suffixes_py_mcfunction__.py.mcfunction.json new file mode 100644 index 000000000..c9f3e2867 --- /dev/null +++ b/tests/snapshots/modified_suffixes__paths_suffixes_py_mcfunction__.py.mcfunction.json @@ -0,0 +1,10 @@ +{ + "path": ".py.mcfunction", + "suffixes": [ + ".mcfunction" + ], + "modified_suffixes": [ + ".py", + ".mcfunction" + ] +} diff --git a/tests/test_modified_suffixes.py b/tests/test_modified_suffixes.py new file mode 100644 index 000000000..292dc6aef --- /dev/null +++ b/tests/test_modified_suffixes.py @@ -0,0 +1,25 @@ +import pytest +from pytest_insta import SnapshotFixture +from beet.library.utils import modified_suffixes +from pathlib import Path + + +PATHS = [ + "load.mcfunction", + ".mcfunction", + "..mcfunction", + "load.py.mcfunction", + ".py.mcfunction", + "aaa...mcfunction", + "...mcfunction", +] + + +@pytest.mark.parametrize("path", PATHS) +def test_paths_suffixes(snapshot: SnapshotFixture, path: str): + real_path = Path(path) + assert snapshot(f"{path}.json") == { + "path": path, + "suffixes": list(real_path.suffixes), + "modified_suffixes": list(modified_suffixes(real_path)), + }