def handle(self, args, config, plugin_registry: PluginRegistry): command_utilities.setup_logging(args.log_level or "warning", config) bus_module, bus = command_utilities.import_bus(args) block(bus.client.lazy_load_now()) bus.schema.save_local(args.out) if args.out: sys.stderr.write("Schema for {} APIs saved to {}\n".format( len(bus.schema.api_names), Path(args.out).resolve()))
def handle(self, args, config, plugin_registry: PluginRegistry): """Entrypoint for the inspect command""" command_utilities.setup_logging(args.log_level or "warning", config) bus_module, bus = command_utilities.import_bus(args) api_names: List[str] block(bus.client.lazy_load_now()) block(bus.client.hook_registry.execute("before_worker_start")) # Locally registered APIs api_names = [api.meta.name for api in bus.client.api_registry.all()] # APIs registered to other services on the bus for api_name in bus.client.schema.api_names: if api_name not in api_names: api_names.append(api_name) if not args.internal and not args.api: # Hide internal APIs if we don't want them api_names = [ api_name for api_name in api_names if not api_name.startswith("internal.") ] if args.api and args.api not in api_names: sys.stderr.write( f"Specified API was not found locally or within the schema on the bus.\n" f"Ensure a Lightbus worker is running for this API.\n" f"Cannot continue.\n") sys.exit(1) api_names_to_inspect = [] for api_name in api_names: if not args.api or self.wildcard_match(args.api, api_name): api_names_to_inspect.append(api_name) if len(api_names_to_inspect) != 1 and args.follow: sys.stderr.write( f"The --follow option is only available when following a single API.\n" f"Please specify the --api option to select a single API to follow.\n" ) sys.exit(1) try: for api_name in api_names_to_inspect: if not args.api or self.wildcard_match(args.api, api_name): logger.debug(f"Inspecting {api_name}") block(self.search_in_api(args, api_name, bus)) else: logger.debug( f"API {api_name} did not match {args.api}. Skipping") except KeyboardInterrupt: logger.info("Stopped by user")
def handle(self, args, config, plugin_registry: PluginRegistry, fake_it=False): command_utilities.setup_logging(args.log_level or "warning", config) try: # pylint: disable=unused-import,cyclic-import,import-outside-toplevel import bpython from bpython.curtsies import main as bpython_main except ImportError: # pragma: no cover print( "Lightbus shell requires bpython. Run `pip install bpython` to install bpython." ) sys.exit(1) return # noqa lightbus_logger = logging.getLogger("lightbus") lightbus_logger.setLevel(logging.WARNING) bus_module, bus = command_utilities.import_bus(args) block(bus.client.lazy_load_now()) objects = {k: v for k, v in lightbus.__dict__.items() if isclass(v)} objects.update(bus=bus) block(plugin_registry.execute_hook("receive_args", args=args), timeout=5) # Ability to not start up the repl is useful for testing if not fake_it: bpython_main( args=["-i", "-q"], locals_=objects, welcome_message= "Welcome to the Lightbus shell. Use `bus` to access your bus.", )
def _handle(self, args, config, plugin_registry: PluginRegistry): command_utilities.setup_logging(override=getattr( args, "log_level", None), config=config) bus_module, bus = command_utilities.import_bus(args) # Convert only & skip into a list of features to enable if args.only or args.skip: if args.only: features = args.only else: features = self.all_features for skip_feature in args.skip or []: if skip_feature in features: features.remove(skip_feature) elif os.environ.get("LIGHTBUS_FEATURES"): features = csv_type(os.environ.get("LIGHTBUS_FEATURES")) else: features = ALL_FEATURES bus.client.set_features(features) # TODO: Move to lightbus.create()? if args.schema: if args.schema == "-": # if '-' read from stdin source = None else: source = args.schema bus.schema.load_local(source) restart_signals = (signal.SIGINT, signal.SIGTERM) # Handle incoming signals async def signal_handler(): # Stop handling signals now. If we receive the signal again # let the process quit naturally for signal_ in restart_signals: asyncio.get_event_loop().remove_signal_handler(signal_) logger.debug("Caught signal. Stopping main thread event loop") bus.client.shutdown_server(exit_code=0) for signal_ in restart_signals: asyncio.get_event_loop().add_signal_handler( signal_, lambda: asyncio.ensure_future(signal_handler())) try: block(plugin_registry.execute_hook("receive_args", args=args), timeout=5) bus.client.run_forever() finally: # Cleanup signal handlers for signal_ in restart_signals: asyncio.get_event_loop().remove_signal_handler(signal_) if bus.client.exit_code: sys.exit(bus.client.exit_code)