dataframe-textual 0.1.0__tar.gz → 0.3.0__tar.gz

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 (17) hide show
  1. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/PKG-INFO +60 -34
  2. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/README.md +54 -27
  3. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/main.py +1 -1
  4. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/pyproject.toml +13 -9
  5. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/table_screen.py +9 -5
  6. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/uv.lock +10 -4
  7. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/.gitignore +0 -0
  8. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/.python-version +0 -0
  9. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/LICENSE +0 -0
  10. {dataframe_textual-0.1.0 → dataframe_textual-0.3.0}/screenshot.png +0 -0
  11. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/__init__.py +0 -0
  12. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/__main__.py +0 -0
  13. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/common.py +0 -0
  14. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/data_frame_help_panel.py +0 -0
  15. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/data_frame_table.py +0 -0
  16. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/data_frame_viewer.py +0 -0
  17. {dataframe_textual-0.1.0/src/dataframe_viewer → dataframe_textual-0.3.0/src/dataframe_textual}/yes_no_screen.py +0 -0
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframe-textual
3
- Version: 0.1.0
3
+ Version: 0.3.0
4
4
  Summary: Interactive CSV/Excel viewer for the terminal (Textual TUI)
5
- Project-URL: Homepage, https://github.com/need47/dataframe-viewer
6
- Project-URL: Repository, https://github.com/need47/dataframe-viewer.git
7
- Project-URL: Documentation, https://github.com/need47/dataframe-viewer#readme
8
- Project-URL: Bug Tracker, https://github.com/need47/dataframe-viewer/issues
5
+ Project-URL: Homepage, https://github.com/need47/dataframe-textual
6
+ Project-URL: Repository, https://github.com/need47/dataframe-textual.git
7
+ Project-URL: Documentation, https://github.com/need47/dataframe-textual#readme
8
+ Project-URL: Bug Tracker, https://github.com/need47/dataframe-textual/issues
9
9
  Author-email: Tiejun Cheng <need47@gmail.com>
10
10
  License: MIT
11
11
  License-File: LICENSE
12
- Keywords: csv,data-analysis,interactive,polars,terminal,textual,tui,viewer
12
+ Keywords: csv,data-analysis,excel,interactive,polars,terminal,textual,tui,viewer
13
13
  Classifier: Development Status :: 3 - Alpha
14
14
  Classifier: Environment :: Console
15
15
  Classifier: Intended Audience :: Developers
@@ -29,7 +29,6 @@ Classifier: Topic :: Utilities
29
29
  Classifier: Typing :: Typed
30
30
  Requires-Python: >=3.11
31
31
  Requires-Dist: polars>=1.34.0
32
- Requires-Dist: rich>=14.2.0
33
32
  Requires-Dist: textual>=1.0.0
34
33
  Provides-Extra: dev
35
34
  Requires-Dist: textual-dev>=1.8.0; extra == 'dev'
@@ -38,11 +37,11 @@ Requires-Dist: fastexcel>=0.16.0; extra == 'excel'
38
37
  Requires-Dist: xlsxwriter>=3.2.9; extra == 'excel'
39
38
  Description-Content-Type: text/markdown
40
39
 
41
- # DataFrame Viewer
40
+ # DataFrame Viewer/Editor
42
41
 
43
- A powerful, interactive terminal-based CSV viewer built with Python, Polars, and Textual. Inspired by VisiData, this tool provides smooth keyboard navigation, data manipulation, and a clean interface for exploring CSV data directly in your terminal. Now with **multi-file support for simultaneous data comparison**!
42
+ A powerful, interactive terminal-based CSV/Excel viewer/editor built with Python, Polars, and Textual. Inspired by VisiData, this tool provides smooth keyboard navigation, data manipulation, and a clean interface for exploring tabular data directly in your terminal. Now with **multi-file support for simultaneous data comparison**!
44
43
 
