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.
- visidata/__init__.py +72 -91
- visidata/_input.py +259 -42
- visidata/_open.py +84 -29
- visidata/_types.py +21 -3
- visidata/_urlcache.py +17 -4
- visidata/aggregators.py +78 -25
- visidata/apps/__init__.py +0 -0
- visidata/apps/vdsql/__about__.py +8 -0
- visidata/apps/vdsql/__init__.py +5 -0
- visidata/apps/vdsql/__main__.py +27 -0
- visidata/apps/vdsql/_ibis.py +748 -0
- visidata/apps/vdsql/bigquery.py +61 -0
- visidata/apps/vdsql/clickhouse.py +53 -0
- visidata/apps/vdsql/setup.py +40 -0
- visidata/apps/vdsql/snowflake.py +67 -0
- visidata/apps/vgit/__init__.py +13 -0
- {vgit → visidata/apps/vgit}/blame.py +5 -2
- {vgit → visidata/apps/vgit}/branch.py +31 -16
- {vgit → visidata/apps/vgit}/config.py +3 -3
- visidata/apps/vgit/diff.py +169 -0
- visidata/apps/vgit/gitsheet.py +161 -0
- {vgit → visidata/apps/vgit}/grep.py +6 -5
- visidata/apps/vgit/log.py +81 -0
- {vgit → visidata/apps/vgit}/main.py +18 -5
- {vgit → visidata/apps/vgit}/remote.py +8 -4
- visidata/apps/vgit/repos.py +71 -0
- {vgit → visidata/apps/vgit}/setup.py +6 -4
- visidata/apps/vgit/stash.py +69 -0
- visidata/apps/vgit/status.py +204 -0
- {vgit → visidata/apps/vgit}/statusbar.py +2 -0
- visidata/basesheet.py +63 -51
- visidata/canvas.py +208 -93
- visidata/choose.py +6 -6
- visidata/clean_names.py +29 -0
- visidata/clipboard.py +73 -17
- visidata/cliptext.py +220 -46
- visidata/cmdlog.py +88 -114
- visidata/color.py +142 -56
- visidata/column.py +121 -129
- visidata/ddw/input.ddw +74 -79
- visidata/ddw/regex.ddw +57 -0
- visidata/ddwplay.py +33 -14
- visidata/deprecated.py +77 -3
- visidata/desktop/visidata.desktop +7 -0
- visidata/editor.py +12 -6
- visidata/errors.py +6 -2
- visidata/experimental/__init__.py +0 -0
- visidata/experimental/diff_sheet.py +29 -0
- visidata/experimental/digit_autoedit.py +6 -0
- visidata/experimental/gdrive.py +89 -0
- visidata/experimental/google.py +37 -0
- visidata/experimental/gsheets.py +79 -0
- visidata/experimental/live_search.py +37 -0
- visidata/experimental/liveupdate.py +45 -0
- visidata/experimental/mark.py +133 -0
- visidata/experimental/noahs_tapestry/__init__.py +1 -0
- visidata/experimental/noahs_tapestry/tapestry.py +147 -0
- visidata/experimental/rownum.py +73 -0
- visidata/experimental/slide_cells.py +26 -0
- visidata/expr.py +8 -4
- visidata/extensible.py +22 -4
- visidata/features/__init__.py +0 -0
- visidata/features/addcol_audiometadata.py +42 -0
- visidata/features/addcol_histogram.py +34 -0
- visidata/features/canvas_save_svg.py +69 -0
- visidata/features/change_precision.py +46 -0
- visidata/features/cmdpalette.py +197 -0
- visidata/features/colorbrewer.py +363 -0
- visidata/{colorsheet.py → features/colorsheet.py} +17 -16
- visidata/features/command_server.py +105 -0
- visidata/features/currency_to_usd.py +70 -0
- visidata/{customdate.py → features/customdate.py} +2 -0
- visidata/features/dedupe.py +132 -0
- visidata/{describe.py → features/describe.py} +17 -15
- visidata/features/errors_guide.py +26 -0
- visidata/features/expand_cols.py +202 -0
- visidata/{fill.py → features/fill.py} +3 -1
- visidata/{freeze.py → features/freeze.py} +11 -6
- visidata/features/graph_seaborn.py +79 -0
- visidata/features/helloworld.py +10 -0
- visidata/features/hint_types.py +17 -0
- visidata/{incr.py → features/incr.py} +5 -0
- visidata/{join.py → features/join.py} +107 -53
- visidata/features/known_cols.py +21 -0
- visidata/features/layout.py +62 -0
- visidata/{melt.py → features/melt.py} +32 -21
- visidata/features/normcol.py +118 -0
- visidata/features/open_config.py +7 -0
- visidata/features/open_syspaste.py +18 -0
- visidata/features/ping.py +157 -0
- visidata/features/procmgr.py +208 -0
- visidata/features/random_sample.py +6 -0
- visidata/{regex.py → features/regex.py} +47 -31
- visidata/features/reload_every.py +55 -0
- visidata/features/rename_col_cascade.py +30 -0
- visidata/features/scroll_context.py +60 -0
- visidata/features/select_equal_selected.py +11 -0
- visidata/features/setcol_fake.py +65 -0
- visidata/{slide.py → features/slide.py} +77 -21
- visidata/features/sparkline.py +48 -0
- visidata/features/status_source.py +20 -0
- visidata/{sysedit.py → features/sysedit.py} +2 -1
- visidata/features/sysopen_mailcap.py +46 -0
- visidata/features/term_extras.py +13 -0
- visidata/{transpose.py → features/transpose.py} +5 -4
- visidata/features/type_ipaddr.py +73 -0
- visidata/features/type_url.py +11 -0
- visidata/{unfurl.py → features/unfurl.py} +9 -9
- visidata/{window.py → features/window.py} +2 -2
- visidata/form.py +50 -21
- visidata/freqtbl.py +81 -33
- visidata/fuzzymatch.py +414 -0
- visidata/graph.py +105 -33
- visidata/guide.py +200 -0
- visidata/help.py +75 -44
- visidata/hint.py +39 -0
- visidata/indexsheet.py +109 -0
- visidata/input_history.py +55 -0
- visidata/interface.py +58 -0
- visidata/keys.py +20 -16
- visidata/loaders/__init__.py +9 -0
- visidata/loaders/_pandas.py +61 -21
- visidata/loaders/api_airtable.py +70 -0
- visidata/loaders/api_bitio.py +102 -0
- visidata/loaders/api_matrix.py +148 -0
- visidata/loaders/api_reddit.py +306 -0
- visidata/loaders/api_zulip.py +249 -0
- visidata/loaders/archive.py +41 -7
- visidata/loaders/arrow.py +7 -7
- visidata/loaders/conll.py +49 -0
- visidata/loaders/csv.py +25 -7
- visidata/loaders/eml.py +3 -4
- visidata/loaders/f5log.py +1204 -0
- visidata/loaders/fec.py +325 -0
- visidata/loaders/fixed_width.py +2 -4
- visidata/loaders/frictionless.py +3 -3
- visidata/loaders/geojson.py +8 -5
- visidata/loaders/google.py +48 -0
- visidata/loaders/graphviz.py +4 -4
- visidata/loaders/hdf5.py +4 -4
- visidata/loaders/html.py +54 -12
- visidata/loaders/http.py +84 -30
- visidata/loaders/imap.py +20 -10
- visidata/loaders/jrnl.py +52 -0
- visidata/loaders/json.py +83 -29
- visidata/loaders/jsonla.py +74 -0
- visidata/loaders/lsv.py +15 -11
- visidata/loaders/mailbox.py +40 -0
- visidata/loaders/markdown.py +1 -3
- visidata/loaders/mbtiles.py +4 -5
- visidata/loaders/mysql.py +11 -13
- visidata/loaders/npy.py +7 -7
- visidata/loaders/odf.py +4 -1
- visidata/loaders/orgmode.py +428 -0
- visidata/loaders/pandas_freqtbl.py +14 -20
- visidata/loaders/parquet.py +62 -6
- visidata/loaders/pcap.py +3 -3
- visidata/loaders/pdf.py +4 -3
- visidata/loaders/png.py +19 -13
- visidata/loaders/postgres.py +9 -8
- visidata/loaders/rec.py +7 -3
- visidata/loaders/s3.py +342 -0
- visidata/loaders/sas.py +5 -5
- visidata/loaders/scrape.py +186 -0
- visidata/loaders/shp.py +6 -5
- visidata/loaders/spss.py +5 -6
- visidata/loaders/sqlite.py +68 -28
- visidata/loaders/texttables.py +1 -1
- visidata/loaders/toml.py +60 -0
- visidata/loaders/tsv.py +61 -19
- visidata/loaders/ttf.py +19 -7
- visidata/loaders/unzip_http.py +6 -5
- visidata/loaders/usv.py +1 -1
- visidata/loaders/vcf.py +16 -16
- visidata/loaders/vds.py +10 -7
- visidata/loaders/vdx.py +30 -5
- visidata/loaders/xlsb.py +8 -1
- visidata/loaders/xlsx.py +145 -25
- visidata/loaders/xml.py +6 -3
- visidata/loaders/xword.py +4 -4
- visidata/loaders/yaml.py +15 -5
- visidata/macros.py +129 -42
- visidata/main.py +119 -94
- visidata/mainloop.py +101 -155
- visidata/man/parse_options.py +2 -2
- visidata/man/vd.1 +302 -149
- visidata/man/vd.txt +291 -154
- visidata/memory.py +3 -3
- visidata/menu.py +104 -423
- visidata/metasheets.py +59 -141
- visidata/modify.py +78 -23
- visidata/motd.py +3 -3
- visidata/mouse.py +137 -0
- visidata/movement.py +43 -35
- visidata/optionssheet.py +99 -0
- visidata/path.py +113 -32
- visidata/pivot.py +73 -47
- visidata/plugins.py +65 -192
- visidata/pyobj.py +55 -205
- visidata/rename_col.py +20 -0
- visidata/save.py +37 -20
- visidata/search.py +54 -10
- visidata/selection.py +84 -5
- visidata/settings.py +162 -25
- visidata/sheets.py +239 -260
- visidata/shell.py +51 -21
- visidata/sidebar.py +162 -0
- visidata/sort.py +11 -4
- visidata/statusbar.py +114 -104
- visidata/stored_list.py +43 -0
- visidata/stored_prop.py +38 -0
- visidata/tests/benchmark.csv +52 -0
- visidata/tests/conftest.py +3 -3
- visidata/tests/test_cliptext.py +39 -0
- visidata/tests/test_commands.py +65 -7
- visidata/tests/test_edittext.py +2 -2
- visidata/tests/test_features.py +28 -0
- visidata/tests/test_menu.py +14 -0
- visidata/tests/test_path.py +13 -4
- visidata/text_source.py +53 -0
- visidata/textsheet.py +10 -3
- visidata/theme.py +44 -0
- visidata/themes/__init__.py +0 -0
- visidata/themes/ascii8.py +84 -0
- visidata/themes/asciimono.py +84 -0
- visidata/themes/light.py +17 -0
- visidata/threads.py +89 -40
- visidata/tuiwin.py +22 -0
- visidata/type_currency.py +22 -3
- visidata/type_date.py +31 -9
- visidata/type_floatsi.py +5 -1
- visidata/undo.py +17 -5
- visidata/utils.py +106 -23
- visidata/vdobj.py +28 -17
- visidata/windows.py +10 -0
- visidata/wrappers.py +9 -3
- visidata-3.0.1.data/data/share/applications/visidata.desktop +7 -0
- {visidata-2.11.1.data → visidata-3.0.1.data}/data/share/man/man1/vd.1 +302 -149
- {visidata-2.11.1.data → visidata-3.0.1.data}/data/share/man/man1/visidata.1 +302 -149
- visidata-3.0.1.data/scripts/vd2to3.vdx +9 -0
- {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/METADATA +12 -8
- visidata-3.0.1.dist-info/RECORD +258 -0
- {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/WHEEL +1 -1
- vgit/__init__.py +0 -1
- vgit/gitsheet.py +0 -164
- visidata/layout.py +0 -44
- visidata/misc.py +0 -5
- visidata-2.11.1.data/scripts/vgit +0 -9
- visidata-2.11.1.dist-info/RECORD +0 -155
- {vgit → visidata/apps/vgit}/__main__.py +0 -0
- {vgit → visidata/apps/vgit}/abort.py +0 -0
- /visidata/{repeat.py → features/repeat.py} +0 -0
- {visidata-2.11.1.data → visidata-3.0.1.data}/scripts/vd +0 -0
- {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/LICENSE.gpl3 +0 -0
- {visidata-2.11.1.dist-info → visidata-3.0.1.dist-info}/entry_points.txt +0 -0
- {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.
|
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.
|
16
|
+
return ArrowSheet(p.base_stem, source=p)
|
17
17
|
|
18
18
|
|
19
19
|
def arrow_to_vdtype(t):
|
20
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
85
|
-
|
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
|
-
|
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.
|
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
|
-
|
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
|
-
|
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.
|
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.
|
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
|
-
|
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
|
|