# Licensed to the Software Freedom Conservancy (SFC) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The SFC licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. """This script recursively scans the `selenium` package directory and generates an API listing. 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__": # Support running via bazel run (uses BUILD_WORKSPACE_DIRECTORY) workspace = os.environ.get("BUILD_WORKSPACE_DIRECTORY", "") base_dir = os.path.join(workspace, "py") if workspace else "." os.chdir(base_dir) 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` """ )