visidata 3.0__py3-none-any.whl → 3.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
visidata/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  'VisiData: a curses interface for exploring and arranging tabular data'
2
2
 
3
- __version__ = '3.0'
3
+ __version__ = '3.0.1'
4
4
  __version_info__ = 'VisiData v' + __version__
5
5
  __author__ = 'Saul Pwanson <vd@saul.pw>'
6
6
  __status__ = 'Production/Stable'
visidata/aggregators.py CHANGED
@@ -7,7 +7,20 @@ import statistics
7
7
  from visidata import Progress, Sheet, Column, ColumnsSheet, VisiData
8
8
  from visidata import vd, anytype, vlen, asyncthread, wrapply, AttrDict
9
9
 
10
- vd.help_aggregators = '# Aggregators Help\nHELPTODO'
10
+ vd.help_aggregators = '''# Choose Aggregators
11
+ Start typing an aggregator name or description.
12
+ Multiple aggregators can be added by separating spaces.
13
+
14
+ - `Enter` to select top aggregator.
15
+ - `Tab` to highlight top aggregator.
16
+
17
+ ## When Aggregator Highlighted
18
+
19
+ - `Tab`/`Shift+Tab` to cycle highlighted aggregator.
20
+ - `Enter` to select aggregators.
21
+ - `Space` to add highlighted aggregator.
22
+ - `0-9` to add numbered aggregator.
23
+ '''
11
24
 
12
25
  vd.option('null_value', None, 'a value to be counted as null', replay=True)
13
26
 
visidata/basesheet.py CHANGED
@@ -18,6 +18,9 @@ class LazyChainMap:
18
18
  if k not in self.objs:
19
19
  self.objs[k] = obj
20
20
 
21
+ def __iter__(self):
22
+ return iter(self.objs)
23
+
21
24
  def __contains__(self, k):
22
25
  return k in self.objs
23
26
 
@@ -175,7 +178,7 @@ class BaseSheet(DrawablePane):
175
178
  @property
176
179
  def displaySource(self):
177
180
  if isinstance(self.source, BaseSheet):
178
- return f'the *{self.source[0]}* sheet'
181
+ return f'the *{self.source}* sheet'
179
182
 
180
183
  if isinstance(self.source, (list, tuple)):
181
184
  if len(self.source) == 1:
@@ -283,7 +286,7 @@ class BaseSheet(DrawablePane):
283
286
 
284
287
  def evalExpr(self, expr, **kwargs):
285
288
  'Evaluate Python expression *expr* in the context of *kwargs* (may vary by sheet type).'
286
- return eval(expr, vd.getGlobals(), None)
289
+ return eval(expr, vd.getGlobals(), dict(sheet=self))
287
290
 
288
291
  def formatString(self, fmt, **kwargs):
289
292
  'Return formatted string with *sheet* and *vd* accessible to expressions. Missing expressions return empty strings instead of error.'
visidata/column.py CHANGED
@@ -111,7 +111,7 @@ class Column(Extensible):
111
111
  return self.__copy__() # no separate deepcopy
112
112
 
113
113
  def __getstate__(self):
114
- return {k:getattr(self, k) for k in 'name typestr width height expr keycol formatter fmtstr voffset hoffset aggstr'.split() if hasattr(self, k)}
114
+ return {k:getattr(self, k) for k in 'name typestr width height expr keycol formatter displayer fmtstr voffset hoffset aggstr'.split() if hasattr(self, k)}
115
115
 
116
116
  def __setstate__(self, d):
117
117
  for attr, v in d.items():
visidata/errors.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import traceback
2
2
 
3
- from visidata import vd, VisiData, options
3
+ from visidata import vd, VisiData
4
4
 
5
5
  vd.option('debug', False, 'exit on error and display stacktrace', max_help=0)
6
6
 
visidata/extensible.py CHANGED
@@ -30,14 +30,7 @@ class Extensible:
30
30
  ret = oldcopy(self, *args, **kwargs)
31
31
  else:
32
32
  ret = super(cls, self).__copy__(*args, **kwargs)
33
-
34
- if not hasattr(ret, membername):
35
- if copy and hasattr(self, membername):
36
- v = getattr(self, membername)
37
- else:
38
- v = initfunc()
39
- setattr(ret, membername, v)
40
-
33
+ setattr(ret, membername, getattr(self, membername) if copy and hasattr(self, membername) else initfunc())
41
34
  return ret
42
35
  cls.__copy__ = wraps(oldcopy)(newcopy) if oldcopy else newcopy
43
36
 
@@ -6,6 +6,19 @@ from visidata import DrawablePane, BaseSheet, vd, VisiData, CompleteKey, clipdra
6
6
  vd.theme_option('color_cmdpalette', 'black on 72', 'base color of command palette')
7
7
  vd.theme_option('disp_cmdpal_max', 10, 'max number of suggestions for command palette')
8
8
 
9
+ vd.help_longname = '''# Choose Command
10
+ Start typing a command longname or keyword in its helpstring.
11
+
12
+ - `Enter` to execute top command.
13
+ - `Tab` to highlight top command.
14
+
15
+ ## When Command Highlighted
16
+
17
+ - `Tab`/`Shift+Tab` to cycle highlighted command.
18
+ - `Enter` to execute highlighted command.
19
+ - `0-9` to execute numbered command.
20
+ '''
21
+
9
22
  def add_to_input(v, i, value=''):
10
23
  items = list(v.split())
11
24
  if not v or v.endswith(' '):
@@ -19,6 +32,17 @@ def add_to_input(v, i, value=''):
19
32
  def accept_input(v, i, value=None):
20
33
  raise AcceptInput(v if value is None else value)
21
34
 
35
+ def accept_input_if_subset(v, i, value=''):
36
+ # if no input, accept value under cmd palette cursor
37
+ if not v:
38
+ raise AcceptInput(value)
39
+
40
+ # if the last item is a partial match, replace it with the full value
41
+ parts = v.split()
42
+ if value and value.startswith(parts[-1]):
43
+ v = ' '.join(parts[:-1] + [value])
44
+
45
+ raise AcceptInput(v)
22
46
 
23
47
  @VisiData.lazy_property
24
48
  def usedInputs(vd):
