visidata 2.11.1__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.
Files changed (256) hide show
  1. visidata/__init__.py +72 -91
  2. visidata/_input.py +259 -42
  3. visidata/_open.py +84 -29
  4. visidata/_types.py +21 -3
  5. visidata/_urlcache.py +17 -4
  6. visidata/aggregators.py +78 -25
  7. visidata/apps/__init__.py +0 -0
  8. visidata/apps/vdsql/__about__.py +8 -0
  9. visidata/apps/vdsql/__init__.py +5 -0
  10. visidata/apps/vdsql/__main__.py +27 -0
  11. visidata/apps/vdsql/_ibis.py +748 -0
  12. visidata/apps/vdsql/bigquery.py +61 -0
  13. visidata/apps/vdsql/clickhouse.py +53 -0
  14. visidata/apps/vdsql/setup.py +40 -0
  15. visidata/apps/vdsql/snowflake.py +67 -0
  16. visidata/apps/vgit/__init__.py +13 -0
  17. {vgit → visidata/apps/vgit}/blame.py +5 -2
  18. {vgit → visidata/apps/vgit}/branch.py +31 -16
  19. {vgit → visidata/apps/vgit}/config.py +3 -3
  20. visidata/apps/vgit/diff.py +169 -0
  21. visidata/apps/vgit/gitsheet.py +161 -0
  22. {vgit → visidata/apps/vgit}/grep.py +6 -5
  23. visidata/apps/vgit/log.py +81 -0
  24. {vgit → visidata/apps/vgit}/main.py +18 -5
  25. {vgit → visidata/apps/vgit}/remote.py +8 -4
  26. visidata/apps/vgit/repos.py +71 -0
  27. {vgit → visidata/apps/vgit}/setup.py +6 -4
  28. visidata/apps/vgit/stash.py +69 -0
  29. visidata/apps/vgit/status.py +204 -0
  30. {vgit → visidata/apps/vgit}/statusbar.py +2 -0
  31. visidata/basesheet.py +63 -51
  32. visidata/canvas.py +208 -93
  33. visidata/choose.py +6 -6
  34. visidata/clean_names.py +29 -0
  35. visidata/clipboard.py +73 -17
  36. visidata/cliptext.py +220 -46
  37. visidata/cmdlog.py +88 -114
  38. visidata/color.py +142 -56
  39. visidata/column.py +121 -129
  40. visidata/ddw/input.ddw +74 -79
  41. visidata/ddw/regex.ddw +57 -0
  42. visidata/ddwplay.py +33 -14
  43. visidata/deprecated.py +77 -3
  44. visidata/desktop/visidata.desktop +7 -0
  45. visidata/editor.py +12 -6
  46. visidata/errors.py +6 -2
  47. visidata/experimental/__init__.py +0 -0
  48. visidata/experimental/diff_sheet.py +29 -0
  49. visidata/experimental/digit_autoedit.py +6 -0
  50. visidata/experimental/gdrive.py +89 -0
  51. visidata/experimental/google.py +37 -0
  52. visidata/experimental/gsheets.py +79 -0
  53. visidata/experimental/live_search.py +37 -0
  54. visidata/experimental/liveupdate.py +45 -0
  55. visidata/experimental/mark.py +133 -0
  56. visidata/experimental/noahs_tapestry/__init__.py +1 -0
  57. visidata/experimental/noahs_tapestry/tapestry.py +147 -0
  58. visidata/experimental/rownum.py +73 -0
  59. visidata/experimental/slide_cells.py +26 -0
  60. visidata/expr.py +8 -4
  61. visidata/extensible.py +22 -4
  62. visidata/features/__init__.py +0 -0
  63. visidata/features/addcol_audiometadata.py +42 -0
  64. visidata/features/addcol_histogram.py +34 -0
  65. visidata/features/canvas_save_svg.py +69 -0
  66. visidata/features/change_precision.py +46 -0
  67. visidata/features/cmdpalette.py +197 -0
  68. visidata/features/colorbrewer.py +363 -0
  69. visidata/{colorsheet.py → features/colorsheet.py} +17 -16
  70. visidata/features/command_server.py +105 -0
  71. visidata/features/currency_to_usd.py +70 -0
  72. visidata/{customdate.py → features/customdate.py} +2 -0
  73. visidata/features/dedupe.py +132 -0
  74. visidata/{describe.py → features/describe.py} +17 -15
  75. visidata/features/errors_guide.py +26 -0
  76. visidata/features/expand_cols.py +202 -0
  77. visidata/{fill.py → features/fill.py} +3 -1
  78. visidata/{freeze.py → features/freeze.py} +11 -6
  79. visidata/features/graph_seaborn.py +79 -0
  80. visidata/features/helloworld.py +10 -0
  81. visidata/features/hint_types.py +17 -0
  82. visidata/{incr.py → features/incr.py} +5 -0
  83. visidata/{join.py → features/join.py} +107 -53
  84. visidata/features/known_cols.py +21 -0
  85. visidata/features/layout.py +62 -0
  86. visidata/{melt.py → features/melt.py} +32 -21
  87. visidata/features/normcol.py +118 -0
  88. visidata/features/open_config.py +7 -0
  89. visidata/features/open_syspaste.py +18 -0
  90. visidata/features/ping.py +157 -0
  91. visidata/features/procmgr.py +208 -0
  92. visidata/features/random_sample.py +6 -0
  93. visidata/{regex.py → features/regex.py} +47 -31
  94. visidata/features/reload_every.py +55 -0
  95. visidata/features/rename_col_cascade.py +30 -0
  96. visidata/features/scroll_context.py +60 -0
  97. visidata/features/select_equal_selected.py +11 -0
  98. visidata/features/setcol_fake.py +65 -0
  99. visidata/{slide.py → features/slide.py} +77 -21
  100. visidata/features/sparkline.py +48 -0
  101. visidata/features/status_source.py +20 -0
  102. visidata/{sysedit.py → features/sysedit.py} +2 -1
  103. visidata/features/sysopen_mailcap.py +46 -0
  104. visidata/features/term_extras.py +13 -0
  105. visidata/{transpose.py → features/transpose.py} +5 -4
  106. visidata/features/type_ipaddr.py +73 -0
  107. visidata/features/type_url.py +11 -0
  108. visidata/{unfurl.py → features/unfurl.py} +9 -9
  109. visidata/{window.py → features/window.py} +2 -2
  110. visidata/form.py +50 -21
  111. visidata/freqtbl.py +81 -33
  112. visidata/fuzzymatch.py +414 -0
  113. visidata/graph.py +105 -33
  114. visidata/guide.py +200 -0
  115. visidata/help.py +75 -44
  116. visidata/hint.py +39 -0
  117. visidata/indexsheet.py +109 -0
  118. visidata/input_history.py +55 -0
  119. visidata/interface.py +58 -0
  120. visidata/keys.py +20 -16
  121. visidata/loaders/__init__.py +9 -0
  122. visidata/loaders/_pandas.py +61 -21
  123. visidata/loaders/api_airtable.py +70 -0
  124. visidata/loaders/api_bitio.py +102 -0
  125. visidata/loaders/api_matrix.py +148 -0
  126. visidata/loaders/api_reddit.py +306 -0
  127. visidata/loaders/api_zulip.py +249 -0
  128. visidata/loaders/archive.py +41 -7
  129. visidata/loaders/arrow.py +7 -7
  130. visidata/loaders/conll.py +49 -0
  131. visidata/loaders/csv.py +25 -7
  132. visidata/loaders/eml.py +3 -4
  133. visidata/loaders/f5log.py +1204 -0
  134. visidata/loaders/fec.py +325 -0
  135. visidata/loaders/fixed_width.py +2 -4
  136. visidata/loaders/frictionless.py +3 -3
  137. visidata/loaders/geojson.py +8 -5
  138. visidata/loaders/google.py +48 -0
  139. visidata/loaders/graphviz.py +4 -4
  140. visidata/loaders/hdf5.py +4 -4
  141. visidata/loaders/html.py +54 -12
  142. visidata/loaders/http.py +84 -30
  143. visidata/loaders/imap.py +20 -10
  144. visidata/loaders/jrnl.py +52 -0
  145. visidata/loaders/json.py +83 -29
  146. visidata/loaders/jsonla.py +74 -0
  147. visidata/loaders/lsv.py +15 -11
  148. visidata/loaders/mailbox.py +40 -0
  149. visidata/loaders/markdown.py +1 -3
  150. visidata/loaders/mbtiles.py +4 -5
  151. visidata/loaders/mysql.py +11 -13
  152. visidata/loaders/npy.py +7 -7
  153. visidata/loaders/odf.py +4 -1
  154. visidata/loaders/orgmode.py +428 -0
  155. visidata/loaders/pandas_freqtbl.py +14 -20
  156. visidata/loaders/parquet.py +62 -6
  157. visidata/loaders/pcap.py +3 -3
  158. visidata/loaders/pdf.py +4 -3
  159. visidata/loaders/png.py +19 -13
  160. visidata/loaders/postgres.py +9 -8
  161. visidata/loaders/rec.py +7 -3
  162. visidata/loaders/s3.py +342 -0
  163. visidata/loaders/sas.py +5 -5
  164. visidata/loaders/scrape.py +186 -0
  165. visidata/loaders/shp.py +6 -5
  166. visidata/loaders/spss.py +5 -6
  167. visidata/loaders/sqlite.py +68 -28
  168. visidata/loaders/texttables.py +1 -1
  169. visidata/loaders/toml.py +60 -0
  170. visidata/loaders/tsv.py +61 -19
  171. visidata/loaders/ttf.py +19 -7
  172. visidata/loaders/unzip_http.py +6 -5
  173. visidata/loaders/usv.py +1 -1
  174. visidata/loaders/vcf.py +16 -16
  175. visidata/loaders/vds.py +10 -7
  176. visidata/loaders/vdx.py +30 -5
  177. visidata/loaders/xlsb.py +8 -1
  178. visidata/loaders/xlsx.py +145 -25
  179. visidata/loaders/xml.py +6 -3
  180. visidata/loaders/xword.py +4 -4
  181. visidata/loaders/yaml.py +15 -5
  182. visidata/macros.py +129 -42
  183. visidata/main.py +119 -94
  184. visidata/mainloop.py +101 -155
  185. visidata/man/parse_options.py +2 -2
  186. visidata/man/vd.1 +302 -149
  187. visidata/man/vd.txt +291 -154
  188. visidata/memory.py +3 -3
  189. visidata/menu.py +104 -423
  190. visidata/metasheets.py +59 -141
  191. visidata/modify.py +78 -23
  192. visidata/motd.py +3 -3
  193. visidata/mouse.py +137 -0
  194. visidata/movement.py +43 -35
  195. visidata/optionssheet.py +99 -0
  196. visidata/path.py +113 -32
  197. visidata/pivot.py +73 -47
  198. visidata/plugins.py +65 -192
  199. visidata/pyobj.py +55 -205
  200. visidata/rename_col.py +20 -0
  201. visidata/save.py +37 -20
  202. visidata/search.py +54 -10
  203. visidata/selection.py +84 -5
  204. visidata/settings.py +162 -25
  205. visidata/sheets.py +239 -260
  206. visidata/shell.py +51 -21
  207. visidata/sidebar.py +162 -0
  208. visidata/sort.py +11 -4
  209. visidata/statusbar.py +114 -104
  210. visidata/stored_list.py +43 -0
  211. visidata/stored_prop.py +38 -0
  212. visidata/tests/benchmark.csv +52 -0
  213. visidata/tests/conftest.py +3 -3
  214. visidata/tests/test_cliptext.py +39 -0
  215. visidata/tests/test_commands.py +65 -7
  216. visidata/tests/test_edittext.py +2 -2
  217. visidata/tests/test_features.py +28 -0
  218. visidata/tests/test_menu.py +14 -0
  219. visidata/tests/test_path.py +13 -4
  220. visidata/text_source.py +53 -0
  221. visidata/textsheet.py +10 -3
  222. visidata/theme.py +44 -0
  223. visidata/themes/__init__.py +0 -0
  224. visidata/themes/ascii8.py +84 -0
  225. visidata/themes/asciimono.py +84 -0
  226. visidata/themes/light.py +17 -0
  227. visidata/threads.py +89 -40
  228. visidata/tuiwin.py +22 -0
  229. visidata/type_currency.py +22 -3
  230. visidata/type_date.py +31 -9
  231. visidata/type_floatsi.py +5 -1
  232. visidata/undo.py +17 -5
  233. visidata/utils.py +106 -23
  234. visidata/vdobj.py +28 -17
  235. visidata/windows.py +10 -0
  236. visidata/wrappers.py +9 -3
  237. visidata-3.0.1.data/data/share/applications/visidata.desktop +7 -0
  238. {visidata-2.11.1.data → visidata-3.0.1.data}/data/share/man/man1/vd.1 +302 -149
  239. {visidata-2.11.1.data → visidata-3.0.1.data}/data/share/man/man1/visidata.1 +302 -149
  240. visidata-3.0.1.data/scripts/vd2to3.vdx +9 -0
  241. {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/METADATA +12 -8
  242. visidata-3.0.1.dist-info/RECORD +258 -0
  243. {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/WHEEL +1 -1
  244. vgit/__init__.py +0 -1
  245. vgit/gitsheet.py +0 -164
  246. visidata/layout.py +0 -44
  247. visidata/misc.py +0 -5
  248. visidata-2.11.1.data/scripts/vgit +0 -9
  249. visidata-2.11.1.dist-info/RECORD +0 -155
  250. {vgit → visidata/apps/vgit}/__main__.py +0 -0
  251. {vgit → visidata/apps/vgit}/abort.py +0 -0
  252. /visidata/{repeat.py → features/repeat.py} +0 -0
  253. {visidata-2.11.1.data → visidata-3.0.1.data}/scripts/vd +0 -0
  254. {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/LICENSE.gpl3 +0 -0
  255. {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/entry_points.txt +0 -0
  256. {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/top_level.txt +0 -0
visidata/loaders/arrow.py CHANGED
@@ -7,17 +7,17 @@ from visidata import Sheet, VisiData, TypedWrapper, anytype, date, vlen, Column,
7
7
  @VisiData.api
8
8
  def open_arrow(vd, p):
9
9
  'Apache Arrow IPC file format'
10
- return ArrowSheet(p.name, source=p)
10
+ return ArrowSheet(p.base_stem, source=p)
11
11
 
12
12
 
13
13
  @VisiData.api
14
14
  def open_arrows(vd, p):
15
15
  'Apache Arrow IPC streaming format'
16
- return ArrowSheet(p.name, source=p)
16
+ return ArrowSheet(p.base_stem, source=p)
17
17
 
18
18
 
19
19
  def arrow_to_vdtype(t):
20
- import pyarrow as pa
20
+ pa = vd.importExternal('pyarrow')
21
21
 
22
22
  arrow_to_vd_typemap = {
23
23
  pa.lib.Type_BOOL: bool,
@@ -44,7 +44,7 @@ def arrow_to_vdtype(t):
44
44
  pa.lib.Type_LARGE_BINARY: vlen,
45
45
  # pa.lib.Type_FIXED_SIZE_BINARY: bytes,
46
46
  # pa.lib.Type_STRING: str,
47
- pa.lib.Type_LARGE_STRING: vlen,
47
+ # pa.lib.Type_LARGE_STRING: vlen, #2003
48
48
  # pa.lib.Type_LIST: list,
49
49
  # pa.lib.Type_LARGE_LIST: list,
50
50
  # pa.lib.Type_FIXED_SIZE_LIST: list,
@@ -58,7 +58,7 @@ def arrow_to_vdtype(t):
58
58
 
59
59
  class ArrowSheet(Sheet):
60
60
  def iterload(self):
61
- import pyarrow as pa
61
+ pa = vd.importExternal('pyarrow')
62
62
 
63
63
  try:
64
64
  with pa.OSFile(str(self.source), 'rb') as fp:
@@ -81,8 +81,8 @@ class ArrowSheet(Sheet):
81
81
 
82
82
  @VisiData.api
83
83
  def save_arrow(vd, p, sheet, streaming=False):
84
- import pyarrow as pa
85
- import numpy as np
84
+ pa = vd.importExternal('pyarrow')
85
+ np = vd.importExternal('numpy')
86
86
 
87
87
  typemap = {
88
88
  anytype: pa.string(),
@@ -0,0 +1,49 @@
1
+ __author__ = "Paul McCann <polm@dampfkraft.com>"
2
+
3
+ from visidata import vd, VisiData, TableSheet, ItemColumn
4
+
5
+ @VisiData.api
6
+ def open_conll(vd, p):
7
+ return ConllSheet(p.base_stem, source=p)
8
+
9
+
10
+ @VisiData.api
11
+ def open_conllu(vd, p):
12
+ return ConllSheet(p.base_stem, source=p)
13
+
14
+
15
+ class ConllSheet(TableSheet):
16
+ rowtype='tokens'
17
+ # see here for reference:
18
+ # https://universaldependencies.org/format.html
19
+ columns=[
20
+ # Usually an integer, but can be prefixed like "dev-s1"
21
+ ItemColumn('sent_id', 0, type=str),
22
+ # token ID is almost always an integer, but can be technically be a decimal between 0 and 1.
23
+ # starts from 1 for each sentence.
24
+ ItemColumn('token_id', 1, type=int),
25
+ # form from the raw input, aka surface
26
+ ItemColumn('form', 2, type=str),
27
+ ItemColumn('lemma', 3, type=str),
28
+ ItemColumn('upos', 4, type=str),
29
+ ItemColumn('xpos', 5, type=str),
30
+ ItemColumn('feats', 6, type=dict),
31
+ ItemColumn('head', 7, type=int),
32
+ ItemColumn('deprel', 8, type=str),
33
+ # possibly list of pairs, but often? unused
34
+ ItemColumn('deps', 9),
35
+ # empty or a dictionary
36
+ ItemColumn('misc', 10, type=dict),
37
+ ]
38
+ def iterload(self):
39
+ pyconll = vd.importExternal('pyconll')
40
+
41
+ # sent_id + token_id will be unique
42
+ self.setKeys([self.columns[0], self.columns[1]])
43
+
44
+ with self.source.open(encoding='utf-8') as fp:
45
+ for sent in pyconll.load.iter_sentences(fp):
46
+ sent_id = sent.id
47
+ for token in sent:
48
+ yield [sent_id, token.id, token._form, token.lemma, token.upos,
49
+ token.xpos, token.feats, token.head, token.deprel, token.deps, token.misc]
visidata/loaders/csv.py CHANGED
@@ -1,5 +1,3 @@
1
- import csv
2
-
3
1
  from visidata import vd, VisiData, SequenceSheet, options, stacktrace
4
2
  from visidata import TypedExceptionWrapper, Progress
5
3
 
@@ -11,13 +9,25 @@ vd.option('csv_escapechar', None, 'escapechar passed to csv.reader', replay=True
11
9
  vd.option('csv_lineterminator', '\r\n', 'lineterminator passed to csv.writer', replay=True)
12
10
  vd.option('safety_first', False, 'sanitize input/output to handle edge cases, with a performance cost', replay=True)
13
11
 
14
- csv.field_size_limit(2**31-1) # Windows has max 32-bit
15
12
 
16
- options_num_first_rows = 10
13
+ @VisiData.api
14
+ def guess_csv(vd, p):
15
+ import csv
16
+ csv.field_size_limit(2**31-1) #288 Windows has max 32-bit
17
+ line = next(p.open())
18
+ if ',' in line:
19
+ dialect = csv.Sniffer().sniff(line)
20
+ r = dict(filetype='csv', _likelihood=0)
21
+
22
+ for csvopt in dir(dialect):
23
+ if not csvopt.startswith('_'):
24
+ r['csv_'+csvopt] = getattr(dialect, csvopt)
25
+
26
+ return r
17
27
 
18
28
  @VisiData.api
19
29
  def open_csv(vd, p):
20
- return CsvSheet(p.name, source=p)
30
+ return CsvSheet(p.base_stem, source=p)
21
31
 
22
32
  def removeNulls(fp):
23
33
  for line in fp:
@@ -28,7 +38,10 @@ class CsvSheet(SequenceSheet):
28
38
 
29
39
  def iterload(self):
30
40
  'Convert from CSV, first handling header row specially.'
31
- with self.source.open_text(encoding=self.options.encoding) as fp:
41
+ import csv
42
+ csv.field_size_limit(2**31-1) #288 Windows has max 32-bit
43
+
44
+ with self.open_text_source() as fp:
32
45
  if options.safety_first:
33
46
  rdr = csv.reader(removeNulls(fp), **options.getall('csv_'))
34
47
  else:
@@ -47,7 +60,10 @@ class CsvSheet(SequenceSheet):
47
60
  @VisiData.api
48
61
  def save_csv(vd, p, sheet):
49
62
  'Save as single CSV file, handling column names as first line.'
50
- with p.open_text(mode='w', encoding=sheet.options.encoding, newline='') as fp:
63
+ import csv
64
+ csv.field_size_limit(2**31-1) #288 Windows has max 32-bit
65
+
66
+ with p.open(mode='w', encoding=sheet.options.save_encoding, newline='') as fp:
51
67
  cw = csv.writer(fp, **options.getall('csv_'))
52
68
  colnames = [col.name for col in sheet.visibleCols]
53
69
  if ''.join(colnames):
@@ -57,6 +73,8 @@ def save_csv(vd, p, sheet):
57
73
  for dispvals in sheet.iterdispvals(format=True):
58
74
  cw.writerow(dispvals.values())
59
75
 
76
+ CsvSheet.options.regex_skip = '^#.*'
77
+
60
78
  vd.addGlobals({
61
79
  'CsvSheet': CsvSheet
62
80
  })
visidata/loaders/eml.py CHANGED
@@ -4,7 +4,7 @@ from visidata import VisiData, vd, Column, TableSheet, vlen
4
4
 
5
5
  @VisiData.api
6
6
  def open_eml(vd, p):
7
- return EmailSheet(p.name, source=p)
7
+ return EmailSheet(p.base_stem, source=p)
8
8
 
9
9
  class EmailSheet(TableSheet):
10
10
  rowtype = 'parts' # rowdef: sub-Messages
@@ -16,7 +16,7 @@ class EmailSheet(TableSheet):
16
16
  def iterload(self):
17
17
  import email
18
18
  parser = email.parser.Parser()
19
- with self.source.open_text(encoding='utf-8') as fp:
19
+ with self.source.open(encoding='utf-8') as fp:
20
20
  yield from parser.parse(fp).walk()
21
21
 
22
22
  @EmailSheet.api
@@ -27,8 +27,7 @@ def extract_part(sheet, givenpath, part):
27
27
  @EmailSheet.api
28
28
  def extract_parts(sheet, givenpath, *parts):
29
29
  'Save all *parts* to Path *givenpath*.'
30
- if givenpath.exists() and sheet.options.confirm_overwrite:
31
- vd.confirm("%s already exists. overwrite? " % givenpath.given)
30
+ vd.confirmOverwrite(givenpath, f'{givenpath} already exists, extract anyway?')
32
31
 
33
32
  vd.status('saving %s parts to %s' % (len(parts), givenpath.given))
34
33