Edit on GitHub

hexdoc.cli.utils

 1__all__ = [
 2    "DefaultTyper",
 3    "init_context",
 4    "load_common_data",
 5    "render_textures_and_export_metadata",
 6]
 7
 8from .args import (
 9    DefaultTyper,
10)
11from .load import (
12    init_context,
13    load_common_data,
14    render_textures_and_export_metadata,
15)
def DefaultTyper( *, name: Optional[str] = <typer.models.DefaultPlaceholder object>, cls: Optional[Type[typer.core.TyperGroup]] = <typer.models.DefaultPlaceholder object>, invoke_without_command: bool = <typer.models.DefaultPlaceholder object>, no_args_is_help: bool = <typer.models.DefaultPlaceholder object>, subcommand_metavar: Optional[str] = <typer.models.DefaultPlaceholder object>, chain: bool = <typer.models.DefaultPlaceholder object>, result_callback: Optional[Callable[..., Any]] = <typer.models.DefaultPlaceholder object>, context_settings: Optional[Dict[Any, Any]] = <typer.models.DefaultPlaceholder object>, callback: Optional[Callable[..., Any]] = <typer.models.DefaultPlaceholder object>, help: Optional[str] = <typer.models.DefaultPlaceholder object>, epilog: Optional[str] = <typer.models.DefaultPlaceholder object>, short_help: Optional[str] = <typer.models.DefaultPlaceholder object>, options_metavar: str = <typer.models.DefaultPlaceholder object>, add_help_option: bool = <typer.models.DefaultPlaceholder object>, hidden: bool = <typer.models.DefaultPlaceholder object>, deprecated: bool = <typer.models.DefaultPlaceholder object>, add_completion: bool = True, rich_markup_mode: Literal['markdown', 'rich', None] = <typer.models.DefaultPlaceholder object>, rich_help_panel: Optional[str] = <typer.models.DefaultPlaceholder object>, pretty_exceptions_enable: bool = True, pretty_exceptions_show_locals: bool = True, pretty_exceptions_short: bool = True):
128class Typer:
129    def __init__(
130        self,
131        *,
132        name: Optional[str] = Default(None),
133        cls: Optional[Type[TyperGroup]] = Default(None),
134        invoke_without_command: bool = Default(False),
135        no_args_is_help: bool = Default(False),
136        subcommand_metavar: Optional[str] = Default(None),
137        chain: bool = Default(False),
138        result_callback: Optional[Callable[..., Any]] = Default(None),
139        # Command
140        context_settings: Optional[Dict[Any, Any]] = Default(None),
141        callback: Optional[Callable[..., Any]] = Default(None),
142        help: Optional[str] = Default(None),
143        epilog: Optional[str] = Default(None),
144        short_help: Optional[str] = Default(None),
145        options_metavar: str = Default("[OPTIONS]"),
146        add_help_option: bool = Default(True),
147        hidden: bool = Default(False),
148        deprecated: bool = Default(False),
149        add_completion: bool = True,
150        # Rich settings
151        rich_markup_mode: MarkupMode = Default(DEFAULT_MARKUP_MODE),
152        rich_help_panel: Union[str, None] = Default(None),
153        pretty_exceptions_enable: bool = True,
154        pretty_exceptions_show_locals: bool = True,
155        pretty_exceptions_short: bool = True,
156    ):
157        self._add_completion = add_completion
158        self.rich_markup_mode: MarkupMode = rich_markup_mode
159        self.rich_help_panel = rich_help_panel
160        self.pretty_exceptions_enable = pretty_exceptions_enable
161        self.pretty_exceptions_show_locals = pretty_exceptions_show_locals
162        self.pretty_exceptions_short = pretty_exceptions_short
163        self.info = TyperInfo(
164            name=name,
165            cls=cls,
166            invoke_without_command=invoke_without_command,
167            no_args_is_help=no_args_is_help,
168            subcommand_metavar=subcommand_metavar,
169            chain=chain,
170            result_callback=result_callback,
171            context_settings=context_settings,
172            callback=callback,
173            help=help,
174            epilog=epilog,
175            short_help=short_help,
176            options_metavar=options_metavar,
177            add_help_option=add_help_option,
178            hidden=hidden,
179            deprecated=deprecated,
180        )
181        self.registered_groups: List[TyperInfo] = []
182        self.registered_commands: List[CommandInfo] = []
183        self.registered_callback: Optional[TyperInfo] = None
184
185    def callback(
186        self,
187        *,
188        cls: Optional[Type[TyperGroup]] = Default(None),
189        invoke_without_command: bool = Default(False),
190        no_args_is_help: bool = Default(False),
191        subcommand_metavar: Optional[str] = Default(None),
192        chain: bool = Default(False),
193        result_callback: Optional[Callable[..., Any]] = Default(None),
194        # Command
195        context_settings: Optional[Dict[Any, Any]] = Default(None),
196        help: Optional[str] = Default(None),
197        epilog: Optional[str] = Default(None),
198        short_help: Optional[str] = Default(None),
199        options_metavar: str = Default("[OPTIONS]"),
200        add_help_option: bool = Default(True),
201        hidden: bool = Default(False),
202        deprecated: bool = Default(False),
203        # Rich settings
204        rich_help_panel: Union[str, None] = Default(None),
205    ) -> Callable[[CommandFunctionType], CommandFunctionType]:
206        def decorator(f: CommandFunctionType) -> CommandFunctionType:
207            self.registered_callback = TyperInfo(
208                cls=cls,
209                invoke_without_command=invoke_without_command,
210                no_args_is_help=no_args_is_help,
211                subcommand_metavar=subcommand_metavar,
212                chain=chain,
213                result_callback=result_callback,
214                context_settings=context_settings,
215                callback=f,
216                help=help,
217                epilog=epilog,
218                short_help=short_help,
219                options_metavar=options_metavar,
220                add_help_option=add_help_option,
221                hidden=hidden,
222                deprecated=deprecated,
223                rich_help_panel=rich_help_panel,
224            )
225            return f
226
227        return decorator
228
229    def command(
230        self,
231        name: Optional[str] = None,
232        *,
233        cls: Optional[Type[TyperCommand]] = None,
234        context_settings: Optional[Dict[Any, Any]] = None,
235        help: Optional[str] = None,
236        epilog: Optional[str] = None,
237        short_help: Optional[str] = None,
238        options_metavar: str = "[OPTIONS]",
239        add_help_option: bool = True,
240        no_args_is_help: bool = False,
241        hidden: bool = False,
242        deprecated: bool = False,
243        # Rich settings
244        rich_help_panel: Union[str, None] = Default(None),
245    ) -> Callable[[CommandFunctionType], CommandFunctionType]:
246        if cls is None:
247            cls = TyperCommand
248
249        def decorator(f: CommandFunctionType) -> CommandFunctionType:
250            self.registered_commands.append(
251                CommandInfo(
252                    name=name,
253                    cls=cls,
254                    context_settings=context_settings,
255                    callback=f,
256                    help=help,
257                    epilog=epilog,
258                    short_help=short_help,
259                    options_metavar=options_metavar,
260                    add_help_option=add_help_option,
261                    no_args_is_help=no_args_is_help,
262                    hidden=hidden,
263                    deprecated=deprecated,
264                    # Rich settings
265                    rich_help_panel=rich_help_panel,
266                )
267            )
268            return f
269
270        return decorator
271
272    def add_typer(
273        self,
274        typer_instance: "Typer",
275        *,
276        name: Optional[str] = Default(None),
277        cls: Optional[Type[TyperGroup]] = Default(None),
278        invoke_without_command: bool = Default(False),
279        no_args_is_help: bool = Default(False),
280        subcommand_metavar: Optional[str] = Default(None),
281        chain: bool = Default(False),
282        result_callback: Optional[Callable[..., Any]] = Default(None),
283        # Command
284        context_settings: Optional[Dict[Any, Any]] = Default(None),
285        callback: Optional[Callable[..., Any]] = Default(None),
286        help: Optional[str] = Default(None),
287        epilog: Optional[str] = Default(None),
288        short_help: Optional[str] = Default(None),
289        options_metavar: str = Default("[OPTIONS]"),
290        add_help_option: bool = Default(True),
291        hidden: bool = Default(False),
292        deprecated: bool = Default(False),
293        # Rich settings
294        rich_help_panel: Union[str, None] = Default(None),
295    ) -> None:
296        self.registered_groups.append(
297            TyperInfo(
298                typer_instance,
299                name=name,
300                cls=cls,
301                invoke_without_command=invoke_without_command,
302                no_args_is_help=no_args_is_help,
303                subcommand_metavar=subcommand_metavar,
304                chain=chain,
305                result_callback=result_callback,
306                context_settings=context_settings,
307                callback=callback,
308                help=help,
309                epilog=epilog,
310                short_help=short_help,
311                options_metavar=options_metavar,
312                add_help_option=add_help_option,
313                hidden=hidden,
314                deprecated=deprecated,
315                rich_help_panel=rich_help_panel,
316            )
317        )
318
319    def __call__(self, *args: Any, **kwargs: Any) -> Any:
320        if sys.excepthook != except_hook:
321            sys.excepthook = except_hook
322        try:
323            return get_command(self)(*args, **kwargs)
324        except Exception as e:
325            # Set a custom attribute to tell the hook to show nice exceptions for user
326            # code. An alternative/first implementation was a custom exception with
327            # raise custom_exc from e
328            # but that means the last error shown is the custom exception, not the
329            # actual error. This trick improves developer experience by showing the
330            # actual error last.
331            setattr(
332                e,
333                _typer_developer_exception_attr_name,
334                DeveloperExceptionConfig(
335                    pretty_exceptions_enable=self.pretty_exceptions_enable,
336                    pretty_exceptions_show_locals=self.pretty_exceptions_show_locals,
337                    pretty_exceptions_short=self.pretty_exceptions_short,
338                ),
339            )
340            raise e
def init_context( *, book_id: hexdoc.core.ResourceLocation, book_data: dict[str, typing.Any], pm: hexdoc.plugin.PluginManager, loader: hexdoc.core.ModResourceLoader, i18n: hexdoc.minecraft.I18n, all_metadata: dict[str, hexdoc.data.HexdocMetadata]):
117def init_context(
118    *,
119    book_id: ResourceLocation,
120    book_data: dict[str, Any],
121    pm: PluginManager,
122    loader: ModResourceLoader,
123    i18n: I18n,
124    all_metadata: dict[str, HexdocMetadata],
125):
126    props = loader.props
127
128    context = dict[str, Any]()
129
130    for item in [
131        props,
132        pm,
133        loader,
134        i18n,
135        TextureContext(
136            textures=load_metadata_textures(all_metadata),
137            allowed_missing_textures=props.textures.missing,
138        ),
139        FormattingContext(
140            book_id=book_id,
141            macros=DEFAULT_MACROS | book_data.get("macros", {}) | props.macros,
142        ),
143        BookContext(
144            modid=props.modid,
145            book_id=book_id,
146            spoilered_advancements=Tag.SPOILERED_ADVANCEMENTS.load(
147                loader
148            ).value_ids_set,
149            all_metadata=all_metadata,
150        ),
151    ]:
152        item.add_to_context(context)
153
154    for item in pm.update_context(context):
155        item.add_to_context(context)
156
157    return context
def load_common_data( props_file: pathlib.Path, branch: str, *, book: bool = False) -> tuple[hexdoc.core.Properties, hexdoc.plugin.PluginManager, hexdoc.plugin.BookPlugin[typing.Any], hexdoc.plugin.ModPlugin]:
50def load_common_data(
51    props_file: Path,
52    branch: str,
53    *,
54    book: bool = False,
55) -> tuple[Properties, PluginManager, BookPlugin[Any], ModPlugin]:
56    props = Properties.load(props_file)
57    pm = PluginManager(branch, props)
58
59    book_plugin = pm.book_plugin(props.book_type)
60    mod_plugin = pm.mod_plugin(props.modid, book=book)
61
62    header = get_header(props, pm, mod_plugin)
63    logger.info(f"Loading hexdoc.\n{indent(header, '  ')}")
64
65    minecraft_version = MinecraftVersion.MINECRAFT_VERSION = pm.minecraft_version()
66    if minecraft_version is None:
67        logger.warning(
68            "No plugins implement minecraft_version. All versions may be used."
69        )
70
71    return props, pm, book_plugin, mod_plugin
def render_textures_and_export_metadata( loader: hexdoc.core.ModResourceLoader, asset_loader: hexdoc.minecraft.assets.HexdocAssetLoader):
 74def render_textures_and_export_metadata(
 75    loader: ModResourceLoader,
 76    asset_loader: HexdocAssetLoader,
 77):
 78    all_metadata = loader.load_metadata(model_type=HexdocMetadata)
 79
 80    all_lookups = load_metadata_textures(all_metadata)
 81    image_textures = {
 82        id: texture
 83        for texture_type in [PNGTexture, AnimatedTexture]
 84        for id, texture in texture_type.get_lookup(all_lookups).items()
 85    }
 86
 87    internal_lookups = TextureLookups[Texture](dict)
 88    if loader.props.textures.enabled:
 89        logger.info(f"Loading and rendering textures to {asset_loader.render_dir}.")
 90        for id, texture in asset_loader.load_and_render_internal_textures(
 91            image_textures
 92        ):
 93            texture.insert_texture(internal_lookups, id)
 94
 95    # this mod's metadata
 96    metadata = HexdocMetadata(
 97        book_url=asset_loader.site_url / loader.props.default_lang,
 98        asset_url=loader.props.env.asset_url,
 99        textures=internal_lookups,
100    )
101
102    loader.export(
103        metadata.path(loader.props.modid),
104        metadata.model_dump_json(
105            by_alias=True,
106            warnings=False,
107            exclude_defaults=True,
108            round_trip=True,
109        ),
110        cache=True,
111    )
112
113    return all_metadata | {loader.props.modid: metadata}