dataframe-textual 2.7.0__tar.gz → 2.8.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 (19) hide show
  1. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/PKG-INFO +2 -1
  2. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/README.md +1 -0
  3. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/pyproject.toml +1 -1
  4. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/data_frame_table.py +20 -5
  5. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/uv.lock +1 -1
  6. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/.gitignore +0 -0
  7. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/1811.csv.gz +0 -0
  8. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/LICENSE +0 -0
  9. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/glycosmos_glycans_list.csv.gz +0 -0
  10. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/large_malformed.tsv.gz +0 -0
  11. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/main.py +0 -0
  12. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/__init__.py +0 -0
  13. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/__main__.py +0 -0
  14. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/common.py +0 -0
  15. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/data_frame_help_panel.py +0 -0
  16. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/data_frame_viewer.py +0 -0
  17. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/sql_screen.py +0 -0
  18. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/table_screen.py +0 -0
  19. {dataframe_textual-2.7.0 → dataframe_textual-2.8.0}/src/dataframe_textual/yes_no_screen.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframe-textual
3
- Version: 2.7.0
3
+ Version: 2.8.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
@@ -358,6 +358,7 @@ zcat compressed_data.csv.gz | dv -f csv
358
358
  | Key | Action |
359
359
  |-----|--------|
360
360
  | `"` (quote) | Filter selected rows (others removed) |
361
+ | `.` | View rows with non-null values in current column (others hidden) |
361
362
  | `v` | View selected rows (others hidden) |
362
363
  | `V` | View selected by expression (others hidden) |
363
364
 
@@ -319,6 +319,7 @@ zcat compressed_data.csv.gz | dv -f csv
319
319
  | Key | Action |
320
320
  |-----|--------|
321
321
  | `"` (quote) | Filter selected rows (others removed) |
322
+ | `.` | View rows with non-null values in current column (others hidden) |
322
323
  | `v` | View selected rows (others hidden) |
323
324
  | `V` | View selected by expression (others hidden) |
324
325
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dataframe-textual"
7
- version = "2.7.0"
7
+ version = "2.8.0"
8
8
  description = "Interactive terminal viewer/editor for tabular data"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -188,9 +188,10 @@ class DataFrameTable(DataTable):
188
188
  - *(Supports case-insensitive & whole-word matching)*
189
189
 
190
190
  ## 👁️ View & Filter
191
- - **"** - 📍 Filter selected rows (removes others)
192
- - **v** - 👁️ View selected rows (hides others)
193
- - **V** - 🔧 View selected rows matching expression (hides others)
191
+ - **"** - 📍 Filter selected rows (others removed)
192
+ - **.** - 👁️ View rows with non-null values in current column (others hidden)
193
+ - **v** - 👁️ View selected rows (others hidden)
194
+ - **V** - 🔧 View selected rows matching expression (others hidden)
194
195
 
195
196
  ## 🔍 SQL Interface
196
197
  - **l** - 💬 Open simple SQL interface (select columns & where clause)
@@ -264,6 +265,7 @@ class DataFrameTable(DataTable):
264
265
  ("left_square_bracket", "sort_ascending", "Sort ascending"), # `[`
265
266
  ("right_square_bracket", "sort_descending", "Sort descending"), # `]`
266
267
  # View & Filter
268
+ ("full_stop", "view_rows_non_null", "View rows with non-null values in current column"),
267
269
  ("v", "view_rows", "View selected rows"),
268
270
  ("V", "view_rows_expr", "View selected rows matching expression"),
269
271
  ("quotation_mark", "filter_rows", "Filter selected rows"), # `"`
@@ -761,6 +763,10 @@ class DataFrameTable(DataTable):
761
763
  """Show metadata for the current column."""
762
764
  self.do_metadata_column()
763
765
 
766
+ def action_view_rows_non_null(self) -> None:
767
+ """View rows with non-null values in the current column."""
768
+ self.do_view_rows_non_null()
769
+
764
770
  def action_view_rows(self) -> None:
765
771
  """View rows by current cell value."""
766
772
  self.do_view_rows()
@@ -3603,6 +3609,15 @@ class DataFrameTable(DataTable):
3603
3609
  self.show_next_replace_confirmation()
3604
3610
 
3605
3611
  # View & Filter
3612
+ def do_view_rows_non_null(self) -> None:
3613
+ """View non-null rows based on the cursor column."""
3614
+ cidx = self.cursor_col_idx
3615
+ col_name = self.cursor_col_name
3616
+
3617
+ term = pl.col(col_name).is_not_null()
3618
+
3619
+ self.view_rows((term, cidx, False, True))
3620
+
3606
3621
  def do_view_rows(self) -> None:
3607
3622
  """View rows.
3608
3623
 
@@ -3712,7 +3727,7 @@ class DataFrameTable(DataTable):
3712
3727
  return
3713
3728
 
3714
3729
  # Add to history
3715
- self.add_history(f"Filtered by expression [$success]{expr_str}[/]")
3730
+ self.add_history(f"Viewed rows by expression [$success]{expr_str}[/]")
3716
3731
 
3717
3732
  ok_rids = set(df_filtered[RID])
3718
3733
 
@@ -3734,7 +3749,7 @@ class DataFrameTable(DataTable):
3734
3749
  # Recreate table for display
3735
3750
  self.setup_table()
3736
3751
 
3737
- self.notify(f"Filtered to [$success]{matched_count}[/] matching row(s)", title="View Rows")
3752
+ self.notify(f"Showing [$success]{matched_count}[/] matching row(s)", title="View Rows")
3738
3753
 
3739
3754
  def do_filter_rows(self) -> None:
3740
3755
  """Filter rows.
@@ -171,7 +171,7 @@ wheels = [
171
171
 
172
172
  [[package]]
173
173
  name = "dataframe-textual"
174
- version = "2.7.0"
174
+ version = "2.8.0"
175
175
  source = { editable = "." }
176
176
  dependencies = [
177
177
  { name = "polars" },