From 5777aa57d9f6f67c1295aa3a395db6458f9e76d2 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Tue, 19 Dec 2023 18:48:24 -0800 Subject: [PATCH] plugin done --- tools/docgen/plugins.py | 62 +++++++++++++++++++++++++++++++++++++++++ tools/docgen/test.py | 20 ------------- tools/docgen/utils.py | 7 +++++ 3 files changed, 69 insertions(+), 20 deletions(-) create mode 100644 tools/docgen/plugins.py delete mode 100644 tools/docgen/test.py create mode 100644 tools/docgen/utils.py diff --git a/tools/docgen/plugins.py b/tools/docgen/plugins.py new file mode 100644 index 00000000..5eb2ff1b --- /dev/null +++ b/tools/docgen/plugins.py @@ -0,0 +1,62 @@ +import inspect +from typing import Dict +from typing import Type + +from tools.docgen.utils import section +from ytdl_sub.config.overrides import Overrides +from ytdl_sub.config.plugin.plugin_mapping import PluginMapping +from ytdl_sub.config.preset_options import OutputOptions +from ytdl_sub.config.preset_options import YTDLOptions +from ytdl_sub.config.validators.options import OptionsValidator + + +def should_filter_property(property_name: str) -> bool: + return property_name.startswith("_") or property_name in ( + "value", + "source_variable_capture_dict", + "dict", + "keys", + "dict_with_format_strings", + "subscription_name", + ) + + +def generate_plugin_docs(name: str, options: Type[OptionsValidator], offset: int): + docs = "" + docs += section(name, level=offset + 0) + + docs += inspect.cleandoc(options.__doc__) + docs += "\n" + + property_names = [ + prop + for prop in dir(options) + if isinstance(getattr(options, prop), property) and not should_filter_property(prop) + ] + for property_name in sorted(property_names): + docs += section(property_name, level=offset + 1) + docs += inspect.cleandoc(getattr(options, property_name).__doc__) + docs += "\n" + + return docs + + +def generate_plugin_rst(): + options_dict: Dict[str, Type[OptionsValidator]] = { + "output_options": OutputOptions, + "ytdl_options": YTDLOptions, + "overrides": Overrides, + } + for plugin_name, plugin_type in PluginMapping._MAPPING.items(): + if plugin_name.startswith("_"): + continue + options_dict[plugin_name] = plugin_type.plugin_options_type + + docs = section("Plugins", level=0) + for name in sorted(options_dict.keys()): + docs += generate_plugin_docs(name, options_dict[name], offset=1) + + return docs + + +print(generate_plugin_rst()) diff --git a/tools/docgen/test.py b/tools/docgen/test.py deleted file mode 100644 index c0637618..00000000 --- a/tools/docgen/test.py +++ /dev/null @@ -1,20 +0,0 @@ -import inspect - -from ytdl_sub.config.plugin.plugin_mapping import PluginMapping -from ytdl_sub.config.validators.options import OptionsValidator - - -def generate_docs(name: str, plugin_options: OptionsValidator): - - docs = "" - docs += f"{name}\n{len(name) * '-'}\n" - - docs += inspect.cleandoc(plugin_options.__doc__) - - print(docs) - - -generate_docs( - "output_directory_nfo_tags", - PluginMapping._MAPPING["output_directory_nfo_tags"].plugin_options_type, -) diff --git a/tools/docgen/utils.py b/tools/docgen/utils.py new file mode 100644 index 00000000..ae0e6707 --- /dev/null +++ b/tools/docgen/utils.py @@ -0,0 +1,7 @@ +from typing import Dict + +LEVEL_CHARS: Dict[int, str] = {0: "=", 1: "-", 2: "~", 3: "^"} + + +def section(name: str, level: int) -> str: + return f"\n{name}\n{len(name) * LEVEL_CHARS[level]}\n"