dataframe-textual 2.4.1__py3-none-any.whl → 2.4.3__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.
@@ -12,7 +12,7 @@ import polars as pl
12
12
  from rich.text import Text
13
13
 
14
14
  # Supported file formats
15
- SUPPORTED_FORMATS = ["tsv", "csv", "psv", "excel", "parquet", "json", "ndjson"]
15
+ SUPPORTED_FORMATS = ["tsv", "csv", "psv", "xlsx", "xls", "parquet", "json", "ndjson"]
16
16
 
17
17
 
18
18
  # Boolean string mappings
@@ -531,8 +531,6 @@ def load_dataframe(
531
531
  ext = Path(filename).with_suffix("").suffix.lower()
532
532
 
533
533
  fmt = ext.removeprefix(".")
534
- if fmt in ("xls", "xlsx"):
535
- fmt = "excel"
536
534
 
537
535
  # Default to TSV
538
536
  if not fmt or fmt not in SUPPORTED_FORMATS:
@@ -688,7 +686,7 @@ def load_file(
688
686
  truncate_ragged_lines=truncate_ragged_lines,
689
687
  )
690
688
  data.append(Source(lf, filename, filepath.stem))
691
- elif file_format == "excel":
689
+ elif file_format in ("xlsx", "xls"):
692
690
  if first_sheet:
693
691
  # Read only the first sheet for multiple files
694
692
  lf = pl.read_excel(source).lazy()
@@ -3783,7 +3783,7 @@ class DataFrameTable(DataTable):
3783
3783
  """Open screen to save file."""
3784
3784
  self._task_after_save = task_after_save
3785
3785
  tab_count = len(self.app.tabs)
3786
- save_all = tab_count > 1 and all_tabs is not False
3786
+ save_all = all_tabs is not False
3787
3787
 
3788
3788
  filepath = Path(self.filename)
3789
3789
  if save_all:
@@ -263,8 +263,11 @@ class DataFrameViewer(App):
263
263
  def action_save_current_tab_overwrite(self) -> None:
264
264
  """Save the currently active tab to file, overwriting if it exists."""
265
265
  if table := self.get_active_table():
266
- filepath = Path(table.filename)
267
- filename = filepath.with_stem(table.tabname)
266
+ if len(self.tabs) > 1:
267
+ filepath = Path(table.filename)
268
+ filename = filepath.with_stem(table.tabname)
269
+ else:
270
+ filename = table.filename
268
271
  table.save_to_file((filename, False, False))
269
272
 
270
273
  def action_save_all_tabs_overwrite(self) -> None:
@@ -298,7 +298,7 @@ class SaveFileScreen(YesNoScreen):
298
298
  title="Save to File",
299
299
  label="Filename",
300
300
  input=filename,
301
- yes=f"Save {tab_count} Tabs" if self.save_all else "Save Current Tab" if tab_count > 1 else "Save",
301
+ yes=f"Save {tab_count} Tab(s)" if self.save_all else "Save Current Tab" if tab_count > 1 else "Save",
302
302
  no="Cancel",
303
303
  on_yes_callback=self.handle_save,
304
304
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframe-textual
3
- Version: 2.4.1
3
+ Version: 2.4.3
4
4
  Summary: Interactive terminal viewer/editor for tabular data
5
5
  Project-URL: Homepage, https://github.com/need47/dataframe-textual
6
6
  Project-URL: Repository, https://github.com/need47/dataframe-textual.git
@@ -167,7 +167,7 @@ When multiple files are opened:
167
167
  ## Command Line Options
168
168
 
169
169
  ```
170
- usage: dv [-h] [-V] [-f {csv,json,excel,ndjson,psv,parquet,tsv}] [-H] [-I] [-t] [-E] [-c [COMMENT_PREFIX]] [-q [QUOTE_CHAR]] [-l SKIP_LINES] [-a SKIP_ROWS_AFTER_HEADER] [-n NULL [NULL ...]] [files ...]
170
+ usage: dv [-h] [-V] [-f {csv,json,xlsx,xls,ndjson,psv,parquet,tsv}] [-H] [-I] [-t] [-E] [-c [COMMENT_PREFIX]] [-q [QUOTE_CHAR]] [-l SKIP_LINES] [-a SKIP_ROWS_AFTER_HEADER] [-n NULL [NULL ...]] [files ...]
171
171
 
172
172
  Interactive terminal based viewer/editor for tabular data (e.g., CSV/Excel).
173
173
 
@@ -177,8 +177,8 @@ positional arguments:
177
177
  options:
178
178
  -h, --help show this help message and exit
179
179
  -V, --version show program's version number and exit
180
- -f, --format {csv,json,excel,ndjson,psv,parquet,tsv}
181
- Specify the format of the input files (csv, excel, tsv etc.)
180
+ -f, --format {csv,json,xlsx,xls,ndjson,psv,parquet,tsv}
181
+ Specify the format of the input files (csv, tsv etc.)
182
182
  -H, --no-header Specify that input files have no header row when reading CSV/TSV
183
183
  -I, --no-inference Do not infer data types when reading CSV/TSV
184
184
  -t, --truncate-ragged-lines
@@ -0,0 +1,14 @@
1
+ dataframe_textual/__init__.py,sha256=E53fW1spQRA4jW9grxSqPEmoe9zofzr6twdveMbt_W8,1310
2
+ dataframe_textual/__main__.py,sha256=xXeUA2EqVhufPkTbvv6MOCt3_ESHBH3PsCE--07a0ww,3613
3
+ dataframe_textual/common.py,sha256=WwCUnG5MReUz6yfjHPL1mrwgDddCCJmIbqk_hrRduYU,28461
4
+ dataframe_textual/data_frame_help_panel.py,sha256=UEtj64XsVRdtLzuwOaITfoEQUkAfwFuvpr5Npip5WHs,3381
5
+ dataframe_textual/data_frame_table.py,sha256=4I8acfjvnOKOhzZFjhqvaaOYhrz1IZHK5WnUKrPd12M,151387
6
+ dataframe_textual/data_frame_viewer.py,sha256=VHdviK6t9o4EMmr1-6_0_DyNHV0pjXU-Uu9sJA3e-18,23387
7
+ dataframe_textual/sql_screen.py,sha256=P3j1Fv45NIKEYo9adb7NPod54FaU-djFIvCUMMHbvjY,7534
8
+ dataframe_textual/table_screen.py,sha256=XPzJI6FXjwnxtQSMTmluygwkYM-0-Lx3v9o-MuL6bMg,19071
9
+ dataframe_textual/yes_no_screen.py,sha256=b8CUsGjozMuTnGo6x1qDoumDVy09YkrvitPoRNF5uh0,26402
10
+ dataframe_textual-2.4.3.dist-info/METADATA,sha256=gU0HLZK2_b04SQBTSoLQ7KLfpHyKC8UuJiGk3dA9j0M,29481
11
+ dataframe_textual-2.4.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
12
+ dataframe_textual-2.4.3.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
13
+ dataframe_textual-2.4.3.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
14
+ dataframe_textual-2.4.3.dist-info/RECORD,,
@@ -1,14 +0,0 @@
1
- dataframe_textual/__init__.py,sha256=E53fW1spQRA4jW9grxSqPEmoe9zofzr6twdveMbt_W8,1310
2
- dataframe_textual/__main__.py,sha256=xXeUA2EqVhufPkTbvv6MOCt3_ESHBH3PsCE--07a0ww,3613
3
- dataframe_textual/common.py,sha256=8Fqwuco7z4p_3GDCF7Gp8SYGUz24Sncpc457FCyMMWk,28516
4
- dataframe_textual/data_frame_help_panel.py,sha256=UEtj64XsVRdtLzuwOaITfoEQUkAfwFuvpr5Npip5WHs,3381
5
- dataframe_textual/data_frame_table.py,sha256=vvXgM-BDHKLCHzue3JJ5O7OKIlMj3w8WyJCVe4eAoeE,151405
6
- dataframe_textual/data_frame_viewer.py,sha256=aUjIk9BWYKyMG87PirFxR79iNLzkEcZ-I5XVnXwDEnU,23284
7
- dataframe_textual/sql_screen.py,sha256=P3j1Fv45NIKEYo9adb7NPod54FaU-djFIvCUMMHbvjY,7534
8
- dataframe_textual/table_screen.py,sha256=XPzJI6FXjwnxtQSMTmluygwkYM-0-Lx3v9o-MuL6bMg,19071
9
- dataframe_textual/yes_no_screen.py,sha256=NI7Zt3rETDWYiT5CH_FDy7sIWkZ7d7LquaZZbX79b2g,26400
10
- dataframe_textual-2.4.1.dist-info/METADATA,sha256=Jj-BukRTx4rrxFOD1c79kS7saUiIziHe7pNPAK_dnvI,29482
11
- dataframe_textual-2.4.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
12
- dataframe_textual-2.4.1.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
13
- dataframe_textual-2.4.1.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
14
- dataframe_textual-2.4.1.dist-info/RECORD,,