| | |
| | import os |
| | import subprocess |
| | import sys |
| | import yaml |
| | import argparse |
| | import hashlib |
| |
|
| |
|
| | |
| |
|
| |
|
| | def hash_file(filename): |
| | """ |
| | Calculate the md5 hash of a file. Used to check for stale files. |
| | |
| | :param filename: The name of the file to check |
| | :type str: |
| | :return: A string containing the md5 hash of the file |
| | :rtype: str |
| | """ |
| | if os.path.exists(filename): |
| | hasher = hashlib.md5() |
| | with open(filename, "rb") as file_to_hash: |
| | buffer = file_to_hash.read() |
| | hasher.update(buffer) |
| | return hasher.hexdigest() |
| | else: |
| | return 0 |
| |
|
| |
|
| | def remove_trailing_whitespace(filename): |
| | """ |
| | Removes trailing whitespace from a file. |
| | |
| | :param filename: The name of the file to process |
| | :type str: |
| | """ |
| | num_changed = 0 |
| | |
| | with open(filename, "rb") as f: |
| | source_file = f.read().decode() |
| | |
| | lines = [line.rstrip() for line in source_file.splitlines()] |
| |
|
| | |
| | while lines and not lines[-1]: |
| | lines.pop(-1) |
| | lines.append("") |
| | destination_file = "\n".join(lines) |
| |
|
| | |
| | if source_file != destination_file: |
| | num_changed += 1 |
| | with open(filename, "wb") as f: |
| | f.write(destination_file.encode()) |
| |
|
| |
|
| | if __name__ == "__main__": |
| | """ |
| | Pre-commit hook to generate Python API documentation using pydoc-markdown |
| | and write as markdown files. Each package should have a config file, |
| | pydoc-config.yaml, at the root level that provides configurations for |
| | the generation. Fails if documentation was updated, passes otherwise. This |
| | allows for pre-commit to fail in CI/CD and makes sure dev commits the doc |
| | updates. |
| | """ |
| | parser = argparse.ArgumentParser() |
| | parser.add_argument("--package_dirs", nargs="+") |
| | args = parser.parse_args() |
| |
|
| | ok = True |
| | for package_dir in args.package_dirs: |
| | config_path = os.path.join(os.getcwd(), package_dir, "pydoc-config.yaml") |
| | print(config_path) |
| | with open(config_path) as config_file: |
| | config = yaml.full_load(config_file) |
| | for module in config["modules"]: |
| | module_name = module["name"] |
| | submodules = module["submodules"] |
| | output_file_name = f"./{config['folder']}/{module['file_name']}" |
| | old_hash = hash_file(output_file_name) |
| | module_args = [] |
| | for submodule in submodules: |
| | module_args.append("-m") |
| | module_args.append(f"{module_name}.{submodule}") |
| | with open(output_file_name, "w") as output_file: |
| | subprocess_args = [ |
| | "pydoc-markdown", |
| | "-I", |
| | f"./{package_dir}", |
| | *module_args, |
| | "--render-toc", |
| | ] |
| | subprocess.check_call(subprocess_args, stdout=output_file) |
| | remove_trailing_whitespace(output_file_name) |
| | new_hash = hash_file(output_file_name) |
| | ok &= old_hash == new_hash |
| |
|
| | sys.exit(0 if ok else 1) |
| |
|