Add bindings for IFileTree glob() and walk() generators (#142)

* Adding binding for new IFileTree glob and walk.
* Fix issues with Version binding.
This commit is contained in:
Mikaël Capelle
2025-07-06 19:38:16 +02:00
committed by GitHub
parent 00a6d5969b
commit b0d2b48524
7 changed files with 155 additions and 10 deletions
+1 -1
View File
@@ -53,7 +53,7 @@ foreach (test_file ${test_files})
pybind11_add_module(${target} EXCLUDE_FROM_ALL THIN_LTO ${test_file})
set_target_properties(${target}
PROPERTIES
CXX_STANDARD 20
CXX_STANDARD 23
OUTPUT_NAME ${pymodule}
FOLDER tests/python
LIBRARY_OUTPUT_DIRECTORY "${PYLIB_DIR}/mobase_tests")
+50
View File
@@ -1,3 +1,5 @@
from typing import TypeAlias, cast
import mobase
import mobase_tests.filetree as m
@@ -34,3 +36,51 @@ def test_filetype():
assert m.is_file(FT.FILE_OR_DIRECTORY & ~FT.DIRECTORY)
assert not m.is_directory(FT.FILE_OR_DIRECTORY & ~FT.DIRECTORY)
_tree_values: TypeAlias = list["str | tuple[str, _tree_values]"]
def make_tree(
values: _tree_values, root: mobase.IFileTree | None = None
) -> mobase.IFileTree:
if root is None:
root = cast(mobase.IFileTree, mobase.private.makeTree()) # type: ignore
for value in values:
if isinstance(value, str):
root.addFile(value)
else:
sub_tree = root.addDirectory(value[0])
make_tree(value[1], sub_tree)
return root
def test_walk():
tree = make_tree(
[("a", []), ("b", ["u", "v"]), "c.x", "d.y", ("e", [("q", ["c.t", ("p", [])])])]
)
assert {"a", "b", "b/u", "b/v", "c.x", "d.y", "e", "e/q", "e/q/c.t", "e/q/p"} == {
e.path("/") for e in tree.walk()
}
entries: list[str] = []
for e in tree.walk():
if e.name() == "e":
break
entries.append(e.path("/"))
assert {"a", "b", "b/u", "b/v"} == set(entries)
def test_glob():
tree = make_tree(
[("a", []), ("b", ["u", "v"]), "c.x", "d.y", ("e", [("q", ["c.t", ("p", [])])])]
)
assert {"a", "b", "b/u", "b/v", "c.x", "d.y", "e", "e/q", "e/q/c.t", "e/q/p"} == {
e.path("/") for e in tree.glob("**/*")
}
assert {"d.y"} == {e.path("/") for e in tree.glob("**/*.y")}