A terminal spreadsheet multitool for discovering and arranging data
This report summarizes scanner evidence for saulpw/visidata, a Python project with 9,331 GitHub stars. SynthScan examined 58,702 lines of code across 487 source files, recording 880 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 32.8 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 243 finding(s).
Are imports declared and package/API names verified? 459 finding(s).
Are wrappers, guards, and repeated structures necessary? 234 finding(s).
Which changes need focused human review? 880 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 880 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | visidata/indexsheet.py | 93 | vd.addCommand('S', 'sheets-stack', 'vd.push(vd.sheetsSheet)', 'open Sheets Stack: join or jump between the active sheets | STRING |
| HIGH⚡ | visidata/indexsheet.py | 94 | vd.addCommand('gS', 'sheets-all', 'vd.allSheetsSheet.reload(); vd.push(vd.allSheetsSheet)', 'open Sheets Sheet: join or | STRING |
| HIGH⚡ | visidata/indexsheet.py | 102 | IndexSheet.addCommand('gC', 'columns-selected', 'vd.push(ColumnsSheet("all_columns", source=selectedRows))', 'open Colum | STRING |
| HIGH⚡ | visidata/indexsheet.py | 105 | SheetsSheet.addCommand('Enter', 'open-row', 'dest=cursorRow; vd.sheets.remove(sheet) if not sheet.precious else None; vd | STRING |
| HIGH | visidata/plugins.py | 96 | BaseSheet.addCommand(None, 'open-plugins', 'vd.push(vd.pluginsSheet)', 'Open Plugins Sheet to manage supported plugins') | CODE |
| HIGH | visidata/sidebar.py | 235 | BaseSheet.addCommand('gb', 'open-sidebar', 'sheet.current_sidebar = "" if not hasattr(sheet, "current_sidebar") else she | STRING |
| HIGH | visidata/guide.py | 207 | BaseSheet.addCommand('', 'open-guide-index', 'vd.push(GuideIndex("VisiData_Guide"))', 'open VisiData guides table of con | STRING |
| HIGH | visidata/statusbar.py | 294 | BaseSheet.addCommand('Ctrl+P', 'open-statuses', 'vd.push(vd.statusHistorySheet)', 'open Status History') | CODE |
| HIGH | visidata/input_history.py | 55 | vd.addCommand(None, 'open-input-history', 'vd.push(inputHistorySheet)', 'open sheet with previous inputs') | CODE |
| HIGH | visidata/choose.py | 35 | vd.push(vs) | CODE |
| HIGH⚡ | visidata/sheets.py | 1301 | Sheet.addCommand('"', 'dup-selected', 'vs=copy(sheet); vs.name += "_selectedref"; vs.reload=lambda vs=vs,rows=selectedRo | CODE |
| HIGH⚡ | visidata/sheets.py | 1302 | Sheet.addCommand('g"', 'dup-rows', 'vs=copy(sheet); vs.name+="_copy"; vs.rows=list(rows); status("copied "+vs.name); vs. | CODE |
| HIGH⚡ | visidata/sheets.py | 1303 | Sheet.addCommand('z"', 'dup-selected-deep', 'vs = deepcopy(sheet); vs.name += "_selecteddeepcopy"; vs.rows = vs.async_de | CODE |
| HIGH⚡ | visidata/sheets.py | 1304 | Sheet.addCommand('gz"', 'dup-rows-deep', 'vs = deepcopy(sheet); vs.name += "_deepcopy"; vs.rows = vs.async_deepcopy(rows | CODE |
| HIGH | visidata/sheets.py | 1156 | return vd.push(vs) | CODE |
| HIGH | visidata/sheets.py | 1282 | vd.push(vs) | CODE |
| HIGH | visidata/sheets.py | 1325 | BaseSheet.addCommand('A', 'open-new', 'vd.push(vd.newSheet("unnamed", 1))', 'Open new empty sheet') | CODE |
| HIGH | visidata/sheets.py | 1327 | BaseSheet.addCommand('`', 'open-source', 'vd.push(source)', 'open source sheet') | CODE |
| HIGH | visidata/mainloop.py | 358 | vd.push(vs, load=False) | CODE |
| HIGH | visidata/memory.py | 45 | BaseSheet.addCommand('Alt+Shift+M', 'open-memos', 'vd.push(vd.memosSheet)', 'open the Memory Sheet') | CODE |
| HIGH | visidata/pyobj.py | 266 | vd.push(sheet.openRow(r)) | CODE |
| HIGH | visidata/pyobj.py | 274 | vd.push(openCell(col, r)) | CODE |
| HIGH⚡ | visidata/pyobj.py | 301 | BaseSheet.addCommand('Ctrl+X', 'pyobj-expr', 'expr=inputPythonExpr(); vd.push(PyobjSheet(expr, source=sheet.evalExpr(exp | CODE |
| HIGH⚡ | visidata/pyobj.py | 305 | BaseSheet.addCommand('zCtrl+X', 'pyobj-expr-row', 'expr = input("eval over current row: ", "expr", completer=CompleteExp | CODE |
| HIGH⚡ | visidata/pyobj.py | 310 | Sheet.addCommand('Ctrl+Y', 'pyobj-row', 'status(type(cursorRow).__name__); vd.push(openRowPyobj(cursorRowIndex))', 'open | CODE |
| HIGH⚡ | visidata/pyobj.py | 311 | Sheet.addCommand('zCtrl+Y', 'pyobj-cell', 'status(type(cursorValue).__name__); vd.push(openCellPyobj(cursorCol, cursorRo | CODE |
| HIGH⚡ | visidata/pyobj.py | 312 | BaseSheet.addCommand('gCtrl+Y', 'pyobj-sheet', 'status(type(sheet).__name__); vd.push(PyobjSheet(sheet.name+"_sheet", so | CODE |
| HIGH⚡ | visidata/pyobj.py | 314 | Sheet.addCommand('', 'open-row-basic', 'vd.push(TableSheet.openRow(sheet, cursorRow))', 'dive into current row as basic | CODE |
| HIGH⚡ | visidata/pyobj.py | 315 | Sheet.addCommand('Enter', 'open-row', 'vd.push(openRow(cursorRow)) if cursorRow is not None else vd.fail("no row to open | CODE |
| HIGH⚡ | visidata/pyobj.py | 316 | Sheet.addCommand('zEnter', 'open-cell', 'vd.push(openCell(cursorCol, cursorRow))', 'open sheet with copies of rows refer | CODE |
| HIGH | visidata/splitwin.py | 14 | vd.push(undersheet, pane=pane) | CODE |
| HIGH | visidata/_open.py | 218 | BaseSheet.addCommand('o', 'open-file', 'vd.push(openSource(inputPath("open: "), create=True))', 'Open file or URL') | CODE |
| HIGH | visidata/_open.py | 219 | TableSheet.addCommand('zo', 'open-cell-file', 'cd=cursorDisplay; (vd.push(openSource(cd) if cd else fail("no path given" | CODE |
| HIGH⚡ | visidata/textsheet.py | 122 | BaseSheet.addCommand('Ctrl+E', 'error-recent', 'recentErrorsSheet.reload(); vd.push(recentErrorsSheet) if vd.lastErrors | STRING |
| HIGH⚡ | visidata/textsheet.py | 123 | BaseSheet.addCommand('gCtrl+E', 'errors-all', 'vd.push(vd.allErrorsSheet)', 'view traceback for most recent errors') | STRING |
| HIGH⚡ | visidata/textsheet.py | 125 | Sheet.addCommand('zCtrl+E', 'error-cell', 'vd.push(ErrorCellSheet(sheet.name+"_cell_error", sourceSheet=sheet, source=ge | STRING |
| HIGH⚡ | visidata/graph.py | 377 | Sheet.addCommand('.', 'plot-column', 'vd.push(GraphSheet(sheet.name, "graph", source=sheet, sourceRows=rows, xcols=keyCo | CODE |
| HIGH⚡ | visidata/graph.py | 378 | Sheet.addCommand('g.', 'plot-numerics', 'vd.push(GraphSheet(sheet.name, "graph", source=sheet, sourceRows=rows, xcols=ke | CODE |
| HIGH⚡ | visidata/graph.py | 379 | ColumnsSheet.addCommand('g.', 'plot-source-selected', 'vd.push(GraphSheet(sheet.source[0].name, "graph", source=source[0 | CODE |
| HIGH | visidata/deprecated.py | 107 | return vd.push(vs) | CODE |
| HIGH | visidata/shell.py | 62 | vd.push(TextSheet(' '.join(args), source=lines)) | CODE |
| HIGH⚡ | visidata/shell.py | 279 | DirSheet.addCommand('`', 'open-dir-parent', 'vd.push(openSource(source.parent if source.resolve()!=Path(".").resolve() e | STRING |
| HIGH⚡ | visidata/shell.py | 280 | BaseSheet.addCommand('', 'open-dir-current', 'vd.push(vd.currentDirSheet)', 'open Directory Sheet: browse properties of | STRING |
| HIGH⚡ | visidata/shell.py | 284 | DirSheet.addCommand('Enter', 'open-row-file', 'vd.push(openSource(cursorRow or fail("no row"), filetype="dir" if cursorR | STRING |
| HIGH⚡ | visidata/shell.py | 285 | DirSheet.addCommand('gEnter', 'open-rows', 'for r in selectedRows: vd.push(openSource(r))', 'open selected files as new | STRING |
| HIGH⚡ | visidata/shell.py | 292 | DirSheet.addCommand('zEnter', 'open-row-filetype', 'ft = input("filetype: ", type="filetype", value=options.filetype or | STRING |
| HIGH | visidata/shell.py | 314 | vd.push(vs, pane=2) | STRING |
| HIGH | visidata/movement.py | 107 | vd.push(matches[0]) | CODE |
| HIGH | visidata/movement.py | 140 | BaseSheet.addCommand(f'Alt+{str(i)[-1]}', f'jump-sheet-{i}', f'vd.push(*(list(s for s in allSheets if s.shortcut==st | CODE |
| HIGH | visidata/movement.py | 143 | BaseSheet.addCommand('', f'jump-sheet-{i}', f'vd.push(*(list(s for s in allSheets if s.shortcut==str({i})) or fail(" | CODE |
| HIGH | visidata/movement.py | 207 | BaseSheet.addCommand('Ctrl+^', 'jump-prev', 'vd.activeStack[1:] or fail("no previous sheet"); vd.push(vd.activeStack[1]) | CODE |
| HIGH | visidata/movement.py | 208 | BaseSheet.addCommand('gCtrl+^', 'jump-first', 'vd.push(vd.activeStack[-1])', 'jump to first sheet') | CODE |
| HIGH | visidata/threads.py | 530 | BaseSheet.addCommand('Ctrl+T', 'threads-all', 'vd.push(vd.allThreadsSheet)', 'open Threads for all sheets') | STRING |
| HIGH | visidata/threads.py | 531 | BaseSheet.addCommand('zCtrl+T', 'threads-sheet', 'vd.push(ThreadsSheet("threads", source=sheet.currentThreads))', 'open | STRING |
| HIGH | visidata/optionssheet.py | 91 | BaseSheet.addCommand('O', 'options-global', 'vd.push(vd.globalOptionsSheet)', 'open Options Sheet: edit global options ( | CODE |
| HIGH | visidata/optionssheet.py | 93 | BaseSheet.addCommand('zO', 'options-sheet', 'vd.push(sheet.optionsSheet)', 'open Options Sheet: edit sheet options (appl | CODE |
| HIGH | visidata/macros.py | 242 | Sheet.addCommand('gm', 'macro-sheet', 'vd.push(vd.macrosheet)', 'open an index of existing macros') | STRING |
| HIGH⚡ | visidata/freqtbl.py | 202 | FreqTableSheet.addCommand('', 'open-preview', 'vd.push(FreqTablePreviewSheet(sheet.name, "preview", source=sheet, column | STRING |
| HIGH⚡ | visidata/freqtbl.py | 204 | Sheet.addCommand('F', 'freq-col', 'vd.push(makeFreqTable(sheet, cursorCol))', 'open Frequency Table grouped on current c | STRING |
| HIGH⚡ | visidata/freqtbl.py | 205 | Sheet.addCommand('gF', 'freq-keys', 'vd.push(makeFreqTable(sheet, *keyCols)) if keyCols else vd.fail("there are no key c | STRING |
| 149 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/plugins.py | 7 | CODE | |
| LOW | visidata/plugins.py | 8 | CODE | |
| LOW | visidata/plugins.py | 10 | CODE | |
| LOW | visidata/plugins.py | 10 | CODE | |
| LOW | visidata/plugins.py | 10 | CODE | |
| LOW | visidata/plugins.py | 10 | CODE | |
| LOW | visidata/plugins.py | 85 | CODE | |
| LOW | visidata/plugins.py | 86 | CODE | |
| LOW | visidata/sidebar.py | 1 | CODE | |
| LOW | visidata/sidebar.py | 1 | CODE | |
| LOW | visidata/sidebar.py | 6 | CODE | |
| LOW | visidata/guide.py | 10 | CODE | |
| LOW | visidata/_urlcache.py | 42 | CODE | |
| LOW | visidata/statusbar.py | 10 | CODE | |
| LOW | visidata/color.py | 3 | CODE | |
| LOW | visidata/color.py | 4 | CODE | |
| LOW | visidata/color.py | 7 | CODE | |
| LOW | visidata/color.py | 7 | CODE | |
| LOW | visidata/color.py | 8 | CODE | |
| LOW | visidata/sheets.py | 5 | CODE | |
| LOW | visidata/sheets.py | 7 | CODE | |
| LOW | visidata/sheets.py | 7 | CODE | |
| LOW | visidata/sheets.py | 7 | CODE | |
| LOW | visidata/sheets.py | 8 | CODE | |
| LOW | visidata/mainloop.py | 5 | CODE | |
| LOW | visidata/mainloop.py | 9 | CODE | |
| LOW | visidata/mainloop.py | 9 | CODE | |
| LOW | visidata/tuiwin.py | 1 | CODE | |
| LOW | visidata/fuzzymatch.py | 14 | CODE | |
| LOW | visidata/memory.py | 1 | CODE | |
| LOW | visidata/memory.py | 1 | CODE | |
| LOW | visidata/pyobj.py | 3 | CODE | |
| LOW | visidata/_open.py | 3 | CODE | |
| LOW | visidata/_open.py | 5 | CODE | |
| LOW | visidata/textsheet.py | 6 | CODE | |
| LOW | visidata/graph.py | 1 | CODE | |
| LOW | visidata/graph.py | 4 | CODE | |
| LOW | visidata/__init__.py | 29 | CODE | |
| LOW | visidata/__init__.py | 31 | CODE | |
| LOW | visidata/__init__.py | 32 | CODE | |
| LOW | visidata/__init__.py | 40 | CODE | |
| LOW | visidata/__init__.py | 42 | CODE | |
| LOW | visidata/__init__.py | 44 | CODE | |
| LOW | visidata/__init__.py | 143 | CODE | |
| LOW | visidata/__init__.py | 154 | CODE | |
| LOW | visidata/stored_list.py | 3 | CODE | |
| LOW | visidata/movement.py | 3 | CODE | |
| LOW | visidata/menu.py | 1 | CODE | |
| LOW | visidata/menu.py | 4 | CODE | |
| LOW | visidata/menu.py | 8 | CODE | |
| LOW | visidata/aggregators.py | 9 | CODE | |
| LOW | visidata/threads.py | 11 | CODE | |
| LOW | visidata/threads.py | 11 | CODE | |
| LOW | visidata/utils.py | 2 | CODE | |
| LOW | visidata/utils.py | 4 | CODE | |
| LOW | visidata/macros.py | 3 | CODE | |
| LOW | visidata/macros.py | 6 | CODE | |
| LOW | visidata/macros.py | 7 | CODE | |
| LOW | visidata/macros.py | 7 | CODE | |
| LOW | visidata/cmdlog.py | 1 | CODE | |
| 190 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | visidata/save.py | 192 | except FileExistsError: | CODE |
| HIGH | visidata/basesheet.py | 342 | except (ValueError, IndexError): | CODE |
| HIGH | visidata/color.py | 91 | except Exception: | CODE |
| HIGH | visidata/sheets.py | 819 | except ValueError: # from .index | CODE |
| HIGH | visidata/sheets.py | 831 | except IndexError: | CODE |
| HIGH | visidata/sheets.py | 953 | except (TypeError, ValueError): | CODE |
| HIGH | visidata/vdobj.py | 137 | except curses.error: | CODE |
| HIGH | visidata/pyobj.py | 58 | except AttributeError: #2631 attributes like formatted_help can raise AttributeError | CODE |
| HIGH | visidata/pyobj.py | 221 | except Exception: | CODE |
| HIGH | visidata/_open.py | 77 | except FileNotFoundError: | CODE |
| HIGH | visidata/movement.py | 83 | except Exception: | CODE |
| HIGH | visidata/menu.py | 172 | except IndexError: | CODE |
| HIGH | visidata/aggregators.py | 39 | except Exception: | CODE |
| HIGH | visidata/threads.py | 406 | except ValueError: #"ValueError: Another profiling tool is already active" | CODE |
| HIGH | visidata/motd.py | 28 | except Exception: | CODE |
| HIGH | visidata/utils.py | 118 | except Exception: | CODE |
| HIGH | visidata/utils.py | 97 | except Exception: | CODE |
| HIGH | visidata/utils.py | 135 | except IndexError: | CODE |
| HIGH | visidata/wrappers.py | 94 | except Exception: | CODE |
| HIGH | visidata/cmdlog.py | 440 | except ValueError: | CODE |
| HIGH | visidata/cmdlog.py | 445 | except Exception: | CODE |
| HIGH | visidata/mouse.py | 124 | except curses.error: | CODE |
| HIGH | visidata/_input.py | 79 | except curses.error: | CODE |
| HIGH | visidata/errors.py | 44 | except ValueError: | CODE |
| HIGH | visidata/selection.py | 198 | except Exception: | CODE |
| HIGH | visidata/main.py | 201 | except IndexError: | CODE |
| HIGH | visidata/main.py | 363 | except Exception: | CODE |
| HIGH | visidata/cliptext.py | 242 | except curses.error: | CODE |
| HIGH | visidata/column.py | 346 | except KeyError: | CODE |
| HIGH | visidata/features/command_server.py | 183 | except FileNotFoundError: | CODE |
| HIGH | visidata/features/command_server.py | 285 | except (TypeError, ValueError): | CODE |
| HIGH | visidata/features/melt.py | 81 | except Exception: | CODE |
| HIGH | visidata/apps/vdsql/_ibis.py | 45 | except TypeError: | CODE |
| HIGH | visidata/apps/vdsql/_ibis.py | 234 | except Exception: | CODE |
| HIGH | visidata/loaders/orgmode.py | 308 | except FileNotFoundError: | CODE |
| HIGH | visidata/loaders/pcap.py | 405 | except Exception: | CODE |
| HIGH | visidata/loaders/claude.py | 96 | except Exception: | CODE |
| HIGH | visidata/loaders/texttables.py | 19 | except ModuleNotFoundError: | CODE |
| HIGH | visidata/loaders/_pandas.py | 104 | except TypeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 35 | CODE | |
| LOW | visidata/save.py | 40 | CODE | |
| LOW | visidata/sidebar.py | 92 | CODE | |
| LOW | visidata/guide.py | 168 | CODE | |
| LOW | visidata/choose.py | 42 | CODE | |
| LOW | visidata/color.py | 222 | CODE | |
| LOW | visidata/color.py | 126 | CODE | |
| LOW | visidata/sheets.py | 1172 | CODE | |
| LOW | visidata/sheets.py | 113 | CODE | |
| LOW | visidata/sheets.py | 682 | CODE | |
| LOW | visidata/sheets.py | 849 | CODE | |
| LOW | visidata/sheets.py | 934 | CODE | |
| LOW | visidata/mainloop.py | 75 | CODE | |
| LOW | visidata/mainloop.py | 125 | CODE | |
| LOW | visidata/mainloop.py | 177 | CODE | |
| LOW | visidata/mainloop.py | 267 | CODE | |
| LOW | visidata/fuzzymatch.py | 97 | CODE | |
| LOW | visidata/fuzzymatch.py | 111 | CODE | |
| LOW | visidata/fuzzymatch.py | 184 | CODE | |
| LOW | visidata/fuzzymatch.py | 377 | CODE | |
| LOW | visidata/pyobj.py | 183 | CODE | |
| LOW | visidata/_open.py | 98 | CODE | |
| LOW | visidata/_open.py | 205 | CODE | |
| LOW | visidata/graph.py | 100 | CODE | |
| LOW | visidata/graph.py | 147 | CODE | |
| LOW | visidata/stored_list.py | 22 | CODE | |
| LOW | visidata/movement.py | 71 | CODE | |
| LOW | visidata/menu.py | 165 | CODE | |
| LOW | visidata/menu.py | 261 | CODE | |
| LOW | visidata/menu.py | 412 | CODE | |
| LOW | visidata/menu.py | 263 | CODE | |
| LOW | visidata/aggregators.py | 303 | CODE | |
| LOW | visidata/threads.py | 352 | CODE | |
| LOW | visidata/threads.py | 410 | CODE | |
| LOW | visidata/form.py | 60 | CODE | |
| LOW | visidata/wrappers.py | 98 | CODE | |
| LOW | visidata/macros.py | 94 | CODE | |
| LOW | visidata/macros.py | 182 | CODE | |
| LOW | visidata/cmdlog.py | 331 | CODE | |
| LOW | visidata/settings.py | 482 | CODE | |
| LOW | visidata/settings.py | 26 | CODE | |
| LOW | visidata/settings.py | 95 | CODE | |
| LOW | visidata/settings.py | 209 | CODE | |
| LOW | visidata/mouse.py | 94 | CODE | |
| LOW | visidata/_input.py | 372 | CODE | |
| LOW | visidata/_input.py | 552 | CODE | |
| LOW | visidata/_input.py | 175 | CODE | |
| LOW | visidata/_input.py | 249 | CODE | |
| LOW | visidata/selection.py | 187 | CODE | |
| LOW | visidata/hint.py | 12 | CODE | |
| LOW | visidata/ddwplay.py | 83 | CODE | |
| LOW | visidata/main.py | 181 | CODE | |
| LOW | visidata/main.py | 288 | CODE | |
| LOW | visidata/cliptext.py | 71 | CODE | |
| LOW | visidata/cliptext.py | 111 | CODE | |
| LOW | visidata/cliptext.py | 139 | CODE | |
| LOW | visidata/cliptext.py | 246 | CODE | |
| LOW | visidata/cliptext.py | 332 | CODE | |
| LOW | visidata/cliptext.py | 457 | CODE | |
| LOW | visidata/pivot.py | 125 | CODE | |
| 110 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/save.py | 62 | except Exception as e: | CODE |
| LOW | visidata/save.py | 80 | except Exception: | CODE |
| LOW | visidata/basesheet.py | 217 | except Exception as e: | CODE |
| LOW | visidata/sidebar.py | 128 | except Exception as e: | CODE |
| LOW | visidata/statusbar.py | 120 | except Exception as e: | CODE |
| LOW | visidata/color.py | 91 | except Exception: | STRING |
| LOW | visidata/color.py | 167 | except Exception: | CODE |
| MEDIUM | visidata/color.py | 88 | def setup(self): | CODE |
| LOW | visidata/sheets.py | 242 | except Exception as e: | CODE |
| LOW | visidata/sheets.py | 925 | except Exception as e: | CODE |
| LOW | visidata/mainloop.py | 30 | except Exception as e: | CODE |
| LOW | visidata/mainloop.py | 39 | except Exception as e: | CODE |
| LOW | visidata/mainloop.py | 227 | except Exception as e: | CODE |
| LOW | visidata/mainloop.py | 248 | except Exception as e: #2859 | CODE |
| LOW | visidata/mainloop.py | 276 | except Exception as e: | CODE |
| MEDIUM | visidata/mainloop.py | 267 | def _playNextQueuedCommand(vd, sheet): | CODE |
| LOW | visidata/pyobj.py | 221 | except Exception: | CODE |
| LOW | visidata/_open.py | 79 | except Exception as e: | CODE |
| LOW | visidata/graph.py | 123 | except Exception as e: | CODE |
| LOW | visidata/deprecated.py | 217 | except Exception as e: | CODE |
| MEDIUM | visidata/deprecated.py | 214 | def __exit__(self, exc_type, exc_value, exc_traceback): | CODE |
| LOW | visidata/shell.py | 107 | except Exception as e: | CODE |
| LOW | visidata/shell.py | 350 | except Exception as e: | STRING |
| MEDIUM | visidata/shell.py | 98 | def calcValue(self, row): | CODE |
| LOW | visidata/movement.py | 83 | except Exception: | CODE |
| LOW | visidata/aggregators.py | 39 | except Exception: | STRING |
| LOW | visidata/aggregators.py | 94 | except Exception as e: | STRING |
| LOW | visidata/threads.py | 275 | except Exception as e: | CODE |
| LOW | visidata/threads.py | 287 | except Exception as e: | CODE |
| LOW | visidata/form.py | 92 | except Exception as e: | CODE |
| LOW | visidata/motd.py | 28 | except Exception: | CODE |
| MEDIUM | visidata/motd.py | 22 | def domotd(vd): | CODE |
| LOW | visidata/utils.py | 82 | except Exception: | CODE |
| LOW | visidata/utils.py | 97 | except Exception: | CODE |
| LOW | visidata/utils.py | 105 | except Exception: | CODE |
| LOW | visidata/utils.py | 118 | except Exception: | CODE |
| LOW | visidata/utils.py | 125 | except Exception: | CODE |
| LOW | visidata/utils.py | 192 | except Exception: | CODE |
| MEDIUM | visidata/utils.py | 22 | def __getattr__(self, k): | CODE |
| MEDIUM | visidata/utils.py | 189 | def get_value(self, key, args, kwargs): | CODE |
| LOW | visidata/wrappers.py | 94 | except Exception: | CODE |
| LOW | visidata/wrappers.py | 115 | except Exception as e: | CODE |
| LOW | visidata/cmdlog.py | 292 | except Exception as e: | CODE |
| LOW | visidata/cmdlog.py | 310 | except Exception as e: | CODE |
| LOW | visidata/cmdlog.py | 353 | except Exception as e: | CODE |
| LOW | visidata/cmdlog.py | 445 | except Exception: | CODE |
| LOW | visidata/modify.py | 186 | except Exception as e: | CODE |
| LOW | visidata/modify.py | 214 | except Exception: | CODE |
| LOW | visidata/modify.py | 232 | except Exception as e: | CODE |
| LOW | visidata/modify.py | 254 | except Exception as e: | CODE |
| LOW | visidata/settings.py | 450 | except Exception as e: | CODE |
| LOW | visidata/settings.py | 502 | except Exception as e: | CODE |
| LOW | visidata/settings.py | 511 | except Exception as e: | CODE |
| LOW | visidata/settings.py | 525 | except Exception as e: | CODE |
| LOW | visidata/search.py | 104 | except Exception as e: | STRING |
| LOW | visidata/search.py | 122 | except Exception as e: | STRING |
| LOW | visidata/_input.py | 330 | except Exception: | CODE |
| LOW | visidata/selection.py | 135 | except Exception as e: | CODE |
| LOW | visidata/selection.py | 198 | except Exception: | CODE |
| LOW | visidata/hint.py | 31 | except Exception as e: | CODE |
| 68 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/experimental/daw/tests/test_vdaw.py | 29 | def test_bulk_combine_groups_by_speaker(minisheet): | CODE |
| LOW | visidata/experimental/daw/tests/test_vdaw.py | 40 | def test_bulk_combine_save_preserves_sourceaudio(daw, minisheet, tmp_path): | CODE |
| LOW | visidata/experimental/daw/tests/test_vdaw.py | 54 | def test_discovered_audio_overrides_missing_sourceaudio(daw, tmp_path): | CODE |
| LOW | visidata/features/condfmt.py | 187 | def test_condfmt_bare_column_name(vd): #3061 | STRING |
| LOW | visidata/features/condfmt.py | 200 | def test_condfmt_value_binding(vd): #3061 | STRING |
| LOW | visidata/features/condfmt.py | 224 | def test_condfmt_row_binding_string_column(vd): #3061 | STRING |
| LOW | visidata/features/condfmt.py | 237 | def test_condfmt_silent_eval_error(vd): #3061 | STRING |
| LOW | visidata/features/condfmt.py | 255 | def test_condfmt_color_option_name(vd): #3061 | STRING |
| LOW | visidata/features/condfmt.py | 266 | def test_condfmt_value_is_typed_not_wrapper(vd): #3061 | STRING |
| LOW | visidata/tests/test_editor.py | 25 | def test_trailing_newlines_trimmed(self, tmp_path, monkeypatch): | CODE |
| LOW | visidata/tests/test_editor.py | 30 | def test_unchanged_roundtrips(self, tmp_path, monkeypatch): | CODE |
| LOW | visidata/tests/test_fixed_width.py | 10 | def test_data_with_internal_spaces(self): #2265 | CODE |
| LOW | visidata/tests/test_fixed_width.py | 34 | def test_right_justified_headers(self): #3029 | CODE |
| LOW | visidata/tests/test_cliptext.py | 75 | def test_clipstr_wide_truncator(self, s, w, clippeds, clippedw): | CODE |
| LOW | visidata/tests/test_cliptext.py | 101 | def test_clipstr_empty_truncator(self, s, w, clippeds, clippedw): | CODE |
| LOW | visidata/tests/test_cliptext.py | 151 | def test_clipstr_start_truncator(self, s, w, clippeds, clippedw): | CODE |
| LOW | visidata/tests/test_cliptext.py | 257 | def test_truncate_markup_middle(self, s, dispw, clipped): | CODE |
| LOW | visidata/tests/test_cliptext.py | 286 | def test_wraptext_color_spans_lines(self, text, width, expected): | CODE |
| LOW | visidata/tests/test_cliptext.py | 300 | def test_wraptext_escaped_literals(self, text, width, expected): | CODE |
| LOW | visidata/tests/test_open.py | 5 | def test_filetype_overrides_url_scheme(self): | CODE |
| LOW | visidata/tests/test_commands.py | 136 | def test_command_execstrs_compile(self): | CODE |
| LOW | visidata/tests/test_color.py | 45 | def test_pairnum_within_terminal_limit(self, fake_curses): | CODE |
| LOW | visidata/tests/test_path.py | 40 | def test_iterdir_yields_visidata_paths(self): # #2188 | CODE |
| LOW | visidata/tests/test_path.py | 45 | def test_name_returns_full_filename(self): # #2188 | CODE |
| LOW | visidata/tests/test_path.py | 57 | def test_repeatfile_bytesiowrapper(self): # #2829 | CODE |
| LOW | visidata/tests/test_path.py | 64 | def test_repeatfile_io_interface(self): # #3097 | CODE |
| LOW | visidata/tests/test_csv.py | 14 | def test_csv_skips_blank_lines(tmp_path): | CODE |
| LOW | visidata/tests/test_csv.py | 23 | def test_csv_keeps_row_of_empty_values(tmp_path): | CODE |
| LOW | visidata/tests/test_cache.py | 25 | def test_undo_reverts_cached_cell(self): | CODE |
| LOW | visidata/apps/galcon/galcon-server.py | 542 | def generate_map_rclogo_fixed(width, height, num_planets, distancefunc): | CODE |
| LOW⚡ | visidata/loaders/f5log.py | 280 | def split_audit_bigip_tmsh_audit(msg): | CODE |
| LOW⚡ | visidata/loaders/f5log.py | 288 | def split_audit_scriptd_run_script(msg): | CODE |
| LOW⚡ | visidata/loaders/f5log.py | 296 | def split_audit_mcpd_mcp_error(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 354 | def split_ltm_pool_mon_status(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 406 | def split_ltm_poolnode_mon_abled(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 419 | def split_ltm_pool_has_no_avail_mem(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 428 | def split_ltm_pool_has_avail_mem(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 472 | def split_ltm_rule_missing_datagroup(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 513 | def split_ltm_connection_error(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 545 | def split_ltm_virtual_address_status_or_irule_profile_err(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 566 | def split_ltm_ssl_handshake_fail(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 628 | def split_ltm_inet_port_exhaust(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 645 | def split_ltm_conn_limit_reached(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 670 | def split_ltm_syncookie_threshold(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 709 | def split_ltm_dns_failed_xfr_rcode(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 735 | def split_ltm_dns_handling_notify(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 762 | def split_ltm_dns_ignoring_tfer(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 772 | def split_ltm_http_process_state(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 836 | def split_ltm_http_header_exceeded(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 897 | def split_gtm_monitor_instance(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 922 | def split_gtm_syncgroup_change(msg): | CODE |
| LOW | visidata/loaders/f5log.py | 941 | def split_tmm_address_conflict(msg): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/_types.py | 21 | COMMENT | |
| LOW | visidata/fuzzymatch.py | 21 | scoreGapStart = -3 | COMMENT |
| LOW | visidata/loaders/pandas_freqtbl.py | 121 | )[_pivot_count_column].sort_values(ascending=False, kind="mergesort") | COMMENT |
| LOW | visidata/loaders/arrow.py | 41 | pa.lib.Type_TIMESTAMP: date, | COMMENT |
| LOW | visidata/loaders/unzip_http.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | tests/test-options-precedence.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tests/test-save.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tests/test-dirsheet.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tests/test-options-config.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tests/test-url.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docs/api/conf.py | 1 | # Configuration file for the Sphinx documentation builder. | COMMENT |
| LOW | dev/test.sh | 1 | #!/usr/bin/env bash | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/color.py | 10 | __all__ = ['ColorAttr', 'colors', 'update_attr', 'ColorMaker', 'rgb_to_attr', 'css_to_xterm256', 'xterm256_to_rgb', 'rgb | CODE |
| LOW | visidata/mainloop.py | 11 | __all__ = ['ReturnValue', 'run'] | CODE |
| LOW | visidata/vdobj.py | 6 | __all__ = ['ENTER', 'ALT', 'ESC', 'asyncthread', 'VisiData'] | CODE |
| LOW | visidata/utils.py | 8 | __all__ = ['AlwaysDict', 'AttrDict', 'DefaultAttrDict', 'moveListItem', 'namedlist', 'classproperty', 'MissingAttrFormat | CODE |
| LOW | visidata/ddwplay.py | 6 | __all__ = ['Animation', 'AnimationMgr'] | CODE |
| LOW | visidata/extensible.py | 4 | __all__ = ['Extensible', 'cache', 'drawcache', 'drawcache_property'] | CODE |
| LOW | visidata/apps/vdsql/__about__.py | 1 | __all__ = ['__title__', '__author__', '__version__', '__description__', '__license__', '__copyright__'] | CODE |
| LOW | visidata/loaders/postgres.py | 6 | __all__ = ['openurl_postgres', 'openurl_postgresql', 'openurl_rds', 'PgTable', 'PgTablesSheet'] | CODE |
| LOW | visidata/loaders/scrape.py | 3 | __all__=[ 'SelectorColumn', 'soupstr' ] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/main.py | 230 | # don't change the stack order -- just return the sheet for cursor moves. | COMMENT |
| LOW | visidata/pivot.py | 218 | # (more bins than int vals) or (if bins are of width 1), just use the vals as bins | COMMENT |
| MEDIUM | tests/test-save.sh | 33 | # on exit so the vdx golden harness's `rm -f` cleanup does not warn on it | COMMENT |
| MEDIUM | tests/test-dirsheet.sh | 14 | # golden harness (which cleans output with `rm -f`) does not warn on directories | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | visidata/experimental/daw/vdaw.py | 100 | CODE | |
| MEDIUM | visidata/loaders/html.py | 95 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/sheets.py | 966 | CODE | |
| LOW | visidata/sort.py | 70 | CODE | |
| LOW | visidata/_input.py | 372 | CODE | |
| LOW | visidata/loaders/f5log.py | 86 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | visidata/features/graph_zoom_y.py | 18 | # Check if the point is within the current x range | COMMENT |