dataframe-textual 2.6.0__py3-none-any.whl → 2.7.0__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.
@@ -51,15 +51,34 @@ def cli() -> argparse.Namespace:
51
51
  )
52
52
  parser.add_argument("-E", "--ignore-errors", action="store_true", help="Ignore errors when reading CSV/TSV")
53
53
  parser.add_argument(
54
- "-c", "--comment-prefix", nargs="?", const="#", help="Comment lines are skipped when reading CSV/TSV"
54
+ "-c",
55
+ "--comment-prefix",
56
+ metavar="PREFIX",
57
+ nargs="?",
58
+ const="#",
59
+ help="Comment lines starting with `PREFIX` are skipped when reading CSV/TSV",
55
60
  )
56
61
  parser.add_argument(
57
- "-q", "--quote-char", nargs="?", const=None, default='"', help="Quote character for reading CSV/TSV"
62
+ "-q",
63
+ "--quote-char",
64
+ metavar="C",
65
+ nargs="?",
66
+ const=None,
67
+ default='"',
68
+ help="Use `C` as quote character for reading CSV/TSV",
58
69
  )
59
- parser.add_argument("-l", "--skip-lines", type=int, default=0, help="Skip lines when reading CSV/TSV")
60
70
  parser.add_argument(
61
- "-a", "--skip-rows-after-header", type=int, default=0, help="Skip rows after header when reading CSV/TSV"
71
+ "-L", "--skip-lines", metavar="N", type=int, default=0, help="Skip first N lines when reading CSV/TSV"
62
72
  )
73
+ parser.add_argument(
74
+ "-A",
75
+ "--skip-rows-after-header",
76
+ metavar="N",
77
+ type=int,
78
+ default=0,
79
+ help="Skip N rows after header when reading CSV/TSV",
80
+ )
81
+ parser.add_argument("-N", "--n-rows", metavar="N", type=int, help="Stop after reading N rows from CSV/TSV")
63
82
  parser.add_argument("-n", "--null", nargs="+", help="Values to interpret as null values when reading CSV/TSV")
64
83
 
65
84
  args = parser.parse_args()
@@ -98,6 +117,7 @@ def main() -> None:
98
117
  null_values=args.null,
99
118
  ignore_errors=args.ignore_errors,
100
119
  truncate_ragged_lines=args.truncate_ragged_lines,
120
+ n_rows=args.n_rows,
101
121
  )
102
122
  app = DataFrameViewer(*sources)
103
123
  app.run()
@@ -485,6 +485,7 @@ def load_dataframe(
485
485
  null_values: list[str] | None = None,
486
486
  ignore_errors: bool = False,
487
487
  truncate_ragged_lines: bool = False,
488
+ n_rows: int | None = None,
488
489
  ) -> list[Source]:
489
490
  """Load DataFrames from file specifications.
490
491
 
@@ -502,6 +503,8 @@ def load_dataframe(
502
503
  skip_rows_after_header: Number of rows to skip after header. Defaults to 0.
503
504
  null_values: List of values to interpret as null when reading CSV/TSV files. Defaults to None.
504
505
  ignore_errors: Whether to ignore errors when reading CSV/TSV files. Defaults to False.
506
+ truncate_ragged_lines: Whether to truncate ragged lines when reading CSV/TSV files. Defaults to False.
507
+ n_rows: Number of rows to read from CSV/TSV files. Defaults to None (read all rows).
505
508
 
506
509
  Returns:
507
510
  List of `Source` objects.
@@ -551,6 +554,7 @@ def load_dataframe(
551
554
  null_values=null_values,
552
555
  ignore_errors=ignore_errors,
553
556
  truncate_ragged_lines=truncate_ragged_lines,
557
+ n_rows=n_rows,
554
558
  )
555
559
  )
556
560
 
@@ -635,6 +639,7 @@ def load_file(
635
639
  null_values: list[str] | None = None,
636
640
  ignore_errors: bool = False,
637
641
  truncate_ragged_lines: bool = False,
642
+ n_rows: int | None = None,
638
643
  ) -> list[Source]:
639
644
  """Load a single file.