@@ -86,7 +110,7 @@ def inputPalette(sheet, prompt, items,
86
110
  palrows.append((None, None))
87
111
 
88
112
  for i, (m, item) in enumerate(palrows):
89
- trigger_key = ' '
113
+ trigger_key = ''
90
114
  if tabitem >= 0 and item:
91
115
  trigger_key = f'{i+1}'[-1]
92
116
  bindings[trigger_key] = partial(add_to_input if multiple else accept_input, value=item[value_key])
@@ -95,13 +119,17 @@ def inputPalette(sheet, prompt, items,
95
119
 
96
120
  if tabitem < 0 and palrows:
97
121
  _ , topitem = palrows[0]
98
- bindings['^J'] = partial(accept_input, value=None)
99
122
  if multiple:
100
123
  bindings[' '] = partial(add_to_input, value=topitem[value_key])
124
+ bindings['^J'] = partial(accept_input_if_subset, value=topitem[value_key])
125
+ else:
126
+ bindings['^J'] = partial(accept_input, value=topitem[value_key])
101
127
  elif item and i == tabitem:
102
- bindings['^J'] = partial(accept_input, value=None)
103
128
  if multiple:
129
+ bindings['^J'] = partial(accept_input_if_subset, value=item[value_key])
104
130
  bindings[' '] = partial(add_to_input, value=item[value_key])
131
+ else:
132
+ bindings['^J'] = partial(accept_input, value=item[value_key])
105
133
  attr = colors.color_menu_spec
106
134
 
107
135
  match_summary = formatter(m, item, trigger_key) if item else ' '
@@ -137,11 +165,16 @@ def inputLongname(sheet):
137
165
  def _fmt_cmdpal_summary(match, row, trigger_key):
138
166
  keystrokes = this_sheets_help.revbinds.get(row.longname, [None])[0] or ' '
139
167
  formatted_longname = match.formatted.get('longname', row.longname) if match else row.longname
140
- formatted_name = f'[:onclick {row.longname}]{formatted_longname}[/]'
168
+ formatted_name = f'[:longname][:onclick {row.longname}]{formatted_longname}[/][/]'
141
169
  if vd.options.debug and match:
142
170
  keystrokes = f'[{match.score}]'
143
171
  r = f' [:keystrokes]{keystrokes.rjust(len(prompt)-5)}[/] '
144
- r += f'[:keystrokes]{trigger_key}[/] {formatted_name}'
172
+ if trigger_key:
173
+ r += f'[:keystrokes]{trigger_key}[/]'
174
+ else:
175
+ r += ' '
176
+
177
+ r += f' {formatted_name}'
145
178
  if row.description:
146
179
  formatted_desc = match.formatted.get('description', row.description) if match else row.description
147
180
  r += f' - {formatted_desc}'
@@ -150,6 +183,7 @@ def inputLongname(sheet):
150
183
  return sheet.inputPalette(prompt, this_sheets_help.cmdlist,
151
184
  value_key='longname',
152
185
  formatter=_fmt_cmdpal_summary,
186
+ help=vd.help_longname,
153
187
  type='longname')
154
188
 
155
189
 
@@ -100,6 +100,8 @@ vd.addMenuItems('''
100
100
 
101
101
  ## tests
102
102
 
103
+ sample_path = vd.pkg_resources_files(visidata) / 'tests/sample.tsv'
104
+ benchmark_path = vd.pkg_resources_files(visidata) / 'tests/benchmark.csv'
103
105
 
104
106
  def make_tester(setup_vdx):
105
107
  def t(vdx, golden):
@@ -114,8 +116,8 @@ def make_tester(setup_vdx):
114
116
  return t
115
117
 
116
118
  def test_slide_keycol_1(vd):
117
- t = make_tester('''
118
- open-file sample_data/sample.tsv
119
+ t = make_tester(f'''
120
+ open-file {sample_path}
119
121
  +::OrderDate key-col
120
122
  +::Region key-col
121
123
  +::Rep key-col
@@ -139,12 +141,12 @@ def test_slide_keycol_1(vd):
139
141
 
140
142
 
141
143
  def test_slide_leftmost(vd):
142
- t = make_tester('''open-file sample_data/benchmark.csv''')
144
+ t = make_tester(f'''open-file {benchmark_path}''')
143
145
 
144
146
  t('+::Paid slide-leftmost', 'Paid Date Customer SKU Item Quantity Unit')
145
147
 
146
- t = make_tester('''
147
- open-file sample_data/benchmark.csv
148
+ t = make_tester(f'''
149
+ open-file {benchmark_path}
148
150
  +::Date key-col
149
151
  ''')
150
152
 
visidata/guide.py CHANGED
@@ -18,6 +18,7 @@ CommandsSheet ("How to find the command you want run")
18
18
 
19
19
  # real barebones basics
20
20
  MovementGuide ("Movement and Search")
21
+ InputGuide ("Input keystrokes")
21
22
  SortGuide ("Sorting")
22
23
  TypesSheet ("The basic type system")
23
24
  CommandLog ("Undo and Replay")
@@ -116,6 +117,9 @@ class CommandHelpGetter:
116
117
  self.helpsheet.ensureLoaded()
117
118
 
118
119
  def __getattr__(self, k):
120
+ return self.__getitem__(k)
121
+
122
+ def __getitem__(self, k):
119
123
  longname = k.replace('_', '-')
120
124
  binding = self.helpsheet.revbinds.get(longname, [None])[0]
121
125
  # cmddict has a SheetClass associated with each command
@@ -173,6 +177,22 @@ def getGuide(vd, name): # -> GuideSheet()
173
177
 
174
178
  BaseSheet.addCommand('', 'open-guide-index', 'vd.push(GuideIndex("VisiData_Guide"))', 'open VisiData guides table of contents')
175
179
 
180
+ @VisiData.api
181
+ def inputKeys(vd, prompt):
182
+ return vd.input(prompt, help=f'''
183
+ # Input Keystrokes
184
+ - Press `Ctrl+N` and then press another keystroke to spell out that keystroke.
185
+ - Press `Ctrl+C` to cancel the input.
186
+ - Press `Enter` to accept the input.
187
+ ''')
188
+
189
+ @BaseSheet.api
190
+ def getCommandInfo(sheet, keys):
191
+ cmd = sheet.getCommand(keys)
192
+ return CommandHelpGetter(type(sheet))[cmd.longname]
193
+
194
+ vd.addCommand('', 'show-command-info', 'status(getCommandInfo(inputKeys("get command for keystrokes: ")))', 'show longname and helpstring for keybinding')
195
+
176
196
  vd.addMenuItems('''
177
197
  Help > VisiData Feature Guides > open-guide-index
178
198
  ''')
visidata/keys.py CHANGED
@@ -48,6 +48,9 @@ visidata.vd.prettykeys_trdict = {
48
48
  'KEY_SNEXT': 'Shift+PgDn',
49
49
 
50
50
  'KEY_BACKSPACE': 'Bksp',
51
+ 'BUTTON1_RELEASED': 'LeftBtnUp',
52
+ 'BUTTON2_RELEASED': 'MiddleBtnUp',
53
+ 'BUTTON3_RELEASED': 'RightBtnUp',
51
54
  'BUTTON1_PRESSED': 'LeftClick',
52
55
  'BUTTON2_PRESSED': 'MiddleClick',
53
56
  'BUTTON3_PRESSED': 'RightClick',
@@ -1,12 +1,12 @@
1
1
  '''# RedditSheet
2
2
 
3
- - [:keys]Ctrl+O[/] to open a browser tab to [:code]{sheet.cursorRow.display_name_prefixed}[/]
4
- - [:keys]g Ctrl+O[/] to open browser windows for {sheet.nSelectedRows} selected subreddits
3
+ - [:keystrokes]Ctrl+O[/] to open a browser tab to [:code]{sheet.cursorRow.display_name_prefixed}[/]
4
+ - [:keystrokes]g Ctrl+O[/] to open browser windows for {sheet.nSelectedRows} selected subreddits
5
5
 
6
- - [:keys]Enter[/] to open sheet with top ~1000 submissions for [:code]{sheet.cursorRow.display_name_prefixed}[/]
7
- - [:keys]g Enter[/] to open sheet with top ~1000 submissions for {sheet.nSelectedRows} selected subreddits
6
+ - [:keystrokes]Enter[/] to open sheet with top ~1000 submissions for [:code]{sheet.cursorRow.display_name_prefixed}[/]
7
+ - [:keystrokes]g Enter[/] to open sheet with top ~1000 submissions for {sheet.nSelectedRows} selected subreddits
8
8
 
9
- - [:keys]ga[/] to append more subreddits matching input by name or description
9
+ - [:keystrokes]ga[/] to append more subreddits matching input by name or description
10
10
  '''
11
11
 
12
12
  import visidata
visidata/loaders/html.py CHANGED
@@ -77,7 +77,7 @@ class HtmlLinksSheet(Sheet):
77
77
  lxml = vd.importExternal('lxml')
78
78
  from lxml.html import iterlinks
79
79
  root = self.source.getroot()
80
- root.make_links_absolute(self.source.docinfo.URL)
80
+ root.make_links_absolute(self.source.docinfo.URL, handle_failures='ignore')
81
81
  yield from iterlinks(root)
82
82
 
83
83
  def openRow(self, row):
@@ -131,7 +131,11 @@ class HtmlTableSheet(Sheet):
131
131
  if isinstance(cell, lxml.etree.CommentBase):
132
132
  continue
133
133
  cellval = ' '.join(x.strip() for x in cell.itertext()) # text only without markup
134
- links = [urllib.parse.urljoin(self.source.base_url, x.get('href')) for x in cell.iter('a')]
134
+ links = [
135
+ vd.callNoExceptions(urllib.parse.urljoin, self.source.base_url, x.get('href')) or x.get('href')
136
+ for x in cell.iter('a')
137
+ ]
138
+
135
139
  maxlinks[colnum] = max(maxlinks.get(colnum, 0), len(links))
136
140
 
137
141
  if is_header(cell):
visidata/main.py CHANGED
@@ -2,7 +2,7 @@
2
2
  # Usage: $0 [<options>] [<input> ...]
3
3
  # $0 [<options>] --play <cmdlog> [--batch] [-w <waitsecs>] [-o <output>] [field=value ...]
4
4
 
5
- __version__ = '3.0'
5
+ __version__ = '3.0.1'
6
6
  __version_info__ = 'saul.pw/VisiData v' + __version__
7
7
 
8
8
  from copy import copy
visidata/man/vd.1 CHANGED
@@ -1,4 +1,4 @@
1
- .Dd December 29, 2023
1
+ .Dd January 7, 2024
2
2
  .Dt vd \&1 "Quick Reference Guide"
3
3
  .Os Linux/MacOS
4
4
  .
@@ -101,7 +101,7 @@ toggle sidebar
101
101
  .No redo the most recent undo ( requires enabled Sy options.undo Ns )
102
102
  .Pp
103
103
  .It Ic "Space" Ar longname
104
- .No open command palette; execute command by its Ar longname
104
+ .No open command palette; Sy Enter No to execute top command by its Ar longname
105
105
  .El
106
106
  .Ss " Command Palette"
107
107
  .Bl -tag -width XXXXXXXXXXXXXXX -compact -offset XXX
@@ -1056,7 +1056,7 @@ device ID associated with matrix login
1056
1056
  client_id for reddit api
1057
1057
  .It Sy --reddit-client-secret Ns = Ns Ar "str " No ""
1058
1058
  client_secret for reddit api
1059
- .It Sy --reddit-user-agent Ns = Ns Ar "str " No "3.0"
1059
+ .It Sy --reddit-user-agent Ns = Ns Ar "str " No "3.0.1"
1060
1060
  user_agent for reddit api
1061
1061
  .It Sy --zulip-batch-size Ns = Ns Ar "int " No "-100"
1062
1062
  number of messages to fetch per call (<0 to fetch before anchor)
@@ -1280,7 +1280,7 @@ color of code sample
1280
1280
  color of header
1281
1281
  .It Sy "color_guide_unwritten" No "243 on black"
1282
1282
  color of unwritten guides in GuideGuide
1283
- .It Sy "disp_rstatus_fmt " No "{sheet.threadStatus} {sheet.keystrokeStatus} {sheet.longname} {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}"
1283
+ .It Sy "disp_rstatus_fmt " No "{sheet.threadStatus} {sheet.keystrokeStatus} [:longname]{sheet.longname}[/] {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}"
1284
1284
  right-side status format string
1285
1285
  .It Sy "disp_status_fmt " No "[:onclick sheets-stack]{sheet.shortcut}\[u203A] {sheet.name}[/]| "
1286
1286
  status line prefix
@@ -1289,7 +1289,9 @@ maximum length of left status line
1289
1289
  .It Sy "disp_status_sep " No "\[u2502]"
1290
1290
  separator between statuses
1291
1291
  .It Sy "color_keystrokes " No "bold white on 237"
1292
- color of input keystrokes on status line
1292
+ color of input keystrokes
1293
+ .It Sy "color_longname " No "bold 52 on 114 green"
1294
+ color of command longnames
1293
1295
  .It Sy "color_keys " No "bold"
1294
1296
  color of keystrokes in help
1295
1297
  .It Sy "color_status " No "bold on 238"
@@ -1394,8 +1396,6 @@ max number of suggestions for command palette
1394
1396
 
1395
1397
  .It Sy "color_colname " No "underline"
1396
1398
 
1397
- .It Sy "color_longname " No "bold 52 on 114 green"
1398
-
1399
1399
  .It Sy "disp_scroll_context" No "0"
1400
1400
  minimum number of lines to keep visible above/below cursor when scrolling
1401
1401
  .It Sy "disp_sparkline " No "\[u2581]\[u2582]\[u2583]\[u2584]\[u2585]\[u2586]\[u2587]"
visidata/man/vd.txt CHANGED
@@ -53,7 +53,8 @@ DESCRIPTION
53
53
  R redo the most recent undo (requires enabled
54
54
  options.undo)
55
55
 
56
- Space longname open command palette; execute command by its longname
56
+ Space longname open command palette; Enter to execute top command by
57
+ its longname
57
58
 
58
59
  Command Palette
59
60
  Tab Move to command palette, and cycle through commands
@@ -743,7 +744,7 @@ COMMANDLINE OPTIONS
743
744
  --reddit-client-id=str client_id for reddit api
744
745
  --reddit-client-secret=str client_secret for reddit
745
746
  api
746
- --reddit-user-agent=str 3.0 user_agent for reddit api
747
+ --reddit-user-agent=str 3.0.1 user_agent for reddit api
747
748
  --zulip-batch-size=int -100 number of messages to
748
749
  fetch per call (<0 to
749
750
  fetch before anchor)
@@ -962,7 +963,7 @@ COMMANDLINE OPTIONS
962
963
  color_guide_unwritten 243 on black color of unwritten guides in
963
964
  GuideGuide
964
965
  disp_rstatus_fmt {sheet.threadStatus} {sheet.keystrokeStatus}
965
- {sheet.longname}
966
+ [:longname]{sheet.longname}[/]
966
967
  {sheet.nRows:9d} {sheet.rowtype}
967
968
  {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}
968
969
  right-side status format string
@@ -972,8 +973,9 @@ COMMANDLINE OPTIONS
972
973
  disp_lstatus_max 0 maximum length of left status
973
974
  line
974
975
  disp_status_sep │ separator between statuses
975
- color_keystrokes bold white on 237 color of input keystrokes on sta‐
976
- tus line
976
+ color_keystrokes bold white on 237 color of input keystrokes
977
+ color_longname bold 52 on 114 green
978
+ color of command longnames
977
979
  color_keys bold color of keystrokes in help
978
980
  color_status bold on 238 status line color
979
981
  color_error 202 1 error message color
@@ -1045,8 +1047,6 @@ COMMANDLINE OPTIONS
1045
1047
  command palette
1046
1048
  color_shellcmd 21 on 114 green
1047
1049
  color_colname underline
1048
- color_longname bold 52 on 114 green
1049
-
1050
1050
  disp_scroll_context 0 minimum number of lines to keep
1051
1051
  visible above/below cursor when
1052
1052
  scrolling
@@ -1157,4 +1157,4 @@ SUPPORTED SOURCES
1157
1157
  AUTHOR
1158
1158
  VisiData was made by Saul Pwanson <vd@saul.pw>.
1159
1159
 
1160
- Linux/MacOS December 29, 2023 Linux/MacOS
1160
+ Linux/MacOS January 7, 2024 Linux/MacOS
visidata/pyobj.py CHANGED
@@ -229,19 +229,20 @@ def openCellPyobj(sheet, col, rowidx):
229
229
 
230
230
 
231
231
  @BaseSheet.api
232
- def pyobj_expr(sheet):
232
+ def inputPythonExpr(sheet):
233
233
  def launch_repl(v, i):
234
234
  import code
235
235
  with SuspendCurses():
236
236
  code.InteractiveConsole(locals=locals()).interact()
237
237
  return v, i
238
- expr = vd.input("eval: ", "expr", completer=visidata.CompleteExpr(), bindings={'^X': launch_repl})
239
- vd.push(PyobjSheet(expr, source=sheet.evalExpr(expr)))
238
+ return vd.input("eval: ", "expr", completer=visidata.CompleteExpr(), bindings={'^X': launch_repl})
240
239
 
241
- BaseSheet.addCommand('^X', 'pyobj-expr', 'pyobj_expr()', 'evaluate Python expression and open result as Python object')
240
+ BaseSheet.addCommand('^X', 'pyobj-expr', 'expr=inputPythonExpr(); vd.push(PyobjSheet(expr, source=sheet.evalExpr(expr)))', 'evaluate Python expression and open result as Python object')
242
241
  BaseSheet.addCommand('', 'exec-python', 'expr = input("exec: ", "expr", completer=CompleteExpr()); exec(expr, getGlobals(), LazyChainMap(sheet, *vd.contexts, locals=vd.getGlobals()))', 'execute Python statement with expression scope')
243
242
  BaseSheet.addCommand('g^X', 'import-python', 'modname=input("import: ", type="import_python"); exec("import "+modname, getGlobals())', 'import Python module in the global scope')
244
243
  BaseSheet.addCommand('z^X', 'pyobj-expr-row', 'expr = input("eval over current row: ", "expr", completer=CompleteExpr()); vd.push(PyobjSheet(expr, source=evalExpr(expr, row=cursorRow)))', 'evaluate Python expression, in context of current row, and open result as Python object')
244
+ BaseSheet.addCommand('', 'assert-expr', 'expr=inputPythonExpr(); assert sheet.evalExpr(expr), f"{expr} not true"', 'eval Python expression and assert result is truthy')
245
+ BaseSheet.addCommand('', 'assert-expr-row', 'expr=inputPythonExpr(); assert sheet.evalExpr(expr, row=cursorRow), f"{expr} not true"', 'eval Python expression in context of current row, and assert result is truthy')
245
246
 
246
247
  Sheet.addCommand('^Y', 'pyobj-row', 'status(type(cursorRow).__name__); vd.push(openRowPyobj(cursorRowIndex))', 'open current row as Python object')
247
248
  Sheet.addCommand('z^Y', 'pyobj-cell', 'status(type(cursorValue).__name__); vd.push(openCellPyobj(cursorCol, cursorRowIndex))', 'open current cell as Python object')
visidata/sheets.py CHANGED
@@ -65,8 +65,15 @@ class LazyComputeRow:
65
65
  lcmobj._lcm = LazyChainMap(self.sheet, self.col, *vd.contexts)
66
66
  return lcmobj._lcm
67
67
 
68
+ def __iter__(self):
69
+ yield from self.sheet._ordered_colnames
70
+ yield from self._lcm.keys()
71
+ yield 'row'
72
+ yield 'sheet'
73
+ yield 'col'
74
+
68
75
  def keys(self):
69
- return self.sheet._ordered_colnames + self._lcm.keys() + ['row', 'sheet', 'col']
76
+ return list(self.__iter__())
70
77
 
71
78
  def __str__(self):
72
79
  return str(self.as_dict())
@@ -165,6 +172,8 @@ class TableSheet(BaseSheet):
165
172
  self._colorizers = self.classColorizers
166
173
  self.recalc() # set .sheet on columns and start caches
167
174
 
175
+ self._ordering = [] # list of (col:Column, reverse:bool)
176
+
168
177
  self.__dict__.update(kwargs) # also done earlier in BaseSheet.__init__
169
178
 
170
179
  @property
@@ -363,7 +372,7 @@ class TableSheet(BaseSheet):
363
372
  # contexts are cached by sheet/rowid for duration of drawcycle
364
373
  contexts = vd._evalcontexts.setdefault((self, self.rowid(row), col), LazyComputeRow(self, row, col=col))
365
374
  else:
366
- contexts = None
375
+ contexts = dict(sheet=self)
367
376
 
368
377
  return eval(expr, vd.getGlobals(), contexts)
369
378
 
@@ -864,7 +873,7 @@ class TableSheet(BaseSheet):
864
873
  for i, chunks in enumerate(lines):
865
874
  y = ybase+i
866
875
 
867
- if vcolidx == self.rightVisibleColIndex: # right edge of sheet
876
+ if vcolidx == self.nVisibleCols-1: # right edge of sheet
868
877
  if len(lines) == 1:
869
878
  sepchars = endsep
870
879
  else:
@@ -1105,8 +1114,6 @@ def async_deepcopy(sheet, rowlist):
1105
1114
 
1106
1115
  BaseSheet.init('pane', lambda: 1)
1107
1116
 
1108
- Sheet.init('_ordering', list, copy=False) # (col:Column, reverse:bool)
1109
-
1110
1117
 
1111
1118
  BaseSheet.addCommand('^R', 'reload-sheet', 'preloadHook(); reload()', 'Reload current sheet')
1112
1119
  Sheet.addCommand('^G', 'show-cursor', 'status(statusLine)', 'show cursor position and bounds of current sheet on status line')
visidata/statusbar.py CHANGED
@@ -11,12 +11,13 @@ import visidata
11
11
  from visidata import vd, VisiData, BaseSheet, Sheet, ColumnItem, Column, RowColorizer, options, colors, wrmap, clipdraw, ExpectedException, update_attr, dispwidth, ColorAttr
12
12
 
13
13
 
14
- vd.option('disp_rstatus_fmt', '{sheet.threadStatus} {sheet.keystrokeStatus} {sheet.longname} {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}', 'right-side status format string')
14
+ vd.option('disp_rstatus_fmt', '{sheet.threadStatus} {sheet.keystrokeStatus} [:longname]{sheet.longname}[/] {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}', 'right-side status format string')
15
15
  vd.option('disp_status_fmt', '[:onclick sheets-stack]{sheet.shortcut}› {sheet.name}[/]| ', 'status line prefix')
16
16
  vd.theme_option('disp_lstatus_max', 0, 'maximum length of left status line')
17
17
  vd.theme_option('disp_status_sep', '│', 'separator between statuses')
18
18
 
19
- vd.theme_option('color_keystrokes', 'bold white on 237', 'color of input keystrokes on status line')
19
+ vd.theme_option('color_keystrokes', 'bold white on 237', 'color of input keystrokes')
20
+ vd.theme_option('color_longname', '6', 'color of command longnames')
20
21
  vd.theme_option('color_keys', 'bold', 'color of keystrokes in help')
21
22
  vd.theme_option('color_status', 'bold on 238', 'status line color')
22
23
  vd.theme_option('color_error', '202 1', 'error message color')
@@ -0,0 +1,52 @@
1
+ Date,Customer,SKU,Item,Quantity,Unit,Paid
2
+ 7/3/2018 1:47p,Robert Armstrong,FOOD213,BFF Oh My Gravy! Beef & Salmon 2.8oz,4,$12.95,$51.8
3
+ 7/3/2018 3:32p,Kyle Kennedy,FOOD121,"Food, Adult Cat - 3.5 oz",1,$4.22,$4.22
4
+ 7/5/2018 4:15p,"Douglas ""Dougie"" Powers",FOOD121,"Food, Adult Cat 3.5 oz",1,$4.22,$4.22
5
+ 7/6/2018 12:15p,桜 高橋 (Sakura Takahashi),FOOD122,"Food, Senior Wet Cat - 3 oz",12,$1.29,157¥
6
+ 7/10/2018 10:28a,David Attenborough,NSCT201,"Food, Salamander",30,$.05,$1.5
7
+ 7/10/2018 5:23p,Susan Ashworth,CAT060,"Cat, Korat (Felis catus)",1,$720.42,$720.42
8
+ 7/10/2018 5:23p,Susan Ashworth,FOOD130,"Food, Kitten 3kg",1,$14.94,$14.94
9
+ 7/13/2018 10:26a,Wil Wheaton,NSCT523,"Monster, Rust (Monstrus gygaxus)",1,$39.95,$39.95
10
+ 7/13/2018 3:49p,Robert Armstrong,FOOD216,BFF Oh My Gravy! Chicken & Shrimp 2.8oz,4,$12.95,$51.8
11
+ 7/17/2018 9:01a,Robert Armstrong,FOOD217,BFF Oh My Gravy! Duck & Tuna 2.8oz,4,$12.95,$51.8
12
+ 7/17/2018 11:30a,Helen Halestorm,LAGO342,Rabbit (Oryctolagus cuniculus),2,$32.94,$65.88
13
+ 7/18/2018 12:16p,桜 高橋 (Sakura Takahashi),FOOD122,"Food, Senior Wet Cat - 3 oz",6,$1.29,157¥
14
+ 7/19/2018 10:28a,Rubeus Hagrid,FOOD170,"Food, Dog - 5kg",5,$44.95,$224.75
15
+ 7/20/2018 2:13p,Jon Arbuckle,FOOD167,"Food, Premium Wet Cat - 3.5 oz",50,$3.95,$197.5
16
+ 7/23/2018 1:41p,Robert Armstrong,FOOD215,BFF Oh My Gravy! Lamb & Tuna 2.8oz,4,$12.95,$51.8
17
+ 7/23/2018 4:23p,"Douglas ""Dougie"" Powers",TOY235,Laser Pointer,1,$16.12,$16.12
18
+ 7/24/2018 12:16p,桜 高橋 (Sakura Takahashi),FOOD122,"Food, Senior Wet Cat - 3 oz",3,$1.29,157¥
19
+ 7/26/2018 4:39p,"Douglas ""Dougie"" Powers",FOOD420,"Food, Shark - 10 kg",1,$15.70,$15.7
20
+ 7/27/2018 12:16p,桜 高橋 (Sakura Takahashi),FOOD122,"Food, Senior Wet Cat - 3 oz",3,$1.29,157¥
21
+ 7/30/2018 12:17p,桜 高橋 (Sakura Takahashi),RETURN,"Food, Senior Wet Cat - 3 oz",1,$1.29,157¥
22
+ 7/31/2018 5:42p,Rubeus Hagrid,CAT060,"Food, Dragon - 50kg",5,$720.42,$3602.1
23
+ 8/1/2018 2:44p,David Attenborough,FOOD360,"Food, Rhinocerous - 50kg",4,$5.72,$22.88
24
+ 8/2/2018 5:12p,Susan Ashworth,CAT110,"Cat, Maine Coon (Felix catus)",1,"$1,309.68",$1309.68
25
+ 8/2/2018 5:12p,Susan Ashworth,FOOD130,"Food, Kitten 3kg",3,$14.94,$44.82
26
+ 8/6/2018 10:21a,Robert Armstrong,FOOD212,BFF Oh My Gravy! Beef & Chicken 2.8oz,4,$12.95,$51.8
27
+ 8/7/2018 4:12p,Juan Johnson,REPT082,"Kingsnake, California (Lampropeltis getula)",1,$89.95,$89.95
28
+ 8/7/2018 4:12p,Juan Johnson,RDNT443,"Mouse, Pinky (Mus musculus)",1,$1.49,$1.49
29
+ 8/10/2018 4:31p,Robert Armstrong,FOOD211,BFF Oh My Gravy! Chicken & Turkey 2.8oz,4,$12.95,$51.8
30
+ 8/13/2018 2:07p,Monica Johnson,RDNT443,"Mouse, Pinky (Mus musculus)",1,$1.49,$1.49
31
+ 8/13/2018 2:08p,María Fernández,FOOD146,Forti Diet Prohealth Mouse/Rat 3lbs,2,$2.00,$4.0
32
+ 8/15/2018 11:57a,Mr. Praline,RETURN,"Parrot, Norwegian Blue (Mopsitta tanta)",1,$2300.00,-$2300.0
33
+ 8/15/2018 3:48p,Kyle Kennedy,FOOD121,"Food, Adult Cat - 3.5 oz",2,$4.22,$8.44
34
+ 8/16/2018 11:50a,Helen Halestorm,RETURN,Rabbit (Oryctolagus cuniculus),6,$0,$0.0
35
+ 8/16/2018 4:00p,Kyle Kennedy,DOG010,"Dog, Golden Retriever (Canis lupus familiaris)",1,"$2,495.99",$2495.99
36
+ 8/16/2018 5:15p,Michael Smith,BIRD160,"Parakeet, Blue (Melopsittacus undulatus)",1,29.95,$31.85
37
+ 8/17/2018 9:26a,Rubeus Hagrid,NSCT201,"Food, Spider",5,$.05,$0.25
38
+ 8/20/2018 9:36a,Kyle Kennedy,RETURN,"Dog, Golden Retriever (Canis lupus familiaris)",1,"$1,247.99",-$1247.99
39
+ 8/20/2018 1:47p,מרוסיה ניסנהולץ אבולעפיה,GOAT224,"Goat, American Pygmy (Capra hircus)",1,₪499,$160.51
40
+ 8/20/2018 3:31p,Monica Johnson,NSCT201,"Crickets, Adult Live (Gryllus assimilis)",30,$.05,$1.5
41
+ 8/20/2018 5:12p,David Attenborough,NSCT084,"Food, Pangolin",30,$.17,$5.10
42
+ 8/21/2018 12:13p,Robert Armstrong,FOOD214,BFF Oh My Gravy! Duck & Salmon 2.8oz,4,$12.95,$51.8
43
+ 8/22/2018 9:38a,David Attenborough,BIRD160,"Food, Quoll",1,29.95,$29.95
44
+ 8/22/2018 2:13p,Jon Arbuckle,FOOD170,"Food, Adult Dog - 5kg",1,$44.95,$44.95
45
+ 8/22/2018 5:49p,מרוסיה ניסנהולץ,SFTY052,"Fire Extinguisher, kitchen-rated",1,$61.70,$61.70
46
+ 8/24/2018 11:42a,Robert Armstrong,FOOD218,BFF Oh My Gravy! Chicken & Salmon 2.8oz,4,$12.95,$51.8
47
+ 8/27/2018 3:05p,Monica Johnson,NSCT443,"Mealworms, Large (Tenebrio molitor) 100ct",1,$1.99,$1.99
48
+ 8/28/2018 5:32p,Susan Ashworth,CAT020,"Cat, Scottish Fold (Felis catus)",1,"$1,964.53",$1964.53
49
+ 8/28/2018 5:32p,Susan Ashworth,FOOD130,"Food, Kitten 3kg",2,$14.94,$29.88
50
+ 8/29/2018 10:07a,Robert Armstrong,FOOD219,BFF Oh My Gravy! Chicken & Pumpkin 2.8oz,4,$12.95,$51.8
51
+ 8/31/2018 12:00a,Robert Armstrong,FOOD219,BFF Oh My Gravy! Chicken & Pumpkin 2.8oz,144,$12.95,$1864.8
52
+ 8/31/2018 5:57p,Juan Johnson,REPT217,"Lizard, Spinytail (Uromastyx ornatus)",1,$99.95,$99.95
@@ -60,6 +60,9 @@ inputLines = { 'save-sheet': 'jetsam.csv', # save to some tmp file
60
60
  'go-row-number': '5', # go to row 5
61
61
  'addcol-bulk': '1',
62
62
  'addcol-expr': 'Units', # just copy the column
63
+ 'assert-expr': 'sheet.column(\"Units\")',
64
+ 'show-command-info': 'select-row',
65
+ 'assert-expr-row': 'Units',
63
66
  'addcol-incr-step': '2',
64
67
  'setcol-incr-step': '2',
65
68
  'setcol-iter': 'range(1, 100)',
@@ -1,17 +1,28 @@
1
1
  import pytest
2
2
  import visidata
3
3
 
4
- @pytest.mark.usefixtures('curses_setup')
5
- class TestFeatures:
6
- def test_features(self, mock_screen):
7
- tests = [
8
- (mod, getattr(mod, k))
9
- for mod in visidata.vd.importedModules
10
- for k in dir(mod)
11
- if k.startswith('test_')
12
- ]
13
- for mod, testfunc in tests:
14
- print(mod, testfunc.__name__)
15
- visidata.vd.resetVisiData()
16
- visidata.vd.scr = mock_screen
17
- testfunc(visidata.vd)
4
+ def pytest_generate_tests(metafunc):
5
+ """Split feature tests into separate test cases
6
+
7
+ Look up test methods in imported modules. Turn each one into a single test_feature()
8
+ case, with "module::method" as the test id.
9
+ """
10
+ tests = [
11
+ (mod, getattr(mod, k))
12
+ for mod in visidata.vd.importedModules
13
+ for k in dir(mod)
14
+ if k.startswith("test_")
15
+ ]
16
+ argvalues = [[testfunc] for _, testfunc in tests]
17
+ testids = [
18
+ f"{mod.__name__}::{testfunc.__name__}"
19
+ for mod, testfunc in tests
20
+ ]
21
+ metafunc.parametrize(argnames=["testfunc"], argvalues=argvalues, ids=testids)
22
+
23
+
24
+ @pytest.mark.usefixtures("curses_setup")
25
+ def test_feature(mock_screen, testfunc):
26
+ visidata.vd.resetVisiData()
27
+ visidata.vd.scr = mock_screen
28
+ testfunc(visidata.vd)
visidata/threads.py CHANGED
@@ -86,7 +86,8 @@ def Progress(vd, iterable=None, gerund="", total=None, sheet=None):
86
86
  def cancelThread(vd, *threads, exception=EscapeException):
87
87
  'Raise *exception* in one or more *threads*.'
88
88
  for t in threads:
89
- ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(t.ident), ctypes.py_object(exception))
89
+ if t.ident is not None:
90
+ ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(t.ident), ctypes.py_object(exception))
90
91
 
91
92
 
92
93
  # each row is an augmented threading.Thread object
@@ -1,4 +1,4 @@
1
- .Dd December 29, 2023
1
+ .Dd January 7, 2024
2
2
  .Dt vd \&1 "Quick Reference Guide"
3
3
  .Os Linux/MacOS
4
4
  .
@@ -101,7 +101,7 @@ toggle sidebar
101
101
  .No redo the most recent undo ( requires enabled Sy options.undo Ns )
102
102
  .Pp
103
103
  .It Ic "Space" Ar longname
104
- .No open command palette; execute command by its Ar longname
104
+ .No open command palette; Sy Enter No to execute top command by its Ar longname
105
105
  .El
106
106
  .Ss " Command Palette"
107
107
  .Bl -tag -width XXXXXXXXXXXXXXX -compact -offset XXX
@@ -1056,7 +1056,7 @@ device ID associated with matrix login
1056
1056
  client_id for reddit api
1057
1057
  .It Sy --reddit-client-secret Ns = Ns Ar "str " No ""
1058
1058
  client_secret for reddit api
1059
- .It Sy --reddit-user-agent Ns = Ns Ar "str " No "3.0"
1059
+ .It Sy --reddit-user-agent Ns = Ns Ar "str " No "3.0.1"
1060
1060
  user_agent for reddit api
1061
1061
  .It Sy --zulip-batch-size Ns = Ns Ar "int " No "-100"
1062
1062
  number of messages to fetch per call (<0 to fetch before anchor)
@@ -1280,7 +1280,7 @@ color of code sample
1280
1280
  color of header
1281
1281
  .It Sy "color_guide_unwritten" No "243 on black"
1282
1282
  color of unwritten guides in GuideGuide
1283
- .It Sy "disp_rstatus_fmt " No "{sheet.threadStatus} {sheet.keystrokeStatus} {sheet.longname} {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}"
1283
+ .It Sy "disp_rstatus_fmt " No "{sheet.threadStatus} {sheet.keystrokeStatus} [:longname]{sheet.longname}[/] {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}"
1284
1284
  right-side status format string
1285
1285
  .It Sy "disp_status_fmt " No "[:onclick sheets-stack]{sheet.shortcut}\[u203A] {sheet.name}[/]| "
1286
1286
  status line prefix
@@ -1289,7 +1289,9 @@ maximum length of left status line
1289
1289
  .It Sy "disp_status_sep " No "\[u2502]"
1290
1290
  separator between statuses
1291
1291
  .It Sy "color_keystrokes " No "bold white on 237"
1292
- color of input keystrokes on status line
1292
+ color of input keystrokes
1293
+ .It Sy "color_longname " No "bold 52 on 114 green"
1294
+ color of command longnames
1293
1295
  .It Sy "color_keys " No "bold"
1294
1296
  color of keystrokes in help
1295
1297
  .It Sy "color_status " No "bold on 238"
@@ -1394,8 +1396,6 @@ max number of suggestions for command palette
1394
1396
 
1395
1397
  .It Sy "color_colname " No "underline"
1396
1398
 
1397
- .It Sy "color_longname " No "bold 52 on 114 green"
1398
-
1399
1399
  .It Sy "disp_scroll_context" No "0"
1400
1400
  minimum number of lines to keep visible above/below cursor when scrolling
1401
1401
  .It Sy "disp_sparkline " No "\[u2581]\[u2582]\[u2583]\[u2584]\[u2585]\[u2586]\[u2587]"
@@ -1,4 +1,4 @@
1
- .Dd December 29, 2023
1
+ .Dd January 7, 2024
2
2
  .Dt vd \&1 "Quick Reference Guide"
3
3
  .Os Linux/MacOS
4
4
  .
@@ -101,7 +101,7 @@ toggle sidebar
101
101
  .No redo the most recent undo ( requires enabled Sy options.undo Ns )
102
102
  .Pp
103
103
  .It Ic "Space" Ar longname
104
- .No open command palette; execute command by its Ar longname
104
+ .No open command palette; Sy Enter No to execute top command by its Ar longname
105
105
  .El
106
106
  .Ss " Command Palette"
107
107
  .Bl -tag -width XXXXXXXXXXXXXXX -compact -offset XXX
@@ -1056,7 +1056,7 @@ device ID associated with matrix login
1056
1056
  client_id for reddit api
1057
1057
  .It Sy --reddit-client-secret Ns = Ns Ar "str " No ""
1058
1058
  client_secret for reddit api
1059
- .It Sy --reddit-user-agent Ns = Ns Ar "str " No "3.0"
1059
+ .It Sy --reddit-user-agent Ns = Ns Ar "str " No "3.0.1"
1060
1060
  user_agent for reddit api
1061
1061
  .It Sy --zulip-batch-size Ns = Ns Ar "int " No "-100"
1062
1062
  number of messages to fetch per call (<0 to fetch before anchor)
@@ -1280,7 +1280,7 @@ color of code sample
1280
1280
  color of header
1281
1281
  .It Sy "color_guide_unwritten" No "243 on black"
1282
1282
  color of unwritten guides in GuideGuide
1283
- .It Sy "disp_rstatus_fmt " No "{sheet.threadStatus} {sheet.keystrokeStatus} {sheet.longname} {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}"
1283
+ .It Sy "disp_rstatus_fmt " No "{sheet.threadStatus} {sheet.keystrokeStatus} [:longname]{sheet.longname}[/] {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}"
1284
1284
  right-side status format string
1285
1285
  .It Sy "disp_status_fmt " No "[:onclick sheets-stack]{sheet.shortcut}\[u203A] {sheet.name}[/]| "
1286
1286
  status line prefix
@@ -1289,7 +1289,9 @@ maximum length of left status line
1289
1289
  .It Sy "disp_status_sep " No "\[u2502]"
1290
1290
  separator between statuses
1291
1291
  .It Sy "color_keystrokes " No "bold white on 237"
1292
- color of input keystrokes on status line
1292
+ color of input keystrokes
1293
+ .It Sy "color_longname " No "bold 52 on 114 green"
1294
+ color of command longnames
1293
1295
  .It Sy "color_keys " No "bold"
1294
1296
  color of keystrokes in help
1295
1297
  .It Sy "color_status " No "bold on 238"
@@ -1394,8 +1396,6 @@ max number of suggestions for command palette
1394
1396
 
1395
1397
  .It Sy "color_colname " No "underline"
1396
1398
 
1397
- .It Sy "color_longname " No "bold 52 on 114 green"
1398
-
1399
1399
  .It Sy "disp_scroll_context" No "0"
1400
1400
  minimum number of lines to keep visible above/below cursor when scrolling
1401
1401
  .It Sy "disp_sparkline " No "\[u2581]\[u2582]\[u2583]\[u2584]\[u2585]\[u2586]\[u2587]"
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: visidata
3
- Version: 3.0
3
+ Version: 3.0.1
4
4
  Summary: terminal interface for exploring and arranging tabular data
5
5
  Home-page: https://visidata.org
6
- Download-URL: https://github.com/saulpw/visidata/tarball/3.0
6
+ Download-URL: https://github.com/saulpw/visidata/tarball/3.0.1
7
7
  Author: Saul Pwanson
8
8
  Author-email: visidata@saul.pw
9
9
  License: GPLv3
@@ -30,7 +30,7 @@ Requires-Dist: importlib-metadata >=3.6
30
30
  Requires-Dist: windows-curses !=2.3.1 ; platform_system == "Windows"
31
31
  Requires-Dist: importlib-resources ; python_version < "3.9"
32
32
 
33
- # VisiData v3.0
33
+ # VisiData v3.0.1
34
34
 
35
35
  [![Tests](https://github.com/saulpw/visidata/workflows/visidata-ci-build/badge.svg)](https://github.com/saulpw/visidata/actions/workflows/main.yml)
36
36
  [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/saulpw/visidata)
@@ -1,11 +1,11 @@
1
- visidata/__init__.py,sha256=iAL5x6sINNkIf54THX-pfsGy9doNpzT2o_mUReFyRdY,3758
1
+ visidata/__init__.py,sha256=9JiVRPtEmg4-DTZcTvSCMdu3e0hOBlmsDBck7bralGc,3760
2
2
  visidata/__main__.py,sha256=0j8M0MpINzX0XXcVj1lSDpDfol1qexKU2xZ6qiRoE_U,35
3
3
  visidata/_input.py,sha256=JJuC68jrIrT6l8Ie1rgUQnBJBFzKQ_Ft-WZ7Vmd9R8Q,22091
4
4
  visidata/_open.py,sha256=mRm4BAi6p9sNf3-N4soDzCopzfVWJBfW6Wu5H4RFY4U,6521
5
5
  visidata/_types.py,sha256=C51-686HvTOvbOmDktTJvvtKvONKOZsWii-2UJgxN_Q,4660
6
6
  visidata/_urlcache.py,sha256=J0SRElN9uYgMsVKwJP7HUmqaT89mBg9JUJ5OvYgr11o,1393
7
- visidata/aggregators.py,sha256=YQ24iktvF_fee1JvKnm7nfH9mD3ekpUHAgfzY2ypvKY,8421
8
- visidata/basesheet.py,sha256=wN6PwMJagQVAZWdXYnXpujpuxjxUFqBa7myrLSqUlvA,10295
7
+ visidata/aggregators.py,sha256=I2dILOo0dzs_F2AERJ-AUhSKjbATvdFLH1Z9f_aAHTQ,8792
8
+ visidata/basesheet.py,sha256=nsMPr_y-68SzYqU9YIfyobv3KhJSYoetsT-S8vhOLQQ,10360
9
9
  visidata/bezier.py,sha256=_owa8IVyLJ-ok2BAwZf7m_knou6m9ALDH8mk7Ru2BGM,2060
10
10
  visidata/canvas.py,sha256=GvVuN_ll9mS0nA6038Fbj-pJ3O7NsjIivNJ4L8_l3ps,36608
11
11
  visidata/canvas_text.py,sha256=-IXLmnk3d2U3dijYtlpZLvUJnDmfF83AVkPkXO3hiAU,7882
@@ -15,27 +15,27 @@ visidata/clipboard.py,sha256=FP_8JclOSvlRVRPpjBjYL9AoRrm64-Q2z4hp3u_nuI8,9670
15
15
  visidata/cliptext.py,sha256=RZL5NNVXLkV54PjVxkwM2-k3Ud1ssObDqA99pCHx7XY,11380
16
16
  visidata/cmdlog.py,sha256=53zJJeAD6f0r7Aqe6tfa5JFa_eFBRwJ4n77k0Enl21Q,16430
17
17
  visidata/color.py,sha256=nR3QD4_RmOd74jgOvHuDXCH6KSJInrqBM8fF3QUbbVo,8393
18
- visidata/column.py,sha256=KEYIAvWtvoNHOUgaE6SnLBCLKIljNkkDJRK9dtq8pOg,22284
18
+ visidata/column.py,sha256=E2uT81_I2hpMTy-dB6_zaaaRo9cpTJZm2JnJT7q9yHE,22294
19
19
  visidata/ddwplay.py,sha256=gX4hvHB66nVOo6n-lfc4TytNLRrLnmM9PLOSEk3JmTU,5227
20
20
  visidata/deprecated.py,sha256=5eFrguxfYB3CsfshMQHMUVYN1S503Iw73U543EJSn8M,8795
21
21
  visidata/editor.py,sha256=3Q100m4zjqAXMFGw_a75xM_f-EEdVvwGJ2_jCXtPiAI,2953
22
- visidata/errors.py,sha256=Llwh9huzsgsabcHZNCPvANQZkfR5-nRScZQhlOX9kj8,1120
22
+ visidata/errors.py,sha256=04mNostkCLFxgGW7pjdCf40ZmDsZvY9vrj0WFzb7RLI,1111
23
23
  visidata/expr.py,sha256=8_Ylr4QadNz1LD7NiYMBaKph-B4IJxoR5vzk4aNZrlU,3085
24
- visidata/extensible.py,sha256=tWDVWnve5i7x4jF5wOo_ITw8aM2eSPtrTLKKWXjaStY,5613
24
+ visidata/extensible.py,sha256=z4KHpYp2DFcuZ3F9r1bSI5Whwb17aIZs5yJW6cCu3aA,5478
25
25
  visidata/form.py,sha256=wdRHoKw9ogLEBpy_hfRhELhbmJKK15taY78yfah57FY,4588
26
26
  visidata/freqtbl.py,sha256=LnXgOYb2hxRXdevXToRQcQsDZDuwqp-RyVaVvfx_BrM,6862
27
27
  visidata/fuzzymatch.py,sha256=nb6G_9mfkgo_hjp7pJ3QtcmnxJVUiFc9gslJFYIX82w,13511
28
28
  visidata/graph.py,sha256=r9XXyLSz6SJ4x4Og2BTqTKeHYBJxOVVD8PAdjDSHNs8,10816
29
- visidata/guide.py,sha256=aQ0pF8e9N8R3B7jimktw3uTcZImH04N-Q8K1WnyceCA,6437
29
+ visidata/guide.py,sha256=HXe4m6hWNssJWo3XbFKaKn45Zuv6yakX1Z6uZI9jc3E,7163
30
30
  visidata/help.py,sha256=ugPDJGe0-59X2hF76lzaxmEmMyz5wLxp5f7XWOItccQ,6493
31
31
  visidata/hint.py,sha256=WmX0Kjnd0fM0cX1EaC5xdxzYvRVz6h3Zcc_enOr8t-A,1071
32
32
  visidata/indexsheet.py,sha256=MoCKsTygG9xNKV9cWlxO_FKDoCxheDsOHb_eMBy_yxo,4227
33
33
  visidata/input_history.py,sha256=cdERtLKU8aLiDbxYKmFqEz0O40_hpoDOUE08kvAGgQ4,1468
34
34
  visidata/interface.py,sha256=azeeFIa_lRx2JpRAJEKPmDbNoL8QA0DKNH-t3aut6yw,4386
35
- visidata/keys.py,sha256=r5dFajqLjFdm2FHAVaEOsms-jAk3pyB_-qjQ9MjQ_Q0,2418
35
+ visidata/keys.py,sha256=pyFT5IbeWmW_7yP1kwYKF3i9Cd-TUcpPq9YG1XV1YbM,2544
36
36
  visidata/macos.py,sha256=bqH73E27j8qDRtXsHPcUyQNFTAzD5Ki5QU6LjSUnnOI,3339
37
37
  visidata/macros.py,sha256=5-HUcEIlDwDzuXNe0i6pOraab-_4QDA94EGHybcNi8E,5700
38
- visidata/main.py,sha256=AeXhPW5SKNhRlbSojHSYxVVjU08ct81m7JLhQbOThYU,13201
38
+ visidata/main.py,sha256=OjdAmSFYRJ3Pa3OAs1lZIRFqqxNBqGHyzALNbwSqL60,13203
39
39
  visidata/mainloop.py,sha256=tAzCvbdawvqvrZRDuI7iaTjWMwP7FlaFgo4Bg7XeiHw,9803
40
40
  visidata/memory.py,sha256=VRTP9R3Fig4p7h7uekX7dPI8XA576Wza0cbGEoswYKI,1098
41
41
  visidata/menu.py,sha256=wZJMcI4f8JwjES1d_kmBBLePDIdaUcBzO4ncEzJCV3c,16501
@@ -48,23 +48,23 @@ visidata/optionssheet.py,sha256=lj2D-p_EnwMvs6tWXtf-SmVYwKr0ZsYblGSWRl5tvx0,3967
48
48
  visidata/path.py,sha256=n6Loh3PJHcPxy3SwRxnsDTelX8QG2zfhHPsOsr5yFXc,16022
49
49
  visidata/pivot.py,sha256=G_lnrduulCEF_MPGzYMBWu_AQ3bAU3yyAMf0DXISXl0,12561
50
50
  visidata/plugins.py,sha256=hp7z7_mCi88bN_s30mZTTOXd48vclEsKiU6EfUDArY8,3496
51
- visidata/pyobj.py,sha256=aUs7eAIQsDj4guUmxuadLzxUC_jNHNDE1bH1zzc4ASM,11486
51
+ visidata/pyobj.py,sha256=f36KXcQDQNR8snD_4JH97ZjT-XkCmQWteKSg2MmwDms,11882
52
52
  visidata/rename_col.py,sha256=wUuhUkmwLxzyhS-OpDKExGTivQhmVdZ1XGBNy_FWVaE,1477
53
53
  visidata/save.py,sha256=ND36ycPXQn_smD2ckM0kjLmvvEc2lq0tZ990jBh9kUs,8256
54
54
  visidata/search.py,sha256=c5lWoTdunJAKiCFC_Oq8LutdQWKg__9n7djlhXCUQK0,6137
55
55
  visidata/selection.py,sha256=LvYjVMmoT5oL9sb_gXNZz8_u-yAGPVsiRO3VJa6ilYY,11948
56
56
  visidata/settings.py,sha256=Q-x6vjq_WKsh6xMumgNwStiqefkJIJ8zZ-Xj9w7Ep6k,20249
57
- visidata/sheets.py,sha256=OHdaLlwUDRx233RslgfVaGflCsLdV9gg1n7Ooy0J11Y,46549
57
+ visidata/sheets.py,sha256=PxzyEcBPV1XqtYq5Zdtw4xX47eTmwz7tDjTBJOQhg7A,46668
58
58
  visidata/shell.py,sha256=UAyLBArvKlK3lJo8RhY17W4i1noJOHHHMQlU658uxy4,10350
59
59
  visidata/sidebar.py,sha256=XY9qnrnrJxiqaDtWA3Q3yGtixxcz34aSxjJSFTkGnbI,5678
60
60
  visidata/sort.py,sha256=ZBE8h9xn6gq-ODMcwLbc4xmi5UZGUjFLP4_7sGWHsvo,3489
61
- visidata/statusbar.py,sha256=kC1aKTR86AkLkv6Y-BGq2-ke2e52afZkuPFvQ4YVniI,7893
61
+ visidata/statusbar.py,sha256=GCfPb0heP4pU7WTfLqm1zsQeIgHMyzFH_ywp6ST-dbE,7961
62
62
  visidata/stored_list.py,sha256=3yy1uUjp5NQHcRgnhIbQGmjFWJW294UMQ4iALDgF84I,1183
63
63
  visidata/stored_prop.py,sha256=TNBq1bZuRr5lzxLU9khs-WwZdQdnIKVbmzwHcD6hy9k,1130
64
64
  visidata/text_source.py,sha256=Wdd6n6pKMLeM4UsAb-BsO4zlY6haw3I7UpbRyRgVezY,1503
65
65
  visidata/textsheet.py,sha256=qJq_YBWzKVwyhmtBSabwz91uw5cM_6xN8YMrVM_ZcYo,3518
66
66
  visidata/theme.py,sha256=v9XoPeRQ-NhAKTux2zSxOiWWDL-FGfez7BPVqKitFGY,1152
67
- visidata/threads.py,sha256=oas59W-6exCDRzQkK1FDJWaJeM9MJ1SnKopxL7awFqw,16341
67
+ visidata/threads.py,sha256=YgL_EZSXWw0Xah8qUsdDwv_r4xuGZCv3cV54WUG8jOk,16377
68
68
  visidata/tuiwin.py,sha256=5CjXglD2JI9He1PiAxVdOi-hFRe9IokEGDuGaoBZQJ4,616
69
69
  visidata/type_currency.py,sha256=Hys7wPwk5dmkHyyGmcJNOg2-JW_AzpLBIIgxH1hwhxk,1035
70
70
  visidata/type_date.py,sha256=iVz6UDysmEkt5WQ4FumwKqi_wXylj3N6Me4QnOl41Xo,4737
@@ -121,7 +121,7 @@ visidata/features/addcol_audiometadata.py,sha256=a8801aTjUKv0VvwfW8TkMkTaXW7f3bn
121
121
  visidata/features/addcol_histogram.py,sha256=vPXpsQXTHRclGYgrSSOsIQTgcpQGNpL1lYMRfO-CoE0,1058
122
122
  visidata/features/canvas_save_svg.py,sha256=azsh4xbewRhqPBRAncyh5amNut2htRg4hGefUC9EPhk,2130
123
123
  visidata/features/change_precision.py,sha256=fxAnWGETuCA-qqLh68p--Y4pe25Dnj_marqefIxMteg,1369
124
- visidata/features/cmdpalette.py,sha256=G5J_gj6P-i4C6D37XeLxkwavU6odH4p6Gkw0NaUputQ,5533
124
+ visidata/features/cmdpalette.py,sha256=fP5Nl3zEtDuJ2umgdg4tEoqB-RJm-wVf8ExIrmYD6ss,6638
125
125
  visidata/features/colorbrewer.py,sha256=FpprltrQwLvpR1BQnbcWUhPwowQmhHaygrUHGziJXZw,10536
126
126
  visidata/features/colorsheet.py,sha256=1bojnBeGDxF_LIZ9b3y92ijI8dV8OkNGspSUPCEBTF8,1497
127
127
  visidata/features/command_server.py,sha256=Y_jkEqzlYUxsp_ZV6cnPQ_UGNr6xeWH06f5nIw7-ut8,3131
@@ -154,7 +154,7 @@ visidata/features/repeat.py,sha256=qJIPccmoRIzBxYVW6ye2At2nlUCDFy-p5CqVVFJMiAM,1
154
154
  visidata/features/scroll_context.py,sha256=XBohcurnkdNK3MPLaWPKXHJ2pfUVrooX6T4PL7DyOQw,2221
155
155
  visidata/features/select_equal_selected.py,sha256=Uz3oTT3y1_B31r8fRDx-XMXOfV5NbVZp2jLb310xjrQ,471
156
156
  visidata/features/setcol_fake.py,sha256=CWJlDTe9Bmgq1lnfCUxfhePnrY5t1vzqbi1SiaD-VwM,2625
157
- visidata/features/slide.py,sha256=17TWwJidz6G2MR13exY-n9WlnBPBOD1OqYh_AiLZW9c,7063
157
+ visidata/features/slide.py,sha256=ErO9RHy7mv0L18hP8AdHRYMJIHl_ftKbsGGQHEgdfzU,7181
158
158
  visidata/features/sparkline.py,sha256=o7hgT-VQHZmrU40yhHazeAQ5zABoE93js2trV7Sr84c,1286
159
159
  visidata/features/status_source.py,sha256=AmreK9h8YrOXwi5QU33S1OA8cIzUlirkEbStPg7PCk0,567
160
160
  visidata/features/sysedit.py,sha256=MzdJCJz94qkavLNtaCfXsjmOcV4KkXZNcOeFXaeO83Q,1433
@@ -170,7 +170,7 @@ visidata/loaders/_pandas.py,sha256=bY4bOZhDDsSsb6hddlSRYC4KCNQ1-zhf09Ks3fTk4cY,1
170
170
  visidata/loaders/api_airtable.py,sha256=5ae0aayYsHxSP6WnqLwZ81A03Nk-77Rqi2GMasSpZ6o,2218
171
171
  visidata/loaders/api_bitio.py,sha256=oWP5ougl6ijAqXNE0ZBtR3ortcNdvcLVSXq2lVgpMT8,3274
172
172
  visidata/loaders/api_matrix.py,sha256=eGIT6fuk1MDdf56Or3df9TNrVvXAcH1YkpBnkAH3UPw,5205
173
- visidata/loaders/api_reddit.py,sha256=P0NfADjnd1BDeKplbeKvGYRPGlVzrUfH1jaEIfADJhY,12539
173
+ visidata/loaders/api_reddit.py,sha256=B76dKwowV1huDRZ8HZJKkq_n-9fESMSGHMJ-abM0nLw,12569
174
174
  visidata/loaders/api_zulip.py,sha256=VQhc3D44DAZag4JS12n5IQMIoHaxLdFQ1jvuUthD8UY,9411
175
175
  visidata/loaders/archive.py,sha256=fDaMhgLXlvP4wUg_4bZ6xcGTZFckRoasRNOd0D0YFL0,5949
176
176
  visidata/loaders/arrow.py,sha256=Ha4aKsMt-vLMQH9spWZSG-NCIGN1hEql6FHhnHL66k0,4062
@@ -185,7 +185,7 @@ visidata/loaders/geojson.py,sha256=HMRtdL-wiv7pufrbLs61Mxq3xrDLwXrbP6z7vmwxV94,5
185
185
  visidata/loaders/google.py,sha256=UVZDAs6lZIhTupBz7BEtMuQ0JUmZlfyfXSHQt6viKFY,1648
186
186
  visidata/loaders/graphviz.py,sha256=_GBVswzYeClbgy_GBz6PXebX1BLwRRCqRoJEOTSVYsw,2195
187
187
  visidata/loaders/hdf5.py,sha256=edYXVDtQtSOEb19ppk74SRudlxPf-CRUtzeFp3jxxOc,2497
188
- visidata/loaders/html.py,sha256=8L5aY_30xHHjOqPMKItu-anB9OEe5Jb1-LZd4o4tjVk,7850
188
+ visidata/loaders/html.py,sha256=dPiWBq92zHiO9VcEdCX17A1H9XCfXcG7wInQU498XhQ,7977
189
189
  visidata/loaders/http.py,sha256=QiM72Zz6mGfRsP3-66A6h7xA4WtiRMxI8AP2phr572Y,4345
190
190
  visidata/loaders/imap.py,sha256=7HimvfCfL-d04ZF9ulvUgC4R2yWSXWMozhrLZS9Vb6A,2517
191
191
  visidata/loaders/jrnl.py,sha256=8Y4YrS6R0JPMxsM4MXIadu8IVOcueo9GJS0maeXvhos,1462
@@ -227,16 +227,17 @@ visidata/loaders/xml.py,sha256=3tt8RKgfmWbqz8GW_hg7aJmJNMJ6M1B45b01ODvBazI,3207
227
227
  visidata/loaders/xword.py,sha256=FCoye38YPUmAG7nKA5uDQSxFbUXgqQkEaiflih6A-1U,3521
228
228
  visidata/loaders/yaml.py,sha256=BEbL7b7xF82WnWbtKyMN3mIFf5R3m27aWxFMafkizqQ,1756
229
229
  visidata/man/parse_options.py,sha256=QP6TDVb4ZxPLOfQvJIcq8eKrlUTdDb4WLE6-veuMZgg,3213
230
- visidata/man/vd.1,sha256=zbBMHES_47quWyWTkfhu3CtfeBe7iTRDhuSxbzynxGs,57516
231
- visidata/man/vd.txt,sha256=KTcc58l9IXxm37JWBGMSCd91jzYYn9ii9YRjCKoON2k,66398
230
+ visidata/man/vd.1,sha256=Wc6nSidRWM-7U1kLRgIPVnsQaJfY9J14TvkRsZly_9o,57560
231
+ visidata/man/vd.txt,sha256=sICbLRFfnTnQggaBt04WgE5NQR4CSKoAQY4terGz3c8,66454
232
232
  visidata/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
233
+ visidata/tests/benchmark.csv,sha256=ZX_-M4QitNvBSir-JbsUhX_rqGASZAfH7o3X7v9kejs,4668
233
234
  visidata/tests/conftest.py,sha256=JrIAbZQ6x5IdlImPKS2zaZ79AAC3hBp2q9RzcfYh53I,528
234
235
  visidata/tests/sample.tsv,sha256=PpOOwpDffq6UzYUH0HlVoXwUvXA9q4ADRs64KPf6M4w,2046
235
236
  visidata/tests/test_cliptext.py,sha256=w8aroRn2yPm0IjKr_L2eDmc709Q7mNSx0ZLO1omOqqQ,1173
236
- visidata/tests/test_commands.py,sha256=V7RVv-QPBOJRXmRJKLe6s5eq_KLjA651lEmeMKux88s,6467
237
+ visidata/tests/test_commands.py,sha256=I39vWDWONZtDFB9WtDdLNHOs7Cj44a0NDFIwxbrWkc4,6623
237
238
  visidata/tests/test_date.py,sha256=_goZr5nUoqWB5IZRBp7G9hnfoJtDDIkkajArjHmNazs,253
238
239
  visidata/tests/test_edittext.py,sha256=spyDhEKzI3qOQN3EUwOQBOVF1N5_TywdLfyPE3JWSnk,1932
239
- visidata/tests/test_features.py,sha256=_rJOWBxEzipy8FbdCuhcGx3vLInerSDN8wT0CHmkuZo,533
240
+ visidata/tests/test_features.py,sha256=M4vcoD5o7DkUV33SLqmJj1C7RfKx4Xz75Y9G0QZlGFU,839
240
241
  visidata/tests/test_menu.py,sha256=CQms1LTkPKvLpkrSnLG5GlDbGOsq1cu3UQ29bKNOs94,378
241
242
  visidata/tests/test_path.py,sha256=1OLSPTSkWvNdc2GKZysqOhnzDdtrIpvfrOucAsQGCxQ,1467
242
243
  visidata/themes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -244,14 +245,14 @@ visidata/themes/ascii8.py,sha256=c0sgoYKr5fo-pVF0rf4XC4R0dN6UwIEWPcZEFikfEuQ,236
244
245
  visidata/themes/asciimono.py,sha256=ylvfYgQixg1erKQVHX36wjYqLLbJ_XB4L8DTFZsa5y0,2219
245
246
  visidata/themes/light.py,sha256=ciE-CPLalaMjKv-0alIPe4rPU_j-lBxpH9g7W-xNGqk,761
246
247
  visidata/vendor/appdirs.py,sha256=bv3lwBYfZNtNPOva2Kg1hB-p2oyp8XXQnOtAGe662ps,24527
247
- visidata-3.0.data/data/share/applications/visidata.desktop,sha256=ZYnMeeSig9Y17lt2Oo4noQPiuweSDhLkXl_EX5EvGSg,133
248
- visidata-3.0.data/data/share/man/man1/vd.1,sha256=zbBMHES_47quWyWTkfhu3CtfeBe7iTRDhuSxbzynxGs,57516
249
- visidata-3.0.data/data/share/man/man1/visidata.1,sha256=zbBMHES_47quWyWTkfhu3CtfeBe7iTRDhuSxbzynxGs,57516
250
- visidata-3.0.data/scripts/vd,sha256=1K_G6-qHOHs5JK6-wfraGXNnAyujDaDJGlw04WXPkQE,86
251
- visidata-3.0.data/scripts/vd2to3.vdx,sha256=NdyyINfa8vvg2LgKfIohMMGcJOCjpx7hqZWv0bUF3EU,183
252
- visidata-3.0.dist-info/LICENSE.gpl3,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
253
- visidata-3.0.dist-info/METADATA,sha256=I5R55OuXZtuueIRvbVb35lflqxt7FIrFjrJZfbO4lWI,4391
254
- visidata-3.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
255
- visidata-3.0.dist-info/entry_points.txt,sha256=kji--8O48AhK0K4Z74s9b6Ve32kBD-0StD8imzzs12s,50
256
- visidata-3.0.dist-info/top_level.txt,sha256=v2FzJlcgz-eSZeFIviYkZacHZJ8K3fjGbmj2B8QqyNc,9
257
- visidata-3.0.dist-info/RECORD,,
248
+ visidata-3.0.1.data/data/share/applications/visidata.desktop,sha256=ZYnMeeSig9Y17lt2Oo4noQPiuweSDhLkXl_EX5EvGSg,133
249
+ visidata-3.0.1.data/data/share/man/man1/vd.1,sha256=Wc6nSidRWM-7U1kLRgIPVnsQaJfY9J14TvkRsZly_9o,57560
250
+ visidata-3.0.1.data/data/share/man/man1/visidata.1,sha256=Wc6nSidRWM-7U1kLRgIPVnsQaJfY9J14TvkRsZly_9o,57560
251
+ visidata-3.0.1.data/scripts/vd,sha256=1K_G6-qHOHs5JK6-wfraGXNnAyujDaDJGlw04WXPkQE,86
252
+ visidata-3.0.1.data/scripts/vd2to3.vdx,sha256=NdyyINfa8vvg2LgKfIohMMGcJOCjpx7hqZWv0bUF3EU,183
253
+ visidata-3.0.1.dist-info/LICENSE.gpl3,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
254
+ visidata-3.0.1.dist-info/METADATA,sha256=UsCKCHbwwRYnqsW52K_jxhzss8K8KPO1q2Bwr3j60Q8,4397
255
+ visidata-3.0.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
256
+ visidata-3.0.1.dist-info/entry_points.txt,sha256=kji--8O48AhK0K4Z74s9b6Ve32kBD-0StD8imzzs12s,50
257
+ visidata-3.0.1.dist-info/top_level.txt,sha256=v2FzJlcgz-eSZeFIviYkZacHZJ8K3fjGbmj2B8QqyNc,9
258
+ visidata-3.0.1.dist-info/RECORD,,
File without changes