diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6981d01..c80ed5e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -13,4 +13,5 @@ - Add check whether sub-namespaces are not empty in `core.python.namespaces.PythonPackageNamespace.namespace` - Add feature to get the names of all sub-namespaces of a `core.python.namespaces.PythonPackageNamespace` - Add feature to compare `core.python.namespaces.PythonPackageNamespace` instances or `core.python.namespaces.PythonModuleNamespace` instances -- Add string representation for python namespace objects \ No newline at end of file +- Add string representation for python namespace objects +- Add `PythonDocumentationGenerator` method to collect all namespaces \ No newline at end of file diff --git a/src/jcloud_docsgen/core/python/_core.py b/src/jcloud_docsgen/core/python/_core.py index 1a45223..c0014f4 100644 --- a/src/jcloud_docsgen/core/python/_core.py +++ b/src/jcloud_docsgen/core/python/_core.py @@ -14,6 +14,8 @@ from __future__ import annotations from ...utils import ExistingDirectory, assert_that_is_instance +from .namespaces import PythonModuleNamespace, PythonPackageNamespace, PythonNamespace +import pathlib __all__ = [ 'PythonDocumentationGenerator' @@ -34,4 +36,25 @@ class PythonDocumentationGenerator: assert_that_is_instance(docs_directory, ExistingDirectory) self.project_directory = project_directory - self.docs_directory = docs_directory \ No newline at end of file + self.docs_directory = docs_directory + + def _namespace(self, directory: pathlib.Path) -> dict[str, PythonNamespace]: + namespaces = dict() + + for entry in directory.iterdir(): + if entry.is_dir(): + namespaces[entry.name] = PythonPackageNamespace(entry.name, self._namespace(entry)) + elif entry.suffix == '.py': + namespaces[entry.stem] = PythonModuleNamespace(entry.stem) + + return namespaces + + def namespace(self) -> PythonPackageNamespace: + ''' + Returns the project as a namespace. + + :return: The project as a namespace. + :rtype: PythonPackageNamespace + ''' + + return PythonPackageNamespace('src', self._namespace(pathlib.Path((self.project_directory / 'src').as_posix()))) \ No newline at end of file diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py b/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py index a97e794..7eb3243 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py @@ -1,4 +1,8 @@ +import sys +sys.path.append('.') + from src.jcloud_docsgen.core.python import PythonDocumentationGenerator +from src.jcloud_docsgen.core.python.namespaces import PythonModuleNamespace, PythonPackageNamespace import pytest from src.jcloud_docsgen.utils import ExistingDirectory @@ -14,4 +18,13 @@ from src.jcloud_docsgen.utils import ExistingDirectory ]) def test_PythonDocumentationGenerator_type_exceptions(project_directory, docs_directory): with pytest.raises(TypeError): - PythonDocumentationGenerator(project_directory, docs_directory) \ No newline at end of file + PythonDocumentationGenerator(project_directory, docs_directory) + +@pytest.mark.parametrize('python_documentation_generator,expected', [ + (PythonDocumentationGenerator(ExistingDirectory('tests/unit/core/python/_core/test_project_dirs/pdir_1'), ExistingDirectory('tests/unit/core/python/_core/test_project_dirs/pdir_1/docs')), PythonPackageNamespace('src', {})), + (PythonDocumentationGenerator(ExistingDirectory('tests/unit/core/python/_core/test_project_dirs/pdir_2'), ExistingDirectory('tests/unit/core/python/_core/test_project_dirs/pdir_2/docs')), PythonPackageNamespace('src', {'module': PythonModuleNamespace('module')})), + (PythonDocumentationGenerator(ExistingDirectory('tests/unit/core/python/_core/test_project_dirs/pdir_3'), ExistingDirectory('tests/unit/core/python/_core/test_project_dirs/pdir_3/docs')), PythonPackageNamespace('src', {'module': PythonModuleNamespace('module'), 'pkg': PythonPackageNamespace('pkg', {'module2': PythonModuleNamespace('module2')})})), +]) +def test_PythonDocumentationGenerator_collect_modules(python_documentation_generator: PythonDocumentationGenerator, expected): + print('MODS:', python_documentation_generator.namespace()) + assert python_documentation_generator.namespace() == expected \ No newline at end of file diff --git a/tests/unit/core/python/_core/test_project_dirs/pdir_2/src/module.py b/tests/unit/core/python/_core/test_project_dirs/pdir_2/src/module.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/core/python/_core/test_project_dirs/pdir_3/src/module.py b/tests/unit/core/python/_core/test_project_dirs/pdir_3/src/module.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/core/python/_core/test_project_dirs/pdir_3/src/pkg/module2.py b/tests/unit/core/python/_core/test_project_dirs/pdir_3/src/pkg/module2.py new file mode 100644 index 0000000..e69de29