rsdeps

Cargo.lock visualizer (mirror)
Log | Files | Refs | README | LICENSE

commit d21294fe151cadbc9f195c294544221ba9ce8392
parent 66e0cd2b6dc1540d4b7debbf25806df193d2c9df
Author: Andy Khramtsov <>
Date:   Sat, 30 May 2026 02:57:56 +0300

feat: add clear buttons

Diffstat:
Msrc/deps/pages/home.py | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 55 insertions(+), 6 deletions(-)

diff --git a/src/deps/pages/home.py b/src/deps/pages/home.py @@ -19,6 +19,8 @@ dash.register_page(__name__, path="/", order=1) class ids: cargo_toml_textarea: str = "cargo-toml-textarea" cargo_lock_textarea: str = "cargo-lock-textarea" + cargo_toml_clear: str = "cargo-toml-clear" + cargo_lock_clear: str = "cargo-lock-clear" upload_files: str = "upload-files" @@ -96,12 +98,22 @@ def layout(): placeholder="Cargo.toml contents", persistence=True, ), + html.Button( + className="button", + id=ids.cargo_toml_clear, + children="Clear Cargo.toml", + ), html.Div("Cargo lock:"), dcc.Textarea( id=ids.cargo_lock_textarea, placeholder="Cargo.lock contents", persistence=True, ), + html.Button( + className="button", + id=ids.cargo_lock_clear, + children="Clear Cargo.toml", + ), ], ), CollapseAIO( @@ -194,6 +206,9 @@ def parse_cargo_lock(contents: str) -> pl.DataFrame: ) ), missing_columns=dict( + name=pl.lit(""), + version=pl.lit(""), + source=pl.lit(""), checksum=pl.lit(""), dependencies=pl.lit([], dtype=pl.List(pl.String)), ), @@ -201,8 +216,7 @@ def parse_cargo_lock(contents: str) -> pl.DataFrame: ) -def files_into_graph(cargo_toml: pl.DataFrame, cargo_lock: pl.DataFrame) -> DfGraph: - print(cargo_toml, cargo_lock) +def files_into_graph(cargo_toml: pl.DataFrame | None, cargo_lock: pl.DataFrame) -> DfGraph: arcs = ( ( cargo_lock.select( @@ -253,7 +267,9 @@ def files_into_graph(cargo_toml: pl.DataFrame, cargo_lock: pl.DataFrame) -> DfGr cargo_toml.select( pl.col("name"), pl.lit(True).alias("explicit"), - ), + ) + if cargo_toml is not None + else pl.DataFrame(dict(name=[])), pl.col("name"), "left", ).select( @@ -468,14 +484,15 @@ def draw_graph_figure( @callback( dict( - cargo_toml_textarea=Output(ids.cargo_toml_textarea, "value"), - cargo_lock_textarea=Output(ids.cargo_lock_textarea, "value"), + cargo_toml_textarea=Output(ids.cargo_toml_textarea, "value", allow_duplicate=True), + cargo_lock_textarea=Output(ids.cargo_lock_textarea, "value", allow_duplicate=True), ), dict( contents=Input(ids.upload_files, "contents"), filename=Input(ids.upload_files, "filename"), ), dict(), + prevent_initial_call=True, ) def upload_files(inputs, state): contents: list[str] = inputs["contents"] @@ -511,6 +528,34 @@ def upload_files(inputs, state): @callback( dict( + cargo_toml_textarea=Output(ids.cargo_toml_textarea, "value", allow_duplicate=True), + ), + dict( + clean=Input(ids.cargo_toml_clear, "n_clicks"), + ), + dict(), + prevent_initial_call=True, +) +def clean_cargo_toml(inputs, state): + return dict(cargo_toml_textarea="") + + +@callback( + dict( + cargo_lock_textarea=Output(ids.cargo_lock_textarea, "value", allow_duplicate=True), + ), + dict( + clean=Input(ids.cargo_lock_clear, "n_clicks"), + ), + dict(), + prevent_initial_call=True, +) +def clean_cargo_lock(inputs, state): + return dict(cargo_lock_textarea="") + + +@callback( + dict( table_rows=Output(TableAIO.ids.ag_grid(ids.cargo_toml_table), "rowData"), ), dict( @@ -565,6 +610,7 @@ def display_cargo_lock_packages(inputs, state): cargo_lock=State(ids.cargo_lock_textarea, "value"), cache=State(ids.cache_store, "data"), ), + prevent_initial_call=True, ) def visualize(inputs, state): if ( @@ -588,10 +634,13 @@ def visualize(inputs, state): selected = None if clean: - if not state["cargo_toml"] or not state["cargo_lock"]: + if not state["cargo_lock"]: raise PreventUpdate try: cargo_toml = parse_cargo_toml(state["cargo_toml"]) + except tomllib.TOMLDecodeError: + cargo_toml = None + try: cargo_lock = parse_cargo_lock(state["cargo_lock"]) except tomllib.TOMLDecodeError as error: raise PreventUpdate from error