"""This script recursively scans the `selenium` package directory
to find all modules, then generates the `py/docs/source/api.rst`
file containing a listing of all modules in separate sections.
The `api.rst` file is later used by `sphinx-autogen` to generate
sphinx autodoc stub pages used in the Python API documentation.
See `py/tox.ini` for how it is invoked."""
import os
import site
def find_modules(package_name):
modules = []
for dirpath, _, filenames in os.walk(package_name):
for filename in filenames:
if filename.endswith(".py") and not filename.startswith("__"):
module_name = (
os.path.join(dirpath, filename)
.removeprefix(site.getsitepackages()[-1])
.removeprefix(os.sep)
.removesuffix(".py")
.replace(os.sep, ".")
)
modules.append(module_name)
return sorted(set(modules))
if __name__ == "__main__":
package_name = "selenium"
output_file = os.path.join("docs", "source", "api.rst")
print(f"generating module list for sphinx autodoc in: {output_file}\n")
modules = [module for module in find_modules(package_name) if ".devtools." not in module]
base_modules = [mod for mod in sorted({module.rsplit(".", 1)[0] for module in modules}) if mod != package_name]
print("found sections:")
for base_module in base_modules:
print(f" {base_module}")
with open(output_file, "w") as f:
f.write(
"""\
..
this file was auto-generated by `generate_api_module_listing.py`
DO NOT EDIT
:orphan:
======================
Selenium Documentation
======================
"""
)
for base_module in base_modules:
content_section = base_module.split(".", 1)[1]
separator = "-" * len(content_section)
f.write(
f"""
{content_section}
{separator}
.. currentmodule:: {base_module}
.. autosummary::
:toctree: {base_module.replace(".", "_")}
"""
)
for module in modules:
if base_module in module:
if len(module.split(".")) - len(base_module.split(".")) == 1:
f.write(f" {module}\n")
f.write(
"""
Indices and tables
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
"""
)