|  | # 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 | 
|  | 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` | 
|  | """ | 
|  | ) |