A terminal spreadsheet multitool for discovering and arranging data
This report presents the forensic synthetic code analysis of saulpw/visidata, a Python project with 9,176 GitHub stars. SynthScan v2.0 examined 58,257 lines of code across 484 source files, recording 836 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 29.6 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 836 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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 | 1299 | Sheet.addCommand('"', 'dup-selected', 'vs=copy(sheet); vs.name += "_selectedref"; vs.reload=lambda vs=vs,rows=selectedRo | CODE |
| HIGH⚡ | visidata/sheets.py | 1300 | 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 | 1301 | Sheet.addCommand('z"', 'dup-selected-deep', 'vs = deepcopy(sheet); vs.name += "_selecteddeepcopy"; vs.rows = vs.async_de | CODE |
| HIGH⚡ | visidata/sheets.py | 1302 | 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 | 1280 | vd.push(vs) | CODE |
| HIGH | visidata/sheets.py | 1323 | BaseSheet.addCommand('A', 'open-new', 'vd.push(vd.newSheet("unnamed", 1))', 'Open new empty sheet') | CODE |
| HIGH | visidata/sheets.py | 1325 | BaseSheet.addCommand('`', 'open-source', 'vd.push(source)', 'open source sheet') | CODE |
| HIGH | visidata/mainloop.py | 355 | 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 |
| 148 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 | |
| 188 more matches not shown… | ||||
| 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 | 224 | 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 | 174 | CODE | |
| LOW | visidata/mainloop.py | 264 | 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 | |
| 109 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 | 224 | except Exception as e: | CODE |
| LOW | visidata/mainloop.py | 245 | except Exception as e: #2859 | CODE |
| LOW | visidata/mainloop.py | 273 | except Exception as e: | CODE |
| MEDIUM | visidata/mainloop.py | 264 | 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_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 |