Skip to content

Commit 37ed2fc

Browse files
Enhance dataset handling and UI components; update import wizard to use 'Dataset Name' terminology and improve preview functionality
1 parent 3e898a2 commit 37ed2fc

5 files changed

Lines changed: 73 additions & 60 deletions

File tree

batch_processing/batch_method.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import json
1010
from batch_processing.batch_error_handling import handle_batch_fail
11-
from file_handling.data_conversion import to_long_df, save_as_csv
11+
from file_handling.data_conversion import to_long_df, save_as_csv, join_datasets
1212
from file_handling.data_import import import_data
1313
from settings import config, secrets_store
1414
from openai import OpenAI
@@ -67,6 +67,7 @@ def send_batch(root: Any, type: str) -> Any:
6767

6868
batch_bytes = generate_single_label_batch(labels, text)
6969
datasets = (labels_nickname, quotes_nickname)
70+
joined_datasets = join_datasets(datasets)
7071

7172
elif type == "multi_label":
7273
# Get labels data
@@ -82,6 +83,7 @@ def send_batch(root: Any, type: str) -> Any:
8283
text, quotes_nickname = from_import
8384

8485
datasets = (labels_nickname, quotes_nickname)
86+
joined_datasets = join_datasets(datasets)
8587
batch_bytes = generate_multi_label_batch(labels, text)
8688

8789
elif type == "keyword_extraction":
@@ -91,7 +93,7 @@ def send_batch(root: Any, type: str) -> Any:
9193
return # user hit Cancel
9294
text, text_nickname = from_import
9395

94-
datasets = (text_nickname)
96+
joined_datasets = join_datasets(text_nickname)
9597
batch_bytes = generate_keyword_extraction_batch(text)
9698
else:
9799
raise ValueError(f"Unknown batch type: {type}")
@@ -112,7 +114,7 @@ def send_batch(root: Any, type: str) -> Any:
112114
metadata={
113115
"model": config.model,
114116
"type": type,
115-
"dataset(s)": ",".join(map(str,datasets))
117+
"dataset(s)": joined_datasets
116118
}
117119
)
118120

file_handling/data_conversion.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from collections.abc import Sequence
1+
from collections.abc import Sequence, Iterable
22
from enum import Enum
33
from tkinter import filedialog, messagebox
44

@@ -60,4 +60,14 @@ def is_listy(x):
6060
if list_cols:
6161
df = df.dropna(subset=list_cols, how='any')
6262

63-
return df
63+
return df
64+
65+
66+
def join_datasets(datasets):
67+
if datasets is None:
68+
return ""
69+
if isinstance(datasets, (str, bytes)):
70+
return datasets
71+
if isinstance(datasets, Iterable):
72+
return ",".join(map(str, datasets))
73+
return str(datasets)

