def add_command(self, cmd: click.Command, name: Optional[str] = None) -> None: if cmd.callback: # type: ignore cmd.callback = error_handler(should_exit=True)( cmd.callback) # type: ignore return super().add_command(cmd, name=name)
def _wrapper(command: click.Command): original_command = command.callback def _callback(*args, **kwargs): context = click.get_current_context() config = context.obj.config value = kwargs.get(param) if value is None: if (not hasattr(config, param) or getattr(config, param) is None): raise click.BadParameter( f"must provide {param}", context, get_param_obj(context, param), ) value = getattr(config, param) config.validate(param, value) return original_command(*args, **kwargs) command.callback = update_wrapper(_callback, original_command) return command
def decorator(command: click.Command) -> click.Command: assert command.callback callback = command.callback command.params += options def call_with_blockchain_info(**params: Any) -> Callable: address_overwrites = { contract: value for contract, value in ( (contract, params.pop(param)) for contract, param in param_for_contract.items()) if value is not None } params["web3"], params["contracts"], params[ "start_block"] = connect_to_blockchain( eth_rpc=params.pop("eth_rpc"), gas_price_strategy=params.pop("gas_price"), used_contracts=contracts, address_overwrites=address_overwrites, development_environment=params.pop( "development_environment"), ) return callback(**params) command.callback = call_with_blockchain_info return command
def decorator(command: click.Command) -> click.Command: assert command.callback callback = command.callback command.params += options def call_with_blockchain_info(**params: Any) -> Callable: address_overwrites = { contract: value for contract, value in ( (contract, params.pop(param)) for contract, param in param_for_contract.items()) if value is not None } params['web3'], params['contracts'], params[ 'start_block'] = connect_to_blockchain( eth_rpc=params.pop('eth_rpc'), used_contracts=contracts, address_overwrites=address_overwrites, contracts_version=contracts_version, ) return callback(**params) command.callback = call_with_blockchain_info return command
def multi_instance(command: click.Command): """ decorator for a click command to allow multiple instances to be passed in """ original_command = command.callback def multi_callback(instance_names: List[str], *args, **kwargs): from gs_manager.servers import ( BaseServer, STATUS_SUCCESS, STATUS_FAILED, STATUS_PARTIAL_FAIL, ) context = click.get_current_context() server: BaseServer = context.obj if context.params.get("foreground"): raise click.ClickException( "cannot use @ options with the --foreground option") if context.params.get("parallel"): results = _run_parallel(original_command, instance_names, *args, **kwargs) else: results = _run_sync(original_command, instance_names, *args, **kwargs) server.logger.debug(f"results: {results}") partial_failed = results.count(STATUS_PARTIAL_FAIL) failed = results.count(STATUS_FAILED) return_code = STATUS_SUCCESS total = len(results) if failed > 0: server.logger.warning(f"{failed}/{total} return a failure code") return_code = STATUS_PARTIAL_FAIL if partial_failed > 0: server.logger.warning( f"{partial_failed}/{total} return a partial failure code") return_code = STATUS_PARTIAL_FAIL if failed == total: return_code = STATUS_FAILED return return_code wrapper_function = _instance_wrapper(original_command, multi_callback) command.callback = update_wrapper(wrapper_function, original_command) return command
def single_instance(command: click.Command): """ decorator for a click command to enforce a single instance or zero instances are passed in """ original_command = command.callback def multi_callback(*args, **kwargs): raise click.ClickException("{} does not support @all".format( command.name)) wrapper_function = _instance_wrapper(original_command, multi_callback) command.callback = update_wrapper(wrapper_function, original_command) return command