Skip to content

data explorer: "Copy as Code" comms #8536

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 29 commits into from
Jul 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
02a2c28
make action and button
isabelizimm Jul 2, 2025
dc9ef57
Merge branch 'main' into export-to-code
isabelizimm Jul 8, 2025
6f502e0
plumb through comms
isabelizimm Jul 9, 2025
dcf380b
export -> copy
isabelizimm Jul 10, 2025
32eb2c0
add modal on filter bar
isabelizimm Jul 11, 2025
f9a2c01
ui updates
isabelizimm Jul 14, 2025
2b9f962
make calls from modal
isabelizimm Jul 15, 2025
5083889
clean up comms
isabelizimm Jul 15, 2025
5be588b
clean up modal
isabelizimm Jul 15, 2025
d59fd66
linting for python
isabelizimm Jul 15, 2025
cc2d069
nit to modal
isabelizimm Jul 15, 2025
bae6ced
Merge branch 'export-as-code-comms' into copy-as-code-comms
isabelizimm Jul 15, 2025
4d624bc
updates from copilot
isabelizimm Jul 15, 2025
ac12c66
nit
isabelizimm Jul 15, 2025
0d6e7d9
cleanup
isabelizimm Jul 15, 2025
c33df7c
updates from review
isabelizimm Jul 16, 2025
45cd402
guess syntax immediately
isabelizimm Jul 16, 2025
1adfc02
reorder guessing
isabelizimm Jul 16, 2025
7a0d40b
no undefined for guessing
isabelizimm Jul 16, 2025
9cbe02a
python lint
isabelizimm Jul 17, 2025
51893f0
Update positron/comms/data_explorer-backend-openrpc.json
isabelizimm Jul 17, 2025
9517202
rename, early exits
isabelizimm Jul 17, 2025
36bf5f5
use supported feature flag for syntaxes
isabelizimm Jul 17, 2025
da70e52
refactor
isabelizimm Jul 17, 2025
b6bbe5c
clean up comm names
isabelizimm Jul 17, 2025
ccd15c4
updates from review
isabelizimm Jul 18, 2025
0cc6f14
tweaks to runtime
isabelizimm Jul 18, 2025
0c0ffac
Merge branch 'main' into copy-as-code-comms
isabelizimm Jul 18, 2025
a85ef9f
lint post merge from main
isabelizimm Jul 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from .data_explorer_comm import (
ArraySelection,
BackendState,
CodeSyntaxName,
ColumnDisplayType,
ColumnFilter,
ColumnFilterType,
Expand All @@ -45,6 +46,9 @@
ColumnSortKey,
ColumnSummaryStats,
ColumnValue,
ConvertedCode,
ConvertToCodeFeatures,
ConvertToCodeRequest,
DataExplorerBackendMessageContent,
DataExplorerFrontendEvent,
DataSelectionCellRange,
Expand Down Expand Up @@ -81,6 +85,7 @@
SetRowFiltersParams,
SetSortColumnsFeatures,
SetSortColumnsParams,
SuggestCodeSyntaxRequest,
SummaryStatsBoolean,
SummaryStatsDate,
SummaryStatsDatetime,
Expand Down Expand Up @@ -281,6 +286,12 @@ def get_schema(self, params: GetSchemaParams):
def _get_single_column_schema(self, column_index: int) -> ColumnSchema:
raise NotImplementedError

def suggest_code_syntax(self, request: SuggestCodeSyntaxRequest):
raise NotImplementedError

def convert_to_code(self, request: ConvertToCodeRequest):
raise NotImplementedError

def search_schema(self, params: SearchSchemaParams):
filters = params.filters
start_index = params.start_index
Expand Down Expand Up @@ -804,6 +815,13 @@ def _prof_histogram(
support_status=SupportStatus.Unsupported,
supported_formats=[],
),
convert_to_code=ConvertToCodeFeatures(
support_status=SupportStatus.Supported,
code_syntaxes=[
CodeSyntaxName(code_syntax_name="pandas"),
CodeSyntaxName(code_syntax_name="polars"),
],
),
)


Expand Down Expand Up @@ -1350,6 +1368,16 @@ def schema_getter(column_name, column_index):

return schema_updated, new_state

def suggest_code_syntax(self, request: SuggestCodeSyntaxRequest): # noqa: ARG002
"""Returns the supported code types for exporting data."""
return CodeSyntaxName(code_syntax_name="pandas").dict()

def convert_to_code(self, request: ConvertToCodeRequest): # noqa: ARG002
"""Translates the current data view, including filters and sorts, into a code snippet."""
return ConvertedCode(
converted_code=["import pandas as pd", "# TODO: Implement export to code"]
).dict()

@classmethod
def _construct_schema(
cls, column, column_name, column_index: int, state: DataExplorerState
Expand Down Expand Up @@ -1911,6 +1939,10 @@ def _prof_histogram(
ExportFormat.Html,
],
),
convert_to_code=ConvertToCodeFeatures(
support_status=SupportStatus.Supported,
code_syntaxes=[CodeSyntaxName(code_syntax_name="pandas")],
),
)


Expand Down Expand Up @@ -2280,6 +2312,16 @@ def schema_getter(column_name, column_index):

return schema_updated, new_state

def suggest_code_syntax(self, request: SuggestCodeSyntaxRequest): # noqa: ARG002
"""Returns the supported code types for exporting data."""
return CodeSyntaxName(code_syntax_name="polars").dict()

def convert_to_code(self, request: ConvertToCodeRequest): # noqa: ARG002
"""Translates the current data view, including filters and sorts, into a code snippet."""
return ConvertedCode(
converted_code=["import polars as pl", "# TODO: Implement export to code"]
).dict()

