dataframe-textual 2.2.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.
@@ -0,0 +1,60 @@
1
+ """DataFrame Viewer - Interactive CSV/Excel viewer for the terminal."""
2
+
3
+ from importlib.metadata import version
4
+
5
+ __version__ = version("dataframe-textual")
6
+
7
+ from .data_frame_help_panel import DataFrameHelpPanel
8
+ from .data_frame_table import DataFrameTable, History
9
+ from .data_frame_viewer import DataFrameViewer
10
+ from .table_screen import (
11
+ FrequencyScreen,
12
+ MetaColumnScreen,
13
+ MetaShape,
14
+ RowDetailScreen,
15
+ StatisticsScreen,
16
+ TableScreen,
17
+ )
18
+ from .yes_no_screen import (
19
+ AddColumnScreen,
20
+ AddLinkScreen,
21
+ ConfirmScreen,
22
+ EditCellScreen,
23
+ EditColumnScreen,
24
+ FilterScreen,
25
+ FindReplaceScreen,
26
+ FreezeScreen,
27
+ OpenFileScreen,
28
+ RenameColumnScreen,
29
+ RenameTabScreen,
30
+ SaveFileScreen,
31
+ SearchScreen,
32
+ YesNoScreen,
33
+ )
34
+
35
+ __all__ = [
36
+ "DataFrameViewer",
37
+ "DataFrameHelpPanel",
38
+ "DataFrameTable",
39
+ "History",
40
+ "TableScreen",
41
+ "RowDetailScreen",
42
+ "FrequencyScreen",
43
+ "StatisticsScreen",
44
+ "MetaShape",
45
+ "MetaColumnScreen",
46
+ "YesNoScreen",
47
+ "SaveFileScreen",
48
+ "ConfirmScreen",
49
+ "EditCellScreen",
50
+ "SearchScreen",
51
+ "FilterScreen",
52
+ "FreezeScreen",
53
+ "OpenFileScreen",
54
+ "RenameColumnScreen",
55
+ "EditColumnScreen",
56
+ "AddColumnScreen",
57
+ "AddLinkScreen",
58
+ "FindReplaceScreen",
59
+ "RenameTabScreen",
60
+ ]
@@ -0,0 +1,107 @@
1
+ """Entry point for running DataFrameViewer as a module."""
2
+
3
+ import argparse
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ from . import __version__
8
+ from .common import SUPPORTED_FORMATS, load_dataframe
9
+ from .data_frame_viewer import DataFrameViewer
10
+
11
+
12
+ def cli() -> argparse.Namespace:
13
+ """Parse command-line arguments.
14
+
15
+ Determines input files or stdin and validates file existence
16
+ """
17
+ parser = argparse.ArgumentParser(
18
+ prog="dv",
19
+ description="Interactive terminal based viewer/editor for tabular data (e.g., CSV/Excel).",
20
+ formatter_class=argparse.RawDescriptionHelpFormatter,
21
+ epilog="Examples:\n"
22
+ " %(prog)s data.csv\n"
23
+ " %(prog)s file1.csv file2.csv file3.csv\n"
24
+ " %(prog)s data.xlsx (opens each sheet in separate tab)\n"
25
+ " cat data.csv | %(prog)s --format csv\n",
26
+ )
27
+ parser.add_argument("files", nargs="*", help="Files to view (or read from stdin)")
28
+ parser.add_argument(
29
+ "-V",
30
+ "--version",
31
+ action="version",
32
+ version=f"%(prog)s {__version__}",
33
+ )
34
+ parser.add_argument(
35
+ "-f",
36
+ "--format",
37
+ choices=SUPPORTED_FORMATS,
38
+ help="Specify the format of the input files (csv, excel, tsv etc.)",
39
+ )
40
+ parser.add_argument(
41
+ "-H",
42
+ "--no-header",
43
+ action="store_true",
44
+ help="Specify that input files have no header row when reading CSV/TSV",
45
+ )
46
+ parser.add_argument(
47
+ "-I", "--no-inference", action="store_true", help="Do not infer data types when reading CSV/TSV"
48
+ )
49
+ parser.add_argument(
50
+ "-t", "--truncate-ragged-lines", action="store_true", help="Truncate ragged lines when reading CSV/TSV"
51
+ )
52
+ parser.add_argument("-E", "--ignore-errors", action="store_true", help="Ignore errors when reading CSV/TSV")
53
+ parser.add_argument(
54
+ "-c", "--comment-prefix", nargs="?", const="#", help="Comment lines are skipped when reading CSV/TSV"
55
+ )
56
+ parser.add_argument(
57
+ "-q", "--quote-char", nargs="?", const=None, default='"', help="Quote character for reading CSV/TSV"
58
+ )
59
+ parser.add_argument("-l", "--skip-lines", type=int, default=0, help="Skip lines when reading CSV/TSV")
60
+ parser.add_argument(
61
+ "-a", "--skip-rows-after-header", type=int, default=0, help="Skip rows after header when reading CSV/TSV"
62
+ )
63
+ parser.add_argument("-n", "--null", nargs="+", help="Values to interpret as null values when reading CSV/TSV")
64
+
65
+ args = parser.parse_args()
66
+ if args.files is None:
67
+ args.files = []
68
+
69
+ # Check if reading from stdin (pipe or redirect)
70
+ if not sys.stdin.isatty():
71
+ args.files.append("-")
72
+ else:
73
+ # Validate all files exist
74
+ for filename in args.files:
75
+ if not Path(filename).exists():
76
+ print(f"File not found: {filename}")
77
+ sys.exit(1)
78
+
79
+ if not args.files:
80
+ parser.print_help()
81
+ sys.exit(1)
82
+
83
+ return args
84
+
85
+
86
+ def main() -> None:
87
+ """Run the DataFrame Viewer application."""
88
+ args = cli()
89
+ sources = load_dataframe(
90
+ args.files,
91
+ file_format=args.format,
92
+ has_header=not args.no_header,
93
+ infer_schema=not args.no_inference,
94
+ comment_prefix=args.comment_prefix,
95
+ quote_char=args.quote_char,
96
+ skip_lines=args.skip_lines,
97
+ skip_rows_after_header=args.skip_rows_after_header,
98
+ null_values=args.null,
99
+ ignore_errors=args.ignore_errors,
100
+ truncate_ragged_lines=args.truncate_ragged_lines,
101
+ )
102
+ app = DataFrameViewer(*sources)
103
+ app.run()
104
+
105
+
106
+ if __name__ == "__main__":
107
+ main()