file_handling/data_import.py

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
"""
2-
Universal tabular import with a small 'Import Wizard' UI + nickname selector.
2+
Universal tabular import with a small 'Import Wizard' UI + dataset name selector.
33
44
Changes in this version:
55
- Keeps CSV/TSV/TXT/Excel support and the scrollable preview with column radio-select.
6-
- Adds a "Nickname" section under the table with three radio options:
6+
- Adds a "Dataset Name" section under the table with three radio options:
77
1) File name (stem)
88
2) Selected column header (enabled only if "File has headers" is checked)
99
3) Other (free text entry)
10-
- On Import, returns (values_from_selected_column, selected_nickname).
10+
- On Import, returns (values_from_selected_column, selected_dataset_name).
1111
1212
Public API:
1313
import_csv(parent: Optional[tk.Misc]=None, title="Import Data") -> Optional[tuple[list[str], str]]
@@ -198,11 +198,11 @@ def import_data(
198198
) -> Optional[tuple[list[str], str]]:
199199
"""
200200
Open an "Import Wizard" dialog: select a file, preview it, choose 'has headers',
201-
pick exactly one column via radio buttons, choose a nickname, and return that
202-
column's values and the chosen nickname.
201+
pick exactly one column via radio buttons, choose a dataset name, and return that
202+
column's values and the chosen dataset name.
203203
204204
Returns:
205-
(values_from_selected_column, selected_nickname) or None if cancelled.
205+
(values_from_selected_column, selected_dataset_name) or None if cancelled.
206206
"""
207207

208208
# ---------------- Setup window ----------------
@@ -272,28 +272,28 @@ def browse_file():
272272
tree.configure(yscrollcommand=vscroll.set, xscrollcommand=hscroll.set)
273273
hscroll.configure(command=tree.xview)
274274

275-
# ---------------- Nickname controls ----------------
275+
# ---------------- Dataset Name controls ----------------
276276
# Options: 0 = filename, 1 = selected column header, 2 = other (entry)
277-
nickname_mode = tk.IntVar(master=dlg, value=0)
278-
nickname_other = tk.StringVar(master=dlg, value="")
279-
nickname_preview = tk.StringVar(master=dlg, value="")
277+
dataset_name_mode = tk.IntVar(master=dlg, value=0)
278+
dataset_name_other = tk.StringVar(master=dlg, value="")
279+
dataset_name_preview = tk.StringVar(master=dlg, value="")
280280

281-
nick_frame = ttk.LabelFrame(dlg, text="Nickname")
281+
nick_frame = ttk.LabelFrame(dlg, text="Dataset Name")
282282
nick_frame.grid(row=8, column=0, columnspan=3, sticky="we", padx=10, pady=(0, 10))
283283
for col in range(3):
284284
nick_frame.columnconfigure(col, weight=1)
285285

286-
r_file = ttk.Radiobutton(nick_frame, text="Use file name", value=0, variable=nickname_mode)
287-
r_colh = ttk.Radiobutton(nick_frame, text="Use selected column header", value=1, variable=nickname_mode)
288-
r_other = ttk.Radiobutton(nick_frame, text="Other:", value=2, variable=nickname_mode)
286+
r_file = ttk.Radiobutton(nick_frame, text="Use file name", value=0, variable=dataset_name_mode)
287+
r_colh = ttk.Radiobutton(nick_frame, text="Use selected column header", value=1, variable=dataset_name_mode)
288+
r_other = ttk.Radiobutton(nick_frame, text="Other:", value=2, variable=dataset_name_mode)
289289
r_file.grid(row=0, column=0, sticky="w", padx=8, pady=6)
290290
r_colh.grid(row=0, column=1, sticky="w", padx=8, pady=6)
291291
r_other.grid(row=0, column=2, sticky="w", padx=8, pady=6)
292292

293-
other_entry = ttk.Entry(nick_frame, textvariable=nickname_other, width=30, state="disabled")
293+
other_entry = ttk.Entry(nick_frame, textvariable=dataset_name_other, width=30, state="disabled")
294294
other_entry.grid(row=1, column=2, sticky="w", padx=30, pady=(0, 8))
295295

296-
ttk.Label(nick_frame, textvariable=nickname_preview, foreground="#555").grid(
296+
ttk.Label(nick_frame, textvariable=dataset_name_preview, foreground="#555").grid(
297297
row=1, column=0, columnspan=2, sticky="w", padx=8, pady=(0, 8)
298298
)
299299

@@ -326,7 +326,7 @@ def _fill_preview_rows(rows: list[list[str]]):
326326
def _initial_blank_preview():
327327
_set_preview_columns([f"Column {i+1}" for i in range(5)])
328328
_fill_preview_rows([[""] * 5 for _ in range(5)])
329-
_update_nickname_preview()
329+
_update_dataset_name_preview()
330330

331331
def _current_header_labels() -> list[str]:
332332
# Return the labels currently shown atop the preview
@@ -339,27 +339,27 @@ def _selected_header_label() -> str:
339339
return str(labels[idx])
340340
return ""
341341

342-
def _update_nickname_controls_enabled():
342+
def _update_dataset_name_controls_enabled():
343343
# Enable/disable "selected column header" radio based on has_headers + data present
344344
has_data = bool(_loaded_rows)
345345
enable_col_header = has_headers.get() and has_data and len(tree["columns"]) > 0
346346
state = "normal" if enable_col_header else "disabled"
347347
r_colh.configure(state=state)
348-
if state == "disabled" and nickname_mode.get() == 1:
349-
nickname_mode.set(0) # fall back to filename
348+
if state == "disabled" and dataset_name_mode.get() == 1:
349+
dataset_name_mode.set(0) # fall back to filename
350350
# Enable/disable custom entry
351-
other_state = "normal" if nickname_mode.get() == 2 else "disabled"
351+
other_state = "normal" if dataset_name_mode.get() == 2 else "disabled"
352352
other_entry.configure(state=other_state)
353353

354-
def _update_nickname_preview(*_args):
355-
choice = nickname_mode.get()
354+
def _update_dataset_name_preview(*_args):
355+
choice = dataset_name_mode.get()
356356
if choice == 0:
357-
nickname_preview.set(f"Nickname{(_filename_stem or '—')}")
357+
dataset_name_preview.set(f"Dataset Name{(_filename_stem or '—')}")
358358
elif choice == 1:
359-
nickname_preview.set(f"Nickname{(_selected_header_label() or '—')}")
359+
dataset_name_preview.set(f"Dataset Name{(_selected_header_label() or '—')}")
360360
else:
361-
nickname_preview.set(f"Nickname {(nickname_other.get().strip() or '—')}")
362-
_update_nickname_controls_enabled()
361+
dataset_name_preview.set(f"Dataset Name {(dataset_name_other.get().strip() or '—')}")
362+
_update_dataset_name_controls_enabled()
363363

364364
def _selected_header_label() -> str:
365365
return _selected_header_label_cached()
@@ -407,8 +407,8 @@ def _sel_hdr():
407407
return ""
408408
_selected_header_label_cached = _sel_hdr
409409

410-
# Reset nickname preview (filename by default)
411-
_update_nickname_preview()
410+
# Reset dataset_name preview (filename by default)
411+
_update_dataset_name_preview()
412412

413413
# Clamp selected column
414414
if selected_col.get() >= len(header):
@@ -418,19 +418,19 @@ def _sel_hdr():
418418
_selected_header_label_cached = lambda: ""
419419

420420
# Reactivity hooks
421-
selected_col.trace_add("write", _update_nickname_preview)
421+
selected_col.trace_add("write", _update_dataset_name_preview)
422422
has_headers.trace_add("write", lambda *_: (_refresh_preview(),))
423-
nickname_mode.trace_add("write", _update_nickname_preview)
424-
nickname_other.trace_add("write", _update_nickname_preview)
423+
dataset_name_mode.trace_add("write", _update_dataset_name_preview)
424+
dataset_name_other.trace_add("write", _update_dataset_name_preview)
425425

426426
_initial_blank_preview() # start 5x5
427427

428428
# -------------- Import handler --------------
429429
result_values: Optional[list[str]] = None
430-
result_nickname: Optional[str] = None
430+
result_dataset_name: Optional[str] = None
431431

432432
def _do_import():
433-
nonlocal result_values, result_nickname
433+
nonlocal result_values, result_dataset_name
434434
path = file_var.get().strip()
435435
if not path:
436436
messagebox.showerror("Error", "No file selected.", parent=dlg)
@@ -455,26 +455,26 @@ def _do_import():
455455
val = r[col_idx] if col_idx < len(r) else ""
456456
out.append("" if val is None else str(val))
457457

458-
# Resolve nickname
459-
mode = nickname_mode.get()
458+
# Resolve dataset_name
459+
mode = dataset_name_mode.get()
460460
if mode == 0:
461-
nickname = _filename_stem or "data"
461+
dataset_name = _filename_stem or "data"
462462
elif mode == 1:
463463
if not has_headers.get():
464-
messagebox.showerror("Nickname error", "Column header option requires headers to be enabled.", parent=dlg)
464+
messagebox.showerror("Dataset Name error", "Column header option requires headers to be enabled.", parent=dlg)
465465
return
466-
nickname = _selected_header_label()
467-
if not nickname.strip():
468-
messagebox.showerror("Nickname error", "Selected column has an empty header.", parent=dlg)
466+
dataset_name = _selected_header_label()
467+
if not dataset_name.strip():
468+
messagebox.showerror("Dataset Name error", "Selected column has an empty header.", parent=dlg)
469469
return
470470
else:
471-
nickname = nickname_other.get().strip()
472-
if not nickname:
473-
messagebox.showerror("Nickname error", "Please type a nickname in the 'Other' field.", parent=dlg)
471+
dataset_name = dataset_name_other.get().strip()
472+
if not dataset_name:
473+
messagebox.showerror("Dataset Name error", "Please type a dataset_name in the 'Other' field.", parent=dlg)
474474
return
475475

476476
result_values = out
477-
result_nickname = nickname
477+
result_dataset_name = dataset_name
478478
dlg.destroy()
479479

480480
process_btn.configure(command=_do_import)
@@ -493,6 +493,6 @@ def _do_import():
493493
owner.wait_window(dlg)
494494
_safe_destroy(created_root)
495495

496-
if result_values is None or result_nickname is None:
496+
if result_values is None or result_dataset_name is None:
497497
return None
498-
return result_values, result_nickname
498+
return result_values, result_dataset_name

live_processing/sampler.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ def _read_table(path: str, has_header: bool) -> pd.DataFrame:
5050

5151
def _coerce_preview(df: pd.DataFrame, has_header: bool) -> pd.DataFrame:
5252
"""
53-
Return top 5 rows for preview. If no header, ensure generic column names.
53+
Return top 20 rows for preview. If no header, ensure generic column names.
5454
"""
55-
preview = df.head(5).copy()
55+
preview = df.head(20).copy()
5656
if not has_header:
5757
# Assign generic names if pandas has numeric columns 0..N-1
5858
ncols = preview.shape[1]
@@ -120,7 +120,7 @@ class ImportSampleDialog(tk.Toplevel):
120120
Modal dialog:
121121
- Choose file
122122
- Header checkbox
123-
- Preview (top 5 rows)
123+
- Preview (top 20 rows)
124124
- Sampling controls (rows / percent)
125125
- OK / Cancel
126126
After OK, performs sampling and save dialog; closes when done.
@@ -192,7 +192,7 @@ def _build_ui(self):
192192
self.entry_percent.grid(row=2, column=1, sticky="w", pady=(6,0))
193193

194194
# Preview
195-
preview_frame = ttk.LabelFrame(self, text="Preview (top 5 rows)")
195+
preview_frame = ttk.LabelFrame(self, text="Preview (top 20 rows)")
196196
preview_frame.grid(row=2, column=0, padx=12, pady=(0, 8), sticky="nsew")
197197
self.rowconfigure(2, weight=1)
198198

@@ -210,10 +210,11 @@ def _build_ui(self):
210210
# Buttons
211211
btns = ttk.Frame(self)
212212
btns.grid(row=3, column=0, padx=12, pady=(0, 12), sticky="e")
213-
self.btn_ok = ttk.Button(btns, text="OK", command=self._on_ok, state="disabled")
214213
self.btn_cancel = ttk.Button(btns, text="Cancel", command=self._on_cancel)
215-
self.btn_ok.grid(row=0, column=0, padx=(0, 8))
216-
self.btn_cancel.grid(row=0, column=1)
214+
self.btn_cancel.grid(row=0, column=0)
215+
self.btn_ok = ttk.Button(btns, text="OK", command=self._on_ok, state="disabled")
216+
self.btn_ok.grid(row=0, column=1, padx=(0, 8))
217+
217218

218219
self._update_sampling_entry_state()
219220

ui/two_page_wizard.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def __init__(self, master, **kwargs):
107107
self.file_based_name = tk.StringVar(value="")
108108
self.custom_name = tk.StringVar(value="")
109109

110-
ttk.Label(self, text="Dataset name").pack(anchor="w")
110+
ttk.Label(self, text="Dataset Name").pack(anchor="w")
111111

112112
# Radio: Use file name
113113
row1 = ttk.Frame(self)

0 commit comments

Comments
 (0)