def _get_single_column_schema(self, column_index: int):
if self.state.schema_cache:
return self.state.schema_cache[column_index]
Expand Down Expand Up @@ -2762,6 +2804,10 @@ def _prof_histogram(
supported_formats=[ExportFormat.Csv, ExportFormat.Tsv],
),
set_sort_columns=SetSortColumnsFeatures(support_status=SupportStatus.Supported),
convert_to_code=ConvertToCodeFeatures(
support_status=SupportStatus.Supported,
code_syntaxes=[CodeSyntaxName(code_syntax_name="polars")],
),
)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,26 @@ class ExportedData(BaseModel):
)


class ConvertedCode(BaseModel):
"""
Code snippet for the data view
"""

converted_code: List[StrictStr] = Field(
description="Lines of code that implement filters and sort keys",
)


class CodeSyntaxName(BaseModel):
"""
Syntax to use for code conversion
"""

code_syntax_name: StrictStr = Field(
description="The name of the code syntax, eg, pandas, polars, dplyr, etc.",
)


class FilterResult(BaseModel):
"""
The result of applying filters to a table
Expand Down Expand Up @@ -972,6 +992,10 @@ class SupportedFeatures(BaseModel):
description="Support for 'export_data_selection' RPC and its features",
)

convert_to_code: ConvertToCodeFeatures = Field(
description="Support for 'convert_to_code' RPC and its features",
)


class SearchSchemaFeatures(BaseModel):
"""
Expand Down Expand Up @@ -1057,6 +1081,21 @@ class SetSortColumnsFeatures(BaseModel):
)


class ConvertToCodeFeatures(BaseModel):
"""
Feature flags for convert to code RPC
"""

support_status: SupportStatus = Field(
description="The support status for this RPC method",
)

code_syntaxes: Optional[List[CodeSyntaxName]] = Field(
default=None,
description="The syntaxes for converted code",
)


class TableSelection(BaseModel):
"""
A selection on the data grid, for copying to the clipboard or other
Expand Down Expand Up @@ -1208,6 +1247,12 @@ class DataExplorerBackendRequest(str, enum.Enum):
# Export data selection as a string in different formats
ExportDataSelection = "export_data_selection"

# Converts the current data view into a code snippet.
ConvertToCode = "convert_to_code"

# Suggest code syntax for code conversion
SuggestCodeSyntax = "suggest_code_syntax"

# Set column filters to select subset of table columns
SetColumnFilters = "set_column_filters"

Expand Down Expand Up @@ -1422,6 +1467,65 @@ class ExportDataSelectionRequest(BaseModel):
)


class ConvertToCodeParams(BaseModel):
"""
Converts filters and sort keys as code in different syntaxes like
pandas, polars, data.table, dplyr
"""

column_filters: List[ColumnFilter] = Field(
description="Zero or more column filters to apply",
)

row_filters: List[RowFilter] = Field(
description="Zero or more row filters to apply",
)

sort_keys: List[ColumnSortKey] = Field(
description="Zero or more sort keys to apply",
)

code_syntax_name: CodeSyntaxName = Field(
description="The code syntax to use for conversion",
)


class ConvertToCodeRequest(BaseModel):
"""
Converts filters and sort keys as code in different syntaxes like
pandas, polars, data.table, dplyr
"""

params: ConvertToCodeParams = Field(
description="Parameters to the ConvertToCode method",
)

method: Literal[DataExplorerBackendRequest.ConvertToCode] = Field(
description="The JSON-RPC method name (convert_to_code)",
)

jsonrpc: str = Field(
default="2.0",
description="The JSON-RPC version specifier",
)


class SuggestCodeSyntaxRequest(BaseModel):
"""
Suggest code syntax for code conversion based on the current backend
state
"""

method: Literal[DataExplorerBackendRequest.SuggestCodeSyntax] = Field(
description="The JSON-RPC method name (suggest_code_syntax)",
)

jsonrpc: str = Field(
default="2.0",
description="The JSON-RPC version specifier",
)


class SetColumnFiltersParams(BaseModel):
"""
Set or clear column filters on table, replacing any previous filters
Expand Down Expand Up @@ -1575,6 +1679,8 @@ class DataExplorerBackendMessageContent(BaseModel):
GetDataValuesRequest,
GetRowLabelsRequest,
ExportDataSelectionRequest,
ConvertToCodeRequest,
SuggestCodeSyntaxRequest,
SetColumnFiltersRequest,
SetRowFiltersRequest,
SetSortColumnsRequest,
Expand Down Expand Up @@ -1623,6 +1729,10 @@ class ReturnColumnProfilesParams(BaseModel):

ExportedData.update_forward_refs()

ConvertedCode.update_forward_refs()

CodeSyntaxName.update_forward_refs()

FilterResult.update_forward_refs()

BackendState.update_forward_refs()
Expand Down Expand Up @@ -1705,6 +1815,8 @@ class ReturnColumnProfilesParams(BaseModel):

SetSortColumnsFeatures.update_forward_refs()

ConvertToCodeFeatures.update_forward_refs()

TableSelection.update_forward_refs()

DataSelectionSingleCell.update_forward_refs()
Expand Down Expand Up @@ -1741,6 +1853,12 @@ class ReturnColumnProfilesParams(BaseModel):

ExportDataSelectionRequest.update_forward_refs()

ConvertToCodeParams.update_forward_refs()

ConvertToCodeRequest.update_forward_refs()

SuggestCodeSyntaxRequest.update_forward_refs()

SetColumnFiltersParams.update_forward_refs()

SetColumnFiltersRequest.update_forward_refs()
Expand Down
Loading
Loading