import gradio as gr from src.core import get_table_mapping, transform_source, process_csv_text, generate_mapping_code MAX_ROWS = 10 def export_csv(d): filepath = "output.csv" d.to_csv(filepath) return gr.File.update(value=filepath, visible=True) def generate_step_markdown(step_number: int, subtitle: str): return gr.Markdown(f"# Step {step_number}\n\n ### {subtitle}") def export_csv(df, filename): df.to_csv(filename) return gr.File.update(value=filename, visible=True) def export_text(val, filename): with open(filename, "w") as f: f.write(val) return gr.File.update(value=filename, visible=True) def export_transformed_source(d): filename = "transformed_source.csv" d.to_csv(filename) return gr.File.update(value=filename, visible=True) with gr.Blocks() as demo: # STEP 1 generate_step_markdown(1, "Upload a Template CSV (target schema) and a Source CSV.") with gr.Row(): with gr.Column(): upload_template_btn = gr.UploadButton(label="Upload Template File", file_types = ['.csv'], live=True, file_count = "single") template_df = gr.Dataframe(max_rows=MAX_ROWS) upload_template_btn.upload(fn=process_csv_text, inputs=upload_template_btn, outputs=template_df) with gr.Column(): upload_source_button = gr.UploadButton(label="Upload Source File", file_types = ['.csv'], live=True, file_count = "single") source_df = gr.Dataframe(max_rows=MAX_ROWS) upload_source_button.upload(fn=process_csv_text, inputs=upload_source_button, outputs=source_df) # STEP 2 generate_step_markdown(2, "Generate mapping from Source to Template. Once generated, you can edit the values directly in the table below.") with gr.Row(): generate_mapping_btn = gr.Button(value="Generate Mapping", variant="primary") with gr.Row(): table_mapping_df = gr.DataFrame(max_rows=MAX_ROWS, interactive=True) generate_mapping_btn.click(fn=get_table_mapping, inputs=[source_df, template_df], outputs=[table_mapping_df]) with gr.Row(): save_mapping_btn = gr.Button(value="Save Mapping", variant="secondary") with gr.Row(): csv = gr.File(interactive=False, visible=False) save_mapping_btn.click(lambda df: export_csv(df, "source_template_mapping.csv"), table_mapping_df, csv) mapping_file = gr.File(label="Downloaded File", visible=False) mapping_file.change(lambda x: x, mapping_file, table_mapping_df) # STEP 3 generate_step_markdown(3, "Generate python code to transform Source to Template, using the generated mapping.") with gr.Row(): generate_code_btn = gr.Button(value="Generate Code from Mapping", variant="primary") with gr.Row(): code_block = gr.Code(language="python") generate_code_btn.click(fn=generate_mapping_code, inputs=[table_mapping_df], outputs=[code_block]) with gr.Row(): save_code_btn = gr.Button(value="Save Code", variant="secondary") with gr.Row(): text = gr.File(interactive=False, visible=False) save_code_btn.click(lambda txt: export_text(txt, "transformation_code.py"), code_block, text) code_file = gr.File(label="Downloaded File", visible=False) code_file.change(lambda x: x, code_file, code_block) # STEP 4 generate_step_markdown(4, "Transform the Source CSV into the Template CSV using the generated code.") with gr.Row(): transform_btn = gr.Button(value="Transform Source", variant="primary") with gr.Row(): gr.Markdown("Source (transformed)") source_df_transformed = gr.Dataframe(label="Source Transformed", max_rows=MAX_ROWS) transform_btn.click(transform_source, inputs=[source_df, code_block], outputs=[source_df_transformed]) with gr.Row(): save_transformed_source_btn = gr.Button(value="Save Transformed Source", variant="secondary") with gr.Row(): csv = gr.File(interactive=False, visible=False) save_transformed_source_btn.click(lambda df: export_csv(df, "transformed_source.csv"), source_df_transformed, csv) transform_file = gr.File(label="Downloaded File", visible=False) transform_file.change(lambda x: x, transform_file, source_df_transformed) demo.launch()