Spaces:
Runtime error
Runtime error
import inspect | |
import types | |
import warnings | |
from functools import wraps | |
import gradio as gr | |
import gradio.component_meta | |
from modules import scripts, ui_tempdir, patches | |
class GradioDeprecationWarning(DeprecationWarning): | |
pass | |
def add_classes_to_gradio_component(comp): | |
""" | |
this adds gradio-* to the component for css styling (ie gradio-button to gr.Button), as well as some others | |
""" | |
comp.elem_classes = [f"gradio-{comp.get_block_name()}", *(getattr(comp, 'elem_classes', None) or [])] | |
if getattr(comp, 'multiselect', False): | |
comp.elem_classes.append('multiselect') | |
def IOComponent_init(self, *args, **kwargs): | |
self.webui_tooltip = kwargs.pop('tooltip', None) | |
if scripts.scripts_current is not None: | |
scripts.scripts_current.before_component(self, **kwargs) | |
scripts.script_callbacks.before_component_callback(self, **kwargs) | |
res = original_IOComponent_init(self, *args, **kwargs) | |
add_classes_to_gradio_component(self) | |
scripts.script_callbacks.after_component_callback(self, **kwargs) | |
if scripts.scripts_current is not None: | |
scripts.scripts_current.after_component(self, **kwargs) | |
return res | |
def Block_get_config(self): | |
config = original_Block_get_config(self) | |
webui_tooltip = getattr(self, 'webui_tooltip', None) | |
if webui_tooltip: | |
config["webui_tooltip"] = webui_tooltip | |
config.pop('example_inputs', None) | |
return config | |
def BlockContext_init(self, *args, **kwargs): | |
if scripts.scripts_current is not None: | |
scripts.scripts_current.before_component(self, **kwargs) | |
scripts.script_callbacks.before_component_callback(self, **kwargs) | |
res = original_BlockContext_init(self, *args, **kwargs) | |
add_classes_to_gradio_component(self) | |
scripts.script_callbacks.after_component_callback(self, **kwargs) | |
if scripts.scripts_current is not None: | |
scripts.scripts_current.after_component(self, **kwargs) | |
return res | |
def Blocks_get_config_file(self, *args, **kwargs): | |
config = original_Blocks_get_config_file(self, *args, **kwargs) | |
for comp_config in config["components"]: | |
if "example_inputs" in comp_config: | |
comp_config["example_inputs"] = {"serialized": []} | |
return config | |
original_IOComponent_init = patches.patch(__name__, obj=gr.components.Component, field="__init__", replacement=IOComponent_init) | |
original_Block_get_config = patches.patch(__name__, obj=gr.blocks.Block, field="get_config", replacement=Block_get_config) | |
original_BlockContext_init = patches.patch(__name__, obj=gr.blocks.BlockContext, field="__init__", replacement=BlockContext_init) | |
original_Blocks_get_config_file = patches.patch(__name__, obj=gr.blocks.Blocks, field="get_config_file", replacement=Blocks_get_config_file) | |
ui_tempdir.install_ui_tempdir_override() | |
def gradio_component_meta_create_or_modify_pyi(component_class, class_name, events): | |
if hasattr(component_class, 'webui_do_not_create_gradio_pyi_thank_you'): | |
return | |
gradio_component_meta_create_or_modify_pyi_original(component_class, class_name, events) | |
# this prevents creation of .pyi files in webui dir | |
gradio_component_meta_create_or_modify_pyi_original = patches.patch(__file__, gradio.component_meta, 'create_or_modify_pyi', gradio_component_meta_create_or_modify_pyi) | |
# this function is broken and does not seem to do anything useful | |
gradio.component_meta.updateable = lambda x: x | |
class EventWrapper: | |
def __init__(self, replaced_event): | |
self.replaced_event = replaced_event | |
self.has_trigger = getattr(replaced_event, 'has_trigger', None) | |
self.event_name = getattr(replaced_event, 'event_name', None) | |
self.callback = getattr(replaced_event, 'callback', None) | |
self.real_self = getattr(replaced_event, '__self__', None) | |
def __call__(self, *args, **kwargs): | |
if '_js' in kwargs: | |
kwargs['js'] = kwargs['_js'] | |
del kwargs['_js'] | |
return self.replaced_event(*args, **kwargs) | |
def __self__(self): | |
return self.real_self | |
def repair(grclass): | |
if not getattr(grclass, 'EVENTS', None): | |
return | |
def __repaired_init__(self, *args, tooltip=None, source=None, original=grclass.__init__, **kwargs): | |
if source: | |
kwargs["sources"] = [source] | |
allowed_kwargs = inspect.signature(original).parameters | |
fixed_kwargs = {} | |
for k, v in kwargs.items(): | |
if k in allowed_kwargs: | |
fixed_kwargs[k] = v | |
else: | |
warnings.warn(f"unexpected argument for {grclass.__name__}: {k}", GradioDeprecationWarning, stacklevel=2) | |
original(self, *args, **fixed_kwargs) | |
self.webui_tooltip = tooltip | |
for event in self.EVENTS: | |
replaced_event = getattr(self, str(event)) | |
fun = EventWrapper(replaced_event) | |
setattr(self, str(event), fun) | |
grclass.__init__ = __repaired_init__ | |
grclass.update = gr.update | |
for component in set(gr.components.__all__ + gr.layouts.__all__): | |
repair(getattr(gr, component, None)) | |
class Dependency(gr.events.Dependency): | |
def __init__(self, *args, **kwargs): | |
super().__init__(*args, **kwargs) | |
def then(*xargs, _js=None, **xkwargs): | |
if _js: | |
xkwargs['js'] = _js | |
return original_then(*xargs, **xkwargs) | |
original_then = self.then | |
self.then = then | |
gr.events.Dependency = Dependency | |
gr.Box = gr.Group | |