45
- ![Screenshot](https://raw.githubusercontent.com/need47/dataframe-viewer/refs/heads/main/screenshot.png)
44
+ ![Screenshot](https://raw.githubusercontent.com/need47/dataframe-textual/refs/heads/main/screenshot.png)
46
45
 
47
46
  ## Features
48
47
 
@@ -68,21 +67,48 @@ A powerful, interactive terminal-based CSV viewer built with Python, Polars, and
68
67
 
69
68
  ## Installation
70
69
 
71
- ### Using uv (recommended)
70
+ ### Using pip
71
+
72
+ ```bash
73
+ # Install from PyPI
74
+ pip install dataframe-textual
75
+
76
+ # With Excel support (fastexcel, xlsxwriter)
77
+ pip install dataframe-textual[excel]
78
+ ```
79
+
80
+ Then run:
81
+ ```bash
82
+ dataframe-textual <csv_file>
83
+ ```
84
+
85
+ ### Using uv
72
86
 
73
87
  ```bash
88
+ # Quick run using uvx without installation
89
+ uvx https://github.com/need47/dataframe-textual.git <csvfile>
90
+
74
91
  # Clone or download the project
75
- cd dataframe-viewer
92
+ cd dataframe-textual
76
93
 
77
94
  # Run directly with uv
78
95
  uv run python main.py <csv_file>
96
+
97
+ #
79
98
  ```
80
99
 
81
- ### Using pip
100
+ ### Development installation
82
101
 
83
102
  ```bash
84
- pip install polars textual
85
- python main.py <csv_file>
103
+ # Clone the repository
104
+ git clone https://github.com/need47/dataframe-textual.git
105
+ cd dataframe-textual
106
+
107
+ # Install from local source
108
+ pip install -e .
109
+
110
+ # Or with development dependencies
111
+ pip install -e ".[excel,dev]"
86
112
  ```
87
113
 
88
114
  ## Usage
@@ -90,31 +116,31 @@ python main.py <csv_file>
90
116
  ### Basic Usage - Single File
91
117
 
92
118
  ```bash
93
- # View a CSV file
119
+ # After pip install dataframe-textual
120
+ dataframe-textual pokemon.csv
121
+
122
+ # Or if running from source
94
123
  python main.py pokemon.csv
95
124
 
96
125
  # Or with uv
97
126
  uv run python main.py pokemon.csv
98
127
 
99
128
  # Read from stdin
100
- cat data.csv | python main.py
101
- python main.py < data.csv
129
+ cat data.csv | dataframe-textual
130
+ dataframe-textual < data.csv
102
131
  ```
103
132
 
104
133
  ### Multi-File Usage - Multiple Tabs
105
134
 
106
135
  ```bash
107
136
  # Open multiple files in tabs
108
- python main.py file1.csv file2.csv file3.csv
137
+ dataframe-textual file1.csv file2.csv file3.csv
109
138
 
110
139
  # Open multiple sheets in tabs in an Excel file
111
- python main.py file.xlsx
112
-
113
- # Or with uv
114
- uv run python main.py file1.csv file2.csv file3.csv
140
+ dataframe-textual file.xlsx
115
141
 
116
142
  # Mix files and stdin (file opens first, then read from stdin)
117
- python main.py data1.csv < data2.csv
143
+ dataframe-textual data1.csv < data2.csv
118
144
  ```
119
145
 
120
146
  When multiple files are opened:
@@ -411,35 +437,35 @@ Press `c` to copy:
411
437
 
412
438
  ```bash
413
439
  # View Pokemon dataset
414
- python main.py pokemon.csv
440
+ dataframe-textual pokemon.csv
415
441
 
416
442
  # View Titanic dataset with analysis
417
- python main.py titanic.csv
443
+ dataframe-textual titanic.csv
418
444
 
419
445
  # Filter and view specific columns
420
- cut -d',' -f1,2,3 pokemon.csv | python main.py
446
+ cut -d',' -f1,2,3 pokemon.csv | dataframe-textual
421
447
 
422
448
  # View with grep filter (then use | search in viewer)
423
- grep "Fire" pokemon.csv | python main.py
449
+ grep "Fire" pokemon.csv | dataframe-textual
424
450
 
425
451
  # Chain with other commands
426
- cat data.csv | sort -t',' -k2 | python main.py
452
+ cat data.csv | sort -t',' -k2 | dataframe-textual
427
453
  ```
428
454
 
429
455
  ### Multi-File Examples
430
456
 
431
457
  ```bash
432
458
  # Compare two versions of a dataset
433
- python main.py pokemon_v1.csv pokemon_v2.csv
459
+ dataframe-textual pokemon_v1.csv pokemon_v2.csv
434
460
 
435
461
  # Side-by-side analysis of related files
436
- python main.py sales_2022.csv sales_2023.csv forecast_2024.csv
462
+ dataframe-textual sales_2022.csv sales_2023.csv forecast_2024.csv
437
463
 
438
464
  # Cross-reference datasets
439
- python main.py customers.csv orders.csv products.csv
465
+ dataframe-textual customers.csv orders.csv products.csv
440
466
 
441
467
  # Start with one file, open others using Ctrl+O
442
- python main.py initial_data.csv
468
+ dataframe-textual initial_data.csv
443
469
  # Then press Ctrl+O to open more files interactively
444
470
  ```
445
471
 
@@ -448,7 +474,7 @@ python main.py initial_data.csv
448
474
  ```bash
449
475
  # Start with a filtered file, compare with original
450
476
  grep "status=active" data.csv > filtered.csv
451
- python main.py data.csv filtered.csv
477
+ dataframe-textual data.csv filtered.csv
452
478
  # Now compare the full dataset with the filtered version in separate tabs
453
479
 
454
480
  # Multi-step analysis
@@ -1,8 +1,8 @@
1
- # DataFrame Viewer
1
+ # DataFrame Viewer/Editor
2
2
 
3
- A powerful, interactive terminal-based CSV viewer built with Python, Polars, and Textual. Inspired by VisiData, this tool provides smooth keyboard navigation, data manipulation, and a clean interface for exploring CSV data directly in your terminal. Now with **multi-file support for simultaneous data comparison**!
3
+ A powerful, interactive terminal-based CSV/Excel viewer/editor built with Python, Polars, and Textual. Inspired by VisiData, this tool provides smooth keyboard navigation, data manipulation, and a clean interface for exploring tabular data directly in your terminal. Now with **multi-file support for simultaneous data comparison**!
4
4
 
5
- ![Screenshot](https://raw.githubusercontent.com/need47/dataframe-viewer/refs/heads/main/screenshot.png)
5
+ ![Screenshot](https://raw.githubusercontent.com/need47/dataframe-textual/refs/heads/main/screenshot.png)
6
6
 
7
7
  ## Features
8
8
 
@@ -28,21 +28,48 @@ A powerful, interactive terminal-based CSV viewer built with Python, Polars, and
28
28
 
29
29
  ## Installation
30
30
 
31
- ### Using uv (recommended)
31
+ ### Using pip
32
+
33
+ ```bash
34
+ # Install from PyPI
35
+ pip install dataframe-textual
36
+
37
+ # With Excel support (fastexcel, xlsxwriter)
38
+ pip install dataframe-textual[excel]
39
+ ```
40
+
41
+ Then run:
42
+ ```bash
43
+ dataframe-textual <csv_file>
44
+ ```
45
+
46
+ ### Using uv
32
47
 
33
48
  ```bash
49
+ # Quick run using uvx without installation
50
+ uvx https://github.com/need47/dataframe-textual.git <csvfile>
51
+
34
52
  # Clone or download the project
35
- cd dataframe-viewer
53
+ cd dataframe-textual
36
54
 
37
55
  # Run directly with uv
38
56
  uv run python main.py <csv_file>
57
+
58
+ #
39
59
  ```
40
60
 
41
- ### Using pip
61
+ ### Development installation
42
62
 
43
63
  ```bash
44
- pip install polars textual
45
- python main.py <csv_file>
64
+ # Clone the repository
65
+ git clone https://github.com/need47/dataframe-textual.git
66
+ cd dataframe-textual
67
+
68
+ # Install from local source
69
+ pip install -e .
70
+
71
+ # Or with development dependencies
72
+ pip install -e ".[excel,dev]"
46
73
  ```
47
74
 
48
75
  ## Usage
@@ -50,31 +77,31 @@ python main.py <csv_file>
50
77
  ### Basic Usage - Single File
51
78
 
52
79
  ```bash
53
- # View a CSV file
80
+ # After pip install dataframe-textual
81
+ dataframe-textual pokemon.csv
82
+
83
+ # Or if running from source
54
84
  python main.py pokemon.csv
55
85
 
56
86
  # Or with uv
57
87
  uv run python main.py pokemon.csv
58
88
 
59
89
  # Read from stdin
60
- cat data.csv | python main.py
61
- python main.py < data.csv
90
+ cat data.csv | dataframe-textual
91
+ dataframe-textual < data.csv
62
92
  ```
63
93
 
64
94
  ### Multi-File Usage - Multiple Tabs
65
95
 
66
96
  ```bash
67
97
  # Open multiple files in tabs
68
- python main.py file1.csv file2.csv file3.csv
98
+ dataframe-textual file1.csv file2.csv file3.csv
69
99
 
70
100
  # Open multiple sheets in tabs in an Excel file
71
- python main.py file.xlsx
72
-
73
- # Or with uv
74
- uv run python main.py file1.csv file2.csv file3.csv
101
+ dataframe-textual file.xlsx
75
102
 
76
103
  # Mix files and stdin (file opens first, then read from stdin)
77
- python main.py data1.csv < data2.csv
104
+ dataframe-textual data1.csv < data2.csv
78
105
  ```
79
106
 
80
107
  When multiple files are opened:
@@ -371,35 +398,35 @@ Press `c` to copy:
371
398
 
372
399
  ```bash
373
400
  # View Pokemon dataset
374
- python main.py pokemon.csv
401
+ dataframe-textual pokemon.csv
375
402
 
376
403
  # View Titanic dataset with analysis
377
- python main.py titanic.csv
404
+ dataframe-textual titanic.csv
378
405
 
379
406
  # Filter and view specific columns
380
- cut -d',' -f1,2,3 pokemon.csv | python main.py
407
+ cut -d',' -f1,2,3 pokemon.csv | dataframe-textual
381
408
 
382
409
  # View with grep filter (then use | search in viewer)
383
- grep "Fire" pokemon.csv | python main.py
410
+ grep "Fire" pokemon.csv | dataframe-textual
384
411
 
385
412
  # Chain with other commands
386
- cat data.csv | sort -t',' -k2 | python main.py
413
+ cat data.csv | sort -t',' -k2 | dataframe-textual
387
414
  ```
388
415
 
389
416
  ### Multi-File Examples
390
417
 
391
418
  ```bash
392
419
  # Compare two versions of a dataset
393
- python main.py pokemon_v1.csv pokemon_v2.csv
420
+ dataframe-textual pokemon_v1.csv pokemon_v2.csv
394
421
 
395
422
  # Side-by-side analysis of related files
396
- python main.py sales_2022.csv sales_2023.csv forecast_2024.csv
423
+ dataframe-textual sales_2022.csv sales_2023.csv forecast_2024.csv
397
424
 
398
425
  # Cross-reference datasets
399
- python main.py customers.csv orders.csv products.csv
426
+ dataframe-textual customers.csv orders.csv products.csv
400
427
 
401
428
  # Start with one file, open others using Ctrl+O
402
- python main.py initial_data.csv
429
+ dataframe-textual initial_data.csv
403
430
  # Then press Ctrl+O to open more files interactively
404
431
  ```
405
432
 
@@ -408,7 +435,7 @@ python main.py initial_data.csv
408
435
  ```bash
409
436
  # Start with a filtered file, compare with original
410
437
  grep "status=active" data.csv > filtered.csv
411
- python main.py data.csv filtered.csv
438
+ dataframe-textual data.csv filtered.csv
412
439
  # Now compare the full dataset with the filtered version in separate tabs
413
440
 
414
441
  # Multi-step analysis
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  """Entry point for DataFrameViewer."""
3
3
 
4
- from dataframe_viewer.__main__ import main
4
+ from dataframe_textual.__main__ import main
5
5
 
6
6
  if __name__ == "__main__":
7
7
  main()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dataframe-textual"
7
- version = "0.1.0"
7
+ version = "0.3.0"
8
8
  description = "Interactive CSV/Excel viewer for the terminal (Textual TUI)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -12,7 +12,7 @@ license = {text = "MIT"}
12
12
  authors = [
13
13
  {name = "Tiejun Cheng", email = "need47@gmail.com"}
14
14
  ]
15
- keywords = ["csv", "viewer", "terminal", "tui", "textual", "data-analysis", "polars", "interactive"]
15
+ keywords = ["csv", "excel", "viewer", "terminal", "tui", "textual", "data-analysis", "polars", "interactive"]
16
16
  classifiers = [
17
17
  "Development Status :: 3 - Alpha",
18
18
  "Environment :: Console",
@@ -34,15 +34,14 @@ classifiers = [
34
34
  ]
35
35
  dependencies = [
36
36
  "polars>=1.34.0",
37
- "rich>=14.2.0",
38
37
  "textual>=1.0.0",
39
38
  ]
40
39
 
41
40
  [project.urls]
42
- Homepage = "https://github.com/need47/dataframe-viewer"
43
- Repository = "https://github.com/need47/dataframe-viewer.git"
44
- Documentation = "https://github.com/need47/dataframe-viewer#readme"
45
- "Bug Tracker" = "https://github.com/need47/dataframe-viewer/issues"
41
+ Homepage = "https://github.com/need47/dataframe-textual"
42
+ Repository = "https://github.com/need47/dataframe-textual.git"
43
+ Documentation = "https://github.com/need47/dataframe-textual#readme"
44
+ "Bug Tracker" = "https://github.com/need47/dataframe-textual/issues"
46
45
 
47
46
  [project.optional-dependencies]
48
47
  excel = [
@@ -54,7 +53,12 @@ dev = [
54
53
  ]
55
54
 
56
55
  [tool.hatch.build.targets.wheel]
57
- packages = ["src/dataframe_viewer"]
56
+ packages = ["src/dataframe_textual"]
57
+
58
+ [dependency-groups]
59
+ dev = [
60
+ "textual-dev>=1.8.0",
61
+ ]
58
62
 
59
63
  [project.scripts]
60
- dataframe-textual = "dataframe_viewer.__main__:main"
64
+ dataframe-textual = "dataframe_textual.__main__:main"
@@ -6,6 +6,7 @@ import polars as pl
6
6
  from rich.text import Text
7
7
  from textual.app import ComposeResult
8
8
  from textual.coordinate import Coordinate
9
+ from textual.renderables.bar import Bar
9
10
  from textual.screen import ModalScreen
10
11
  from textual.widgets import DataTable
11
12
 
@@ -136,6 +137,8 @@ class RowDetailScreen(TableScreen):
136
137
  *_format_row([col, val], [None, dtype], apply_justify=False)
137
138
  )
138
139
 
140
+ self.table.cursor_type = "row"
141
+
139
142
  def on_key(self, event):
140
143
  if event.key == "v":
141
144
  # Filter the main table by the selected value
@@ -188,6 +191,7 @@ class FrequencyScreen(TableScreen):
188
191
  self.table.add_column(Text(column, justify=dc.justify), key=column)
189
192
  self.table.add_column(Text("Count", justify="right"), key="Count")
190
193
  self.table.add_column(Text("%", justify="right"), key="%")
194
+ self.table.add_column(Text("Histogram", justify="left"), key="Histogram")
191
195
 
192
196
  # Get style config for Int64 and Float64
193
197
  ds_int = DtypeConfig("Int64")
@@ -204,16 +208,16 @@ class FrequencyScreen(TableScreen):
204
208
  style=dc.style,
205
209
  justify=dc.justify,
206
210
  ),
207
- Text(
208
- str(count),
209
- style=ds_int.style,
210
- justify=ds_int.justify,
211
- ),
211
+ Text(str(count), style=ds_int.style, justify=ds_int.justify),
212
212
  Text(
213
213
  f"{percentage:.2f}",
214
214
  style=ds_float.style,
215
215
  justify=ds_float.justify,
216
216
  ),
217
+ Bar(
218
+ highlight_range=(0.0, percentage / 100 * 10),
219
+ width=10,
220
+ ),
217
221
  key=str(row_idx + 1),
218
222
  )
219
223
 
@@ -170,12 +170,11 @@ wheels = [
170
170
  ]
171
171
 
172
172
  [[package]]
173
- name = "dataframe-viewer"
174
- version = "0.1.0"
173
+ name = "dataframe-textual"
174
+ version = "0.3.0"
175
175
  source = { editable = "." }
176
176
  dependencies = [
177
177
  { name = "polars" },
178
- { name = "rich" },
179
178
  { name = "textual" },
180
179
  ]
181
180
 
@@ -188,17 +187,24 @@ excel = [
188
187
  { name = "xlsxwriter" },
189
188
  ]
190
189
 
190
+ [package.dev-dependencies]
191
+ dev = [
192
+ { name = "textual-dev" },
193
+ ]
194
+
191
195
  [package.metadata]
192
196
  requires-dist = [
193
197
  { name = "fastexcel", marker = "extra == 'excel'", specifier = ">=0.16.0" },
194
198
  { name = "polars", specifier = ">=1.34.0" },
195
- { name = "rich", specifier = ">=14.2.0" },
196
199
  { name = "textual", specifier = ">=1.0.0" },
197
200
  { name = "textual-dev", marker = "extra == 'dev'", specifier = ">=1.8.0" },
198
201
  { name = "xlsxwriter", marker = "extra == 'excel'", specifier = ">=3.2.9" },
199
202
  ]
200
203
  provides-extras = ["excel", "dev"]
201
204
 
205
+ [package.metadata.requires-dev]
206
+ dev = [{ name = "textual-dev", specifier = ">=1.8.0" }]
207
+
202
208
  [[package]]
203
209
  name = "fastexcel"
204
210
  version = "0.16.0"