def _render_property(self, streamlit_app: st, key: str, property: Dict) -> Any: if schema_utils.is_single_enum_property(property, self._schema_references): return self._render_single_enum_input(streamlit_app, key, property) if schema_utils.is_multi_enum_property(property, self._schema_references): return self._render_multi_enum_input(streamlit_app, key, property) if schema_utils.is_single_file_property(property): return self._render_single_file_input(streamlit_app, key, property) if schema_utils.is_multi_file_property(property): return self._render_multi_file_input(streamlit_app, key, property) if schema_utils.is_single_datetime_property(property): return self._render_single_datetime_input(streamlit_app, key, property) if schema_utils.is_single_boolean_property(property): return self._render_single_boolean_input(streamlit_app, key, property) if schema_utils.is_single_dict_property(property): return self._render_single_dict_input(streamlit_app, key, property) if schema_utils.is_single_number_property(property): return self._render_single_number_input(streamlit_app, key, property) if schema_utils.is_single_string_property(property): return self._render_single_string_input(streamlit_app, key, property) if schema_utils.is_single_object(property, self._schema_references): return self._render_single_object_input(streamlit_app, key, property) if schema_utils.is_object_list_property(property, self._schema_references): return self._render_object_list_input(streamlit_app, key, property) if schema_utils.is_property_list(property): return self._render_property_list_input(streamlit_app, key, property) if schema_utils.is_single_reference(property): return self._render_single_reference(streamlit_app, key, property) streamlit_app.warning( "The type of the following property is currently not supported: " + str(property.get("title"))) raise Exception("Unsupported property")
def _render_single_output(self, streamlit: st, output_data: BaseModel) -> None: try: if has_output_ui_renderer(output_data): if function_has_named_arg(output_data.render_output_ui, "input"): # type: ignore # render method also requests the input data output_data.render_output_ui(streamlit, input=self._input_data) # type: ignore else: output_data.render_output_ui(streamlit) # type: ignore return except Exception: # Use default auto-generation methods if the custom rendering throws an exception logger.exception( "Failed to execute custom render_output_ui function. Using auto-generation instead" ) model_schema = output_data.schema(by_alias=False) model_properties = model_schema.get("properties") definitions = model_schema.get("definitions") if model_properties: for property_key in output_data.__dict__: property_schema = model_properties.get(property_key) if not property_schema.get("title"): # Set property key as fallback title property_schema["title"] = property_key output_property_value = output_data.__dict__[property_key] if has_output_ui_renderer(output_property_value): output_property_value.render_output_ui(streamlit) # type: ignore continue if isinstance(output_property_value, BaseModel): # Render output recursivly streamlit.subheader(property_schema.get("title")) if property_schema.get("description"): streamlit.markdown(property_schema.get("description")) self._render_single_output(streamlit, output_property_value) continue if property_schema: if schema_utils.is_single_file_property(property_schema): self._render_single_file_property( streamlit, property_schema, output_property_value ) continue if ( schema_utils.is_single_string_property(property_schema) or schema_utils.is_single_number_property(property_schema) or schema_utils.is_single_datetime_property(property_schema) or schema_utils.is_single_boolean_property(property_schema) ): self._render_single_text_property( streamlit, property_schema, output_property_value ) continue if definitions and schema_utils.is_single_enum_property( property_schema, definitions ): self._render_single_text_property( streamlit, property_schema, output_property_value.value ) continue # TODO: render dict as table self._render_single_complex_property( streamlit, property_schema, output_property_value ) return # Display single field in code block: # if len(output_data.__dict__) == 1: # value = next(iter(output_data.__dict__.values())) # if type(value) in (int, float, str): # # Should not be a complex object (with __dict__) -> should be a primitive # # hasattr(output_data.__dict__[0], '__dict__') # streamlit.subheader("This is a test:") # streamlit.code(value, language="plain") # return # Fallback to json output streamlit.json(jsonable_encoder(output_data))