Source code for efrotools.message

# Released under the MIT License. See LICENSE for details.
#
"""Message related tools functionality."""

from __future__ import annotations

import sys
from pathlib import Path
from typing import TYPE_CHECKING

from efrotools.code import format_python_str

if TYPE_CHECKING:
    pass


[docs] def standard_message_sender_gen_pcommand( *, projroot: Path, basename: str, source_module: str, enable_sync_sends: bool, enable_async_sends: bool, get_protocol_call: str = 'get_protocol', embedded: bool = False, ) -> None: """Used by pcommands taking a single filename argument.""" # pylint: disable=too-many-locals import efro.message from efro.terminal import Clr from efro.error import CleanError if len(sys.argv) != 3: raise CleanError('Expected 1 arg: out-path.') dst = sys.argv[2] # Use wrapping-friendly form for long call names. get_protocol_import = ( f'({get_protocol_call})' if len(get_protocol_call) >= 14 else get_protocol_call ) # In embedded situations we have to pass different code to import # the protocol at build time than we do in our runtime code (where # there is only a dummy import for type-checking purposes) protocol_module_level_import_code: str | None build_time_protocol_create_code: str | None if embedded: protocol_module_level_import_code = ( 'from efro.util import explicit_bool\n' f'\n' f'# Dummy import for type-checking purposes.\n' f'# pylint: disable=possibly-used-before-assignment\n' f'if explicit_bool(False):\n' f' from {source_module} import {get_protocol_import}' ) protocol_create_code = f'protocol = {get_protocol_call}()' build_time_protocol_create_code = ( f'from {source_module} import {get_protocol_import}\n' f'protocol = {get_protocol_call}()' ) else: protocol_module_level_import_code = None protocol_create_code = ( f'from {source_module} import {get_protocol_import}\n' f'protocol = {get_protocol_call}()' ) build_time_protocol_create_code = None out = efro.message.create_sender_module( basename, protocol_create_code=protocol_create_code, protocol_module_level_import_code=protocol_module_level_import_code, build_time_protocol_create_code=build_time_protocol_create_code, enable_sync_sends=enable_sync_sends, enable_async_sends=enable_async_sends, ) out = format_python_str(projroot, out) print(f'Meta-building {Clr.BLD}{dst}{Clr.RST}') Path(dst).parent.mkdir(parents=True, exist_ok=True) with open(dst, 'w', encoding='utf-8') as outfile: outfile.write(out)
[docs] def standard_message_receiver_gen_pcommand( *, projroot: Path, basename: str, source_module: str, is_async: bool, get_protocol_call: str = 'get_protocol', embedded: bool = False, ) -> None: """Used by pcommands generating efro.message receiver modules.""" # pylint: disable=too-many-locals import efro.message from efro.terminal import Clr from efro.error import CleanError if len(sys.argv) != 3: raise CleanError('Expected 1 arg: out-path.') dst = sys.argv[2] # Use wrapping-friendly form for long call names. get_protocol_import = ( f'({get_protocol_call})' if len(get_protocol_call) >= 14 else get_protocol_call ) # In embedded situations we have to pass different code to import # the protocol at build time than we do in our runtime code (where # there is only a dummy import for type-checking purposes) protocol_module_level_import_code: str | None build_time_protocol_create_code: str | None if embedded: protocol_module_level_import_code = ( 'from efro.util import explicit_bool\n' f'\n' f'# Dummy import for type-checking purposes.\n' f'# pylint: disable=possibly-used-before-assignment\n' f'if explicit_bool(False):\n' f' from {source_module} import {get_protocol_import}\n' ) protocol_create_code = f'protocol = {get_protocol_call}()' build_time_protocol_create_code = ( f'from {source_module} import {get_protocol_import}\n' f'protocol = {get_protocol_call}()' ) else: protocol_module_level_import_code = None protocol_create_code = ( f'from {source_module} import {get_protocol_import}\n' f'protocol = {get_protocol_call}()' ) build_time_protocol_create_code = None out = efro.message.create_receiver_module( basename, protocol_create_code=protocol_create_code, protocol_module_level_import_code=protocol_module_level_import_code, build_time_protocol_create_code=build_time_protocol_create_code, is_async=is_async, ) out = format_python_str(projroot, out) print(f'Meta-building {Clr.BLD}{dst}{Clr.RST}') Path(dst).parent.mkdir(parents=True, exist_ok=True) with open(dst, 'w', encoding='utf-8') as outfile: outfile.write(out)
# Docs-generation hack; import some stuff that we likely only forward-declared # in our actual source code so that docs tools can find it. from typing import (Coroutine, Any, Literal, Callable, Generator, Awaitable, Sequence, Self) import asyncio from concurrent.futures import Future from pathlib import Path from enum import Enum