def decorator(func): _api_name = func.__name__ if api_name is None else api_name _api_doc = ((func.__doc__ or DEFAULT_API_DOC).strip() if api_doc is None else api_doc) if input is None: # support bentoml<=0.7 if not args or not (inspect.isclass(args[0]) and issubclass(args[0], BentoHandler)): raise InvalidArgument( "BentoService @api decorator first parameter must " "be class derived from bentoml.handlers.BentoHandler") handler = args[0](*args[1:], **kwargs) else: handler = input setattr(func, "_is_api", True) setattr(func, "_handler", handler) setattr(func, "_output_adapter", output) if not isidentifier(_api_name): raise InvalidArgument( "Invalid API name: '{}', a valid identifier must contains only letters," " numbers, underscores and not starting with a number.".format( _api_name)) setattr(func, "_api_name", _api_name) setattr(func, "_api_doc", _api_doc) return func
def name(cls): # pylint:disable=method-hidden if cls._bento_service_name is not None and isidentifier( cls._bento_service_name): return cls._bento_service_name else: # Use python class name as service name return cls.__name__
def validate_inference_api_name(api_name): if not isidentifier(api_name): raise InvalidArgument( "Invalid API name: '{}', a valid identifier must contains only letters," " numbers, underscores and not starting with a number.".format( api_name)) if api_name in BENTOML_RESERVED_API_NAMES: raise InvalidArgument( "Reserved API name: '{}' is reserved for infra endpoints".format( api_name))
def name(cls): # pylint: disable=no-self-argument,invalid-overridden-method if cls._bento_service_name is not None: if not isidentifier(cls._bento_service_name): raise InvalidArgument( 'BentoService#_bento_service_name must be valid python identifier' 'matching regex `(letter|"_")(letter|digit|"_")*`') return cls._bento_service_name else: # Use python class name as service name return cls.__name__
def name(cls): # pylint:disable=method-hidden if cls._bento_service_name is not None: if not isidentifier(cls._bento_service_name): raise ValueError( 'BentoService#_bento_service_name must be valid python identifier' 'matching regex `(letter|"_")(letter|digit|"_")*`') return cls._bento_service_name else: # Use python class name as service name return cls.__name__
def decorator(func): _api_name = func.__name__ if api_name is None else api_name _api_doc = ( (func.__doc__ or DEFAULT_API_DOC).strip() if api_doc is None else api_doc ) _mb_max_batch_size = ( DEFAULT_MAX_BATCH_SIZE if mb_max_batch_size is None else mb_max_batch_size ) _mb_max_latency = ( DEFAULT_MAX_LATENCY if mb_max_latency is None else mb_max_latency ) if input is None: # support bentoml<=0.7 if not args or not ( inspect.isclass(args[0]) and issubclass(args[0], BaseInputAdapter) ): raise InvalidArgument( "BentoService @api decorator first parameter must " "be class derived from bentoml.adapters.BaseInputAdapter" ) handler = args[0](*args[1:], output_adapter=output, **kwargs) else: assert isinstance(input, BaseInputAdapter), ( "API input parameter must be an instance of any classes inherited from " "bentoml.adapters.BaseInputAdapter" ) handler = input handler._output_adapter = output setattr(func, "_is_api", True) setattr(func, "_handler", handler) if not isidentifier(_api_name): raise InvalidArgument( "Invalid API name: '{}', a valid identifier must contains only letters," " numbers, underscores and not starting with a number.".format( _api_name ) ) if _api_name in BENTOML_RESERVED_API_NAMES: raise InvalidArgument( "Reserved API name: '{}' is reserved for infra endpoints".format( _api_name ) ) setattr(func, "_api_name", _api_name) setattr(func, "_api_doc", _api_doc) setattr(func, "_mb_max_batch_size", _mb_max_batch_size) setattr(func, "_mb_max_latency", _mb_max_latency) return func
def decorator(func): api_name = kwargs.pop("api_name", func.__name__) api_doc = kwargs.pop("api_doc", func.__doc__ or DEFAULT_API_DOC).strip() handler = handler_cls( *args, **kwargs ) # create handler instance and attach to api method setattr(func, "_is_api", True) setattr(func, "_handler", handler) if not isidentifier(api_name): raise InvalidArgument( "Invalid API name: '{}', a valid identifier must contains only letters," " numbers, underscores and not starting with a number.".format(api_name) ) setattr(func, "_api_name", api_name) setattr(func, "_api_doc", api_doc) return func
def decorator(func): api_name = kwargs.pop('api_name', func.__name__) api_doc = kwargs.pop('api_doc', func.__doc__ or DEFAULT_API_DOC).strip() handler = handler_cls( *args, **kwargs) # create handler instance and attach to api method _set_func_attr(func, '_is_api', True) _set_func_attr(func, '_handler', handler) if not isidentifier(api_name): raise ValueError( "Invalid API name: '{}', a valid identifier must contains only letters, " "numbers, underscores and not starting with a number.".format( api_name)) _set_func_attr(func, '_api_name', api_name) _set_func_attr(func, '_api_doc', api_doc) return func