kaparoo-python 0.1.12__tar.gz → 0.2.1__tar.gz

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.
Files changed (40) hide show
  1. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/LICENSE +20 -20
  2. kaparoo_python-0.2.1/PKG-INFO +91 -0
  3. kaparoo_python-0.2.1/README.md +70 -0
  4. kaparoo_python-0.1.12/kaparoo/data/files/base.py → kaparoo_python-0.2.1/kaparoo/data/sequence.py +39 -45
  5. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/data/utils.py +46 -49
  6. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/filesystem/__init__.py +73 -56
  7. kaparoo_python-0.2.1/kaparoo/filesystem/directory.py +226 -0
  8. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/filesystem/exceptions.py +17 -15
  9. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/filesystem/existence.py +392 -392
  10. kaparoo_python-0.2.1/kaparoo/filesystem/search/__init__.py +85 -0
  11. kaparoo_python-0.2.1/kaparoo/filesystem/search/classes.py +208 -0
  12. kaparoo_python-0.2.1/kaparoo/filesystem/search/deprecated.py +289 -0
  13. kaparoo_python-0.2.1/kaparoo/filesystem/search/filters/__init__.py +73 -0
  14. kaparoo_python-0.2.1/kaparoo/filesystem/search/filters/base.py +92 -0
  15. kaparoo_python-0.2.1/kaparoo/filesystem/search/filters/logical.py +138 -0
  16. kaparoo_python-0.2.1/kaparoo/filesystem/search/filters/multi_pattern.py +154 -0
  17. kaparoo_python-0.2.1/kaparoo/filesystem/search/filters/pattern.py +210 -0
  18. kaparoo_python-0.2.1/kaparoo/filesystem/search/filters/types.py +47 -0
  19. kaparoo_python-0.2.1/kaparoo/filesystem/search/filters/utils.py +51 -0
  20. kaparoo_python-0.2.1/kaparoo/filesystem/search/wrappers.py +318 -0
  21. kaparoo_python-0.2.1/kaparoo/filesystem/types.py +9 -0
  22. kaparoo_python-0.2.1/kaparoo/filesystem/utils.py +208 -0
  23. kaparoo_python-0.2.1/kaparoo/utils/__init__.py +21 -0
  24. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/utils/optional.py +129 -151
  25. kaparoo_python-0.2.1/kaparoo/utils/timer.py +374 -0
  26. kaparoo_python-0.2.1/pyproject.toml +266 -0
  27. kaparoo_python-0.1.12/.gitignore +0 -207
  28. kaparoo_python-0.1.12/PKG-INFO +0 -69
  29. kaparoo_python-0.1.12/README.md +0 -23
  30. kaparoo_python-0.1.12/kaparoo/__about__.py +0 -1
  31. kaparoo_python-0.1.12/kaparoo/data/files/__init__.py +0 -0
  32. kaparoo_python-0.1.12/kaparoo/filesystem/directory.py +0 -419
  33. kaparoo_python-0.1.12/kaparoo/filesystem/types.py +0 -8
  34. kaparoo_python-0.1.12/kaparoo/filesystem/utils.py +0 -139
  35. kaparoo_python-0.1.12/kaparoo/utils/__init__.py +0 -0
  36. kaparoo_python-0.1.12/kaparoo/utils/types.py +0 -9
  37. kaparoo_python-0.1.12/pyproject.toml +0 -129
  38. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/__init__.py +0 -0
  39. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/data/__init__.py +0 -0
  40. {kaparoo_python-0.1.12 → kaparoo_python-0.2.1}/kaparoo/py.typed +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2023 Jaewoo Park
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Jaewoo Park
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
@@ -0,0 +1,91 @@
1
+ Metadata-Version: 2.4
2
+ Name: kaparoo-python
3
+ Version: 0.2.1
4
+ Summary: Personally common and useful Python features
5
+ Keywords: filesystem,pathlib,paths,utilities
6
+ Author: Jaewoo Park
7
+ Author-email: Jaewoo Park <kaparoo2001@gmail.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Programming Language :: Python :: Implementation :: CPython
16
+ Classifier: Typing :: Typed
17
+ Requires-Python: >=3.14
18
+ Project-URL: GitHub, https://www.github.com/kaparoo/kaparoo-python
19
+ Project-URL: Issues, https://www.github.com/kaparoo/kaparoo-python/issues
20
+ Description-Content-Type: text/markdown
21
+
22
+ # kaparoo-python
23
+
24
+ [![PyPI version](https://img.shields.io/pypi/v/kaparoo-python.svg)](https://pypi.org/project/kaparoo-python/)
25
+ [![Downloads](https://pepy.tech/badge/kaparoo-python)](https://pypi.org/project/kaparoo-python/)
26
+ [![Python](https://img.shields.io/badge/python-3.14+-blue.svg)](https://www.python.org/)
27
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)
28
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
29
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
30
+ [![ty](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ty/main/assets/badge/v0.json)](https://github.com/astral-sh/ty)
31
+ [![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json)](https://github.com/copier-org/copier)
32
+
33
+ *Personally common and useful Python features.*
34
+
35
+ ## 📦 Installation
36
+
37
+ Requires Python 3.14+.
38
+
39
+ ```bash
40
+ # With uv (recommended)
41
+ uv add kaparoo-python
42
+
43
+ # With pip
44
+ pip install kaparoo-python
45
+ ```
46
+
47
+ ## 🧩 Modules
48
+
49
+ ### `kaparoo.filesystem`
50
+
51
+ `pathlib`-based filesystem helpers.
52
+
53
+ - **`existence`** — existence checks (`*_exists`) and `ensure_*` validators.
54
+ - **`directory`** — `make_dir(s)`, `dir_empty(s)` (with `_unsafe` variants).
55
+ - **`utils`** — `stringify_path(s)`, `wrap_path(s)`.
56
+ - **`exceptions`** — `DirectoryNotFoundError`, `NotAFileError`.
57
+ - **`types`** — `StrPath`, `StrPaths`.
58
+
59
+ ### `kaparoo.filesystem.search`
60
+
61
+ Filesystem traversal with composable filters.
62
+
63
+ - **Entry points** — `search_paths`, `search_files`, `search_dirs`.
64
+ - **Pattern filters** — `Equals`, `StartsWith`, `EndsWith`, `Contains`,
65
+ `Regex`, `Glob`.
66
+ - **Multi-pattern filters** — `EqualsAny`, `StartsWithAny`, `EndsWithAny`,
67
+ `ContainsAny`.
68
+ - **Logical filters** — `And`, `Or`, `Not`.
69
+ - **Serialization** — `Filter.to_dict()` / `Filter.from_dict()` round-trip
70
+ via a `"kind"` discriminator; `Filter.parse()` accepts a `Filter` or a
71
+ `FilterDict`; `register_filter(kind)` extends the dispatcher with
72
+ custom subclasses. `FilterDict` family lives at
73
+ `kaparoo.filesystem.search.filters.types`.
74
+ - **Deprecated** — `get_paths`, `get_files`, `get_dirs` (use `search_*`).
75
+
76
+ ### `kaparoo.utils`
77
+
78
+ - **`timer`** — `Timer` and `LapTimer` context-manager / decorator timers.
79
+ - **`optional`** — `replace_if_none`, `factory_if_none`, `unwrap_or_*`.
80
+
81
+ ## 📋 TODO
82
+
83
+ See [TODO.md](./TODO.md) for tracked open items.
84
+
85
+ ## 📜 Changelog
86
+
87
+ See [CHANGELOG.md](./CHANGELOG.md) for the version history.
88
+
89
+ ## ⚖️ License
90
+
91
+ This project is distributed under the terms of the [MIT](./LICENSE) license.
@@ -0,0 +1,70 @@
1
+ # kaparoo-python
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/kaparoo-python.svg)](https://pypi.org/project/kaparoo-python/)
4
+ [![Downloads](https://pepy.tech/badge/kaparoo-python)](https://pypi.org/project/kaparoo-python/)
5
+ [![Python](https://img.shields.io/badge/python-3.14+-blue.svg)](https://www.python.org/)
6
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)
7
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
8
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
9
+ [![ty](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ty/main/assets/badge/v0.json)](https://github.com/astral-sh/ty)
10
+ [![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json)](https://github.com/copier-org/copier)
11
+
12
+ *Personally common and useful Python features.*
13
+
14
+ ## 📦 Installation
15
+
16
+ Requires Python 3.14+.
17
+
18
+ ```bash
19
+ # With uv (recommended)
20
+ uv add kaparoo-python
21
+
22
+ # With pip
23
+ pip install kaparoo-python
24
+ ```
25
+
26
+ ## 🧩 Modules
27
+
28
+ ### `kaparoo.filesystem`
29
+
30
+ `pathlib`-based filesystem helpers.
31
+
32
+ - **`existence`** — existence checks (`*_exists`) and `ensure_*` validators.
33
+ - **`directory`** — `make_dir(s)`, `dir_empty(s)` (with `_unsafe` variants).
34
+ - **`utils`** — `stringify_path(s)`, `wrap_path(s)`.
35
+ - **`exceptions`** — `DirectoryNotFoundError`, `NotAFileError`.
36
+ - **`types`** — `StrPath`, `StrPaths`.
37
+
38
+ ### `kaparoo.filesystem.search`
39
+
40
+ Filesystem traversal with composable filters.
41
+
42
+ - **Entry points** — `search_paths`, `search_files`, `search_dirs`.
43
+ - **Pattern filters** — `Equals`, `StartsWith`, `EndsWith`, `Contains`,
44
+ `Regex`, `Glob`.
45
+ - **Multi-pattern filters** — `EqualsAny`, `StartsWithAny`, `EndsWithAny`,
46
+ `ContainsAny`.
47
+ - **Logical filters** — `And`, `Or`, `Not`.
48
+ - **Serialization** — `Filter.to_dict()` / `Filter.from_dict()` round-trip
49
+ via a `"kind"` discriminator; `Filter.parse()` accepts a `Filter` or a
50
+ `FilterDict`; `register_filter(kind)` extends the dispatcher with
51
+ custom subclasses. `FilterDict` family lives at
52
+ `kaparoo.filesystem.search.filters.types`.
53
+ - **Deprecated** — `get_paths`, `get_files`, `get_dirs` (use `search_*`).
54
+
55
+ ### `kaparoo.utils`
56
+
57
+ - **`timer`** — `Timer` and `LapTimer` context-manager / decorator timers.
58
+ - **`optional`** — `replace_if_none`, `factory_if_none`, `unwrap_or_*`.
59
+
60
+ ## 📋 TODO
61
+
62
+ See [TODO.md](./TODO.md) for tracked open items.
63
+
64
+ ## 📜 Changelog
65
+
66
+ See [CHANGELOG.md](./CHANGELOG.md) for the version history.
67
+
68
+ ## ⚖️ License
69
+
70
+ This project is distributed under the terms of the [MIT](./LICENSE) license.
@@ -1,45 +1,39 @@
1
- from __future__ import annotations
2
-
3
- __all__ = ("DataSequence",)
4
-
5
- from abc import abstractmethod
6
- from collections.abc import Sequence
7
- from typing import TYPE_CHECKING, overload
8
-
9
- from kaparoo.utils.types import T_co
10
-
11
- if TYPE_CHECKING:
12
- from typing import Self
13
-
14
- from kaparoo.filesystem.types import StrPath
15
-
16
-
17
- class DataSequence(Sequence[T_co]):
18
- @abstractmethod
19
- def __init__(self: Self, path: StrPath) -> None:
20
- raise NotImplementedError
21
-
22
- @abstractmethod
23
- def __len__(self: Self) -> int:
24
- raise NotImplementedError
25
-
26
- @overload
27
- def __getitem__(self: Self, index: int, /) -> T_co:
28
- pass
29
-
30
- @overload
31
- def __getitem__(self: Self, index: slice, /) -> Sequence[T_co]:
32
- pass
33
-
34
- def __getitem__(self: Self, index: int | slice, /) -> T_co | Sequence[T_co]:
35
- if isinstance(index, slice):
36
- start, stop, step = index.indices(len(self))
37
- return self.by_indices(range(start, stop, step))
38
- return self.by_index(index)
39
-
40
- @abstractmethod
41
- def by_index(self: Self, index: int) -> T_co:
42
- raise NotImplementedError
43
-
44
- def by_indices(self: Self, indices: Sequence[int]) -> Sequence[T_co]:
45
- return [self.by_index(index) for index in indices]
1
+ from __future__ import annotations
2
+
3
+ __all__ = ("DataSequence",)
4
+
5
+ from abc import abstractmethod
6
+ from collections.abc import Sequence
7
+ from typing import TYPE_CHECKING, overload
8
+
9
+ if TYPE_CHECKING:
10
+ from kaparoo.filesystem.types import StrPath
11
+
12
+
13
+ class DataSequence[T](Sequence[T]):
14
+ @abstractmethod
15
+ def __init__(self, path: StrPath) -> None:
16
+ raise NotImplementedError
17
+
18
+ @abstractmethod
19
+ def __len__(self) -> int:
20
+ raise NotImplementedError
21
+
22
+ @overload
23
+ def __getitem__(self, index: int, /) -> T: ...
24
+
25
+ @overload
26
+ def __getitem__(self, index: slice, /) -> Sequence[T]: ...
27
+
28
+ def __getitem__(self, index: int | slice, /) -> T | Sequence[T]:
29
+ if isinstance(index, slice):
30
+ start, stop, step = index.indices(len(self))
31
+ return self.by_indices(range(start, stop, step))
32
+ return self.by_index(index)
33
+
34
+ @abstractmethod
35
+ def by_index(self, index: int) -> T:
36
+ raise NotImplementedError
37
+
38
+ def by_indices(self, indices: Sequence[int]) -> Sequence[T]:
39
+ return [self.by_index(index) for index in indices]
@@ -1,49 +1,46 @@
1
- from __future__ import annotations
2
-
3
- __all__ = ("generate_batches",)
4
-
5
- from typing import TYPE_CHECKING
6
-
7
- from kaparoo.utils.optional import replace_if_none
8
-
9
- if TYPE_CHECKING:
10
- from collections.abc import Generator, Sequence
11
- from typing import Any
12
-
13
- from kaparoo.utils.types import T_co
14
-
15
-
16
- def generate_batches(
17
- sequence: Sequence[T_co],
18
- size: int,
19
- step: int = 1,
20
- skip: int = 1,
21
- start: int = 0,
22
- stop: int | None = None,
23
- *,
24
- drop_last: bool = True,
25
- ) -> Generator[Sequence[T_co], Any, None]:
26
- def die_if_not_positive(name: str, value: int) -> None:
27
- if value <= 0:
28
- raise ValueError(f"{name} must be positive (got {value})")
29
-
30
- die_if_not_positive("size", size)
31
- die_if_not_positive("step", step)
32
- die_if_not_positive("skip", skip)
33
-
34
- stop = replace_if_none(stop, len_ := len(sequence))
35
- if not (start < stop <= len_ and start >= 0):
36
- raise ValueError(
37
- f"invalid range [{start}, {stop}) for sequence of length {len_}"
38
- )
39
-
40
- head = start
41
- tail = head + (size - 1) * skip + 1
42
-
43
- while tail <= stop:
44
- yield sequence[head:tail:skip]
45
- head += step
46
- tail += step
47
-
48
- if not drop_last and head < stop:
49
- yield sequence[head:tail:skip]
1
+ from __future__ import annotations
2
+
3
+ __all__ = ("generate_batches",)
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from kaparoo.utils.optional import replace_if_none
8
+
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Iterator, Sequence
11
+
12
+
13
+ def generate_batches[T](
14
+ sequence: Sequence[T],
15
+ size: int,
16
+ step: int = 1,
17
+ skip: int = 1,
18
+ start: int = 0,
19
+ stop: int | None = None,
20
+ *,
21
+ drop_last: bool = True,
22
+ ) -> Iterator[Sequence[T]]:
23
+ def die_if_not_positive(name: str, value: int) -> None:
24
+ if value <= 0:
25
+ msg = f"{name} must be positive (got {value})"
26
+ raise ValueError(msg)
27
+
28
+ die_if_not_positive("size", size)
29
+ die_if_not_positive("step", step)
30
+ die_if_not_positive("skip", skip)
31
+
32
+ stop = replace_if_none(stop, len_ := len(sequence))
33
+ if not (start < stop <= len_ and start >= 0):
34
+ msg = f"invalid range [{start}, {stop}) for sequence of length {len_}"
35
+ raise ValueError(msg)
36
+
37
+ head = start
38
+ tail = head + (size - 1) * skip + 1
39
+
40
+ while tail <= stop:
41
+ yield sequence[head:tail:skip]
42
+ head += step
43
+ tail += step
44
+
45
+ if not drop_last and head < stop:
46
+ yield sequence[head:tail:skip]
@@ -1,56 +1,73 @@
1
- __all__ = (
2
- # utils
3
- "prepend_path",
4
- "prepend_paths",
5
- "stringify_path",
6
- "stringify_paths",
7
- # existence
8
- "ensure_dir_exists",
9
- "ensure_dirs_exist",
10
- "ensure_path_exists",
11
- "ensure_paths_exist",
12
- "ensure_file_exists",
13
- "ensure_files_exist",
14
- "dir_exists",
15
- "dirs_exist",
16
- "file_exists",
17
- "files_exist",
18
- "path_exists",
19
- "paths_exist",
20
- # directory
21
- "dir_empty",
22
- "dirs_empty",
23
- "get_dirs",
24
- "get_files",
25
- "get_paths",
26
- "make_dirs",
27
- )
28
-
29
- from kaparoo.filesystem.directory import (
30
- dir_empty,
31
- dirs_empty,
32
- get_dirs,
33
- get_files,
34
- get_paths,
35
- make_dirs,
36
- )
37
- from kaparoo.filesystem.existence import (
38
- dir_exists,
39
- dirs_exist,
40
- ensure_dir_exists,
41
- ensure_dirs_exist,
42
- ensure_file_exists,
43
- ensure_files_exist,
44
- ensure_path_exists,
45
- ensure_paths_exist,
46
- file_exists,
47
- files_exist,
48
- path_exists,
49
- paths_exist,
50
- )
51
- from kaparoo.filesystem.utils import (
52
- prepend_path,
53
- prepend_paths,
54
- stringify_path,
55
- stringify_paths,
56
- )
1
+ __all__ = (
2
+ "DirectoryNotFoundError",
3
+ "NotAFileError",
4
+ "dir_empty",
5
+ "dir_empty_unsafe",
6
+ "dir_exists",
7
+ "dirs_empty",
8
+ "dirs_empty_unsafe",
9
+ "dirs_exist",
10
+ "ensure_dir_exists",
11
+ "ensure_dirs_exist",
12
+ "ensure_file_exists",
13
+ "ensure_files_exist",
14
+ "ensure_path_exists",
15
+ "ensure_paths_exist",
16
+ "file_exists",
17
+ "files_exist",
18
+ "get_dirs",
19
+ "get_files",
20
+ "get_paths",
21
+ "make_dir",
22
+ "make_dirs",
23
+ "path_exists",
24
+ "paths_exist",
25
+ "search_dirs",
26
+ "search_files",
27
+ "search_paths",
28
+ "stringify_path",
29
+ "stringify_paths",
30
+ "wrap_path",
31
+ "wrap_paths",
32
+ )
33
+
34
+ from kaparoo.filesystem.directory import (
35
+ dir_empty,
36
+ dir_empty_unsafe,
37
+ dirs_empty,
38
+ dirs_empty_unsafe,
39
+ make_dir,
40
+ make_dirs,
41
+ )
42
+ from kaparoo.filesystem.exceptions import (
43
+ DirectoryNotFoundError,
44
+ NotAFileError,
45
+ )
46
+ from kaparoo.filesystem.existence import (
47
+ dir_exists,
48
+ dirs_exist,
49
+ ensure_dir_exists,
50
+ ensure_dirs_exist,
51
+ ensure_file_exists,
52
+ ensure_files_exist,
53
+ ensure_path_exists,
54
+ ensure_paths_exist,
55
+ file_exists,
56
+ files_exist,
57
+ path_exists,
58
+ paths_exist,
59
+ )
60
+ from kaparoo.filesystem.search import (
61
+ get_dirs,
62
+ get_files,
63
+ get_paths,
64
+ search_dirs,
65
+ search_files,
66
+ search_paths,
67
+ )
68
+ from kaparoo.filesystem.utils import (
69
+ stringify_path,
70
+ stringify_paths,
71
+ wrap_path,
72
+ wrap_paths,
73
+ )