640
645
 
@@ -660,6 +665,8 @@ def load_file(
660
665
  schema_overrides: Optional dictionary of column name to Polars data type to override inferred schema.
661
666
  null_values: List of values to interpret as null when reading CSV/TSV files. Defaults to None.
662
667
  ignore_errors: Whether to ignore errors when reading CSV/TSV files.
668
+ truncate_ragged_lines: Whether to truncate ragged lines when reading CSV/TSV files. Defaults to False.
669
+ n_rows: Number of rows to read from CSV/TSV files. Defaults to None (read all rows).
663
670
 
664
671
  Returns:
665
672
  List of `Source` objects.
@@ -684,6 +691,7 @@ def load_file(
684
691
  null_values=null_values,
685
692
  ignore_errors=ignore_errors,
686
693
  truncate_ragged_lines=truncate_ragged_lines,
694
+ n_rows=n_rows,
687
695
  )
688
696
  data.append(Source(lf, filename, filepath.stem))
689
697
  elif file_format in ("xlsx", "xls"):
@@ -740,6 +748,8 @@ def load_file(
740
748
  schema_overrides=schema_overrides,
741
749
  null_values=null_values,
742
750
  ignore_errors=ignore_errors,
751
+ truncate_ragged_lines=truncate_ragged_lines,
752
+ n_rows=n_rows,
743
753
  )
744
754
 
745
755
  return data
@@ -1755,13 +1755,14 @@ class DataFrameTable(DataTable):
1755
1755
  max_width = label_width
1756
1756
 
1757
1757
  # Scan through all loaded rows that are visible to find max width
1758
- for row_idx in range(self.loaded_rows):
1759
- cell_value = str(self.df.item(row_idx, col_idx))
1760
- cell_width = measure(self.app.console, cell_value, 1)
1758
+ for row_start, row_end in self.loaded_ranges:
1759
+ for row_idx in range(row_start, row_end):
1760
+ cell_value = str(self.df.item(row_idx, col_idx))
1761
+ cell_width = measure(self.app.console, cell_value, 1)
1761
1762
 
1762
- if cell_width > max_width:
1763
- need_expand = True
1764
- max_width = max(max_width, cell_width)
1763
+ if cell_width > max_width:
1764
+ need_expand = True
1765
+ max_width = cell_width
1765
1766
 
1766
1767
  if not need_expand:
1767
1768
  return
@@ -2198,9 +2199,8 @@ class DataFrameTable(DataTable):
2198
2199
 
2199
2200
  # Also update the view if applicable
2200
2201
  if self.df_view is not None:
2201
- self.df_view = self.df_view.with_columns(
2202
- pl.when(pl.col(col_name) == value).then(pl.lit(None)).otherwise(pl.col(col_name)).alias(col_name)
2203
- )
2202
+ lf_updated = self.df.lazy().select(RID, pl.col(col_name))
2203
+ self.df_view = self.df_view.lazy().update(lf_updated, on=RID, include_nulls=True).collect()
2204
2204
 
2205
2205
  # Recreate table for display
2206
2206
  self.setup_table()
@@ -2997,10 +2997,10 @@ class DataFrameTable(DataTable):
2997
2997
  # self.notify("No selections to clear", title="Clear Selections and Matches", severity="warning")
2998
2998
  return
2999
2999
 
3000
- row_count = len(self.selected_rows | set(self.matches.keys()))
3000
+ # row_count = len(self.selected_rows | set(self.matches.keys()))
3001
3001
 
3002
3002
  # Add to history
3003
- self.add_history("Cleared all selected rows")
3003
+ self.add_history("Cleared all selections and matches")
3004
3004
 
3005
3005
  # Clear all selections
3006
3006
  self.selected_rows = set()
@@ -3009,7 +3009,7 @@ class DataFrameTable(DataTable):
3009
3009
  # Recreate table for display
3010
3010
  self.setup_table()
3011
3011
 
3012
- self.notify(f"Cleared selections for [$success]{row_count}[/] rows", title="Clear Selections and Matches")
3012
+ # self.notify(f"Cleared selections for [$success]{row_count}[/] rows", title="Clear Selections and Matches")
3013
3013
 
3014
3014
  # Find & Replace
3015
3015
  def find_matches(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframe-textual
3
- Version: 2.6.0
3
+ Version: 2.7.0
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
@@ -184,14 +184,15 @@ options:
184
184
  -t, --truncate-ragged-lines
185
185
  Truncate ragged lines when reading CSV/TSV
186
186
  -E, --ignore-errors Ignore errors when reading CSV/TSV
187
- -c, --comment-prefix [COMMENT_PREFIX]
188
- Comment lines are skipped when reading CSV/TSV
189
- -q, --quote-char [QUOTE_CHAR]
190
- Quote character for reading CSV/TSV
191
- -l, --skip-lines SKIP_LINES
192
- Skip lines when reading CSV/TSV
193
- -a, --skip-rows-after-header SKIP_ROWS_AFTER_HEADER
194
- Skip rows after header when reading CSV/TSV
187
+ -c, --comment-prefix [PREFIX]
188
+ Comment lines starting with `PREFIX` are skipped when reading CSV/TSV
189
+ -q, --quote-char [C]
190
+ Use `C` as quote character for reading CSV/TSV
191
+ -L, --skip-lines N
192
+ Skip first N lines when reading CSV/TSV
193
+ -A, --skip-rows-after-header N
194
+ Skip N rows after header when reading CSV/TSV
195
+ -N, --n-rows N Stop after reading N rows from CSV/TSV
195
196
  -n, --null NULL [NULL ...]
196
197
  Values to interpret as null values when reading CSV/TSV
197
198
  ```
@@ -1,14 +1,14 @@
1
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
2
+ dataframe_textual/__main__.py,sha256=tJ6FjjV25ZQzaMdqD5XcDVRZfj8l6kgGvXyrn975rjo,3999
3
+ dataframe_textual/common.py,sha256=CNRdHP3N1li2dy9OsTiW-zfpzf8zcrt2fW8mmYY-YVA,29073
4
4
  dataframe_textual/data_frame_help_panel.py,sha256=UEtj64XsVRdtLzuwOaITfoEQUkAfwFuvpr5Npip5WHs,3381
5
- dataframe_textual/data_frame_table.py,sha256=DwAOhuXeu3ZW82GTE8pYsAI5QXjqZ-IulwaRJLGJSC8,147733
5
+ dataframe_textual/data_frame_table.py,sha256=IjsFc7aJJMAhfdf-898cTCMeDBvtnnDeRRV4cIdZQXY,147806
6
6
  dataframe_textual/data_frame_viewer.py,sha256=_VwbCcRBgdTcrZmgS2mRwIJ-cFxOeJ55twDFvQUHMfk,28723
7
7
  dataframe_textual/sql_screen.py,sha256=P3j1Fv45NIKEYo9adb7NPod54FaU-djFIvCUMMHbvjY,7534
8
8
  dataframe_textual/table_screen.py,sha256=XPzJI6FXjwnxtQSMTmluygwkYM-0-Lx3v9o-MuL6bMg,19071
9
9
  dataframe_textual/yes_no_screen.py,sha256=NI7Zt3rETDWYiT5CH_FDy7sIWkZ7d7LquaZZbX79b2g,26400
10
- dataframe_textual-2.6.0.dist-info/METADATA,sha256=Acv3XFju3na9yBqWynLq_4nQ0jXnU0U1dO-U78rzZCE,29494
11
- dataframe_textual-2.6.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
12
- dataframe_textual-2.6.0.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
13
- dataframe_textual-2.6.0.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
14
- dataframe_textual-2.6.0.dist-info/RECORD,,
10
+ dataframe_textual-2.7.0.dist-info/METADATA,sha256=x5HmSx1U443HzBmNdKt0W3raGzcVTXFR4uaJXbKqKbE,29554
11
+ dataframe_textual-2.7.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
12
+ dataframe_textual-2.7.0.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
13
+ dataframe_textual-2.7.0.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
14
+ dataframe_textual-2.7.0.dist-info/RECORD,,