Repository navigation
Deduplicate the optional FigureWidget import in graph_objects codegen - #5850
DawnofGenX wants to merge 2 commits into
Conversation
camdecoster
left a comment
There was a problem hiding this comment.
Thanks for the update. Could you please make these changes?
There was a problem hiding this comment.
Could you please remove this test? It seems like overkill.
There was a problem hiding this comment.
Removed in 61bb49e. tests/test_core/test_figure_widget_backend/test_figurewidget_reexport.py is gone; the rest of the suite still passes (19 passed in tests/test_core/test_figure_widget_backend + tests/test_core/test_optional_imports).
There was a problem hiding this comment.
Could you please revert these changes? This is an internal update and doesn't need a changelog entry.
There was a problem hiding this comment.
Reverted in 61bb49e — CHANGELOG.md is back to upstream and no longer appears in the diff. One heads-up: the Check changelog workflow fails when a PR has no CHANGELOG change unless it carries the no-changelog label, and I can't add labels. Could you add it when you next look at this?
| @@ -307,6 +307,11 @@ def __getattr__(import_name): | |||
| "..graph_objs." + rel_path.split(".")[-1] | |||
| for rel_path in datatype_rel_class_imports[()] | |||
| ] | |||
| # FigureWidget is owned by graph_objs, which handles the optional | |||
| # ipywidgets import and the missing_* fallback. Re-export it from | |||
| # graph_objs like every other class instead of duplicating the optional | |||
| # import block in graph_objects. | |||
| graph_objects_rel_classes.append("..graph_objs.FigureWidget") | |||
There was a problem hiding this comment.
Let's simplify this a bit:
| graph_objects_rel_classes.append("..graph_objs.FigureWidget") | |
| graph_objects_rel_classes = [ | |
| *("..graph_objs." + rel_path.split(".")[-1] for rel_path in datatype_rel_class_imports[()]), | |
| # graph_objs owns the optional ipywidgets import and the fallback | |
| "..graph_objs.FigureWidget", | |
| ] |
There was a problem hiding this comment.
Applied in 61bb49e. ruff format --check (which CI runs over the whole repo) insists on wrapping the generator, so the committed form is:
graph_objects_rel_classes = [
*(
"..graph_objs." + rel_path.split(".")[-1]
for rel_path in datatype_rel_class_imports[()]
),
# graph_objs owns the optional ipywidgets import and the fallback
"..graph_objs.FigureWidget",
]Same thing as your suggestion, just formatter-stable. ruff format --check codegen/__init__.py and ruff check codegen/__init__.py both pass, and running python commands.py codegen is a no-op on the tree.
The code generator emitted the optional FigureWidget import block (try: import ipywidgets / missing_* fallback) into both plotly/graph_objs/__init__.py and plotly/graph_objects/__init__.py, producing an identical block at the end of each generated file. graph_objects already re-exports every other class from graph_objs (including Figure), and graph_objs owns the optional ipywidgets import and the missing_* fallback. Emit the block only for graph_objs and re-export FigureWidget from graph_objs in graph_objects like every other class. Behaviour is unchanged: plotly.graph_objects.FigureWidget still resolves to the real class when ipywidgets is present and to the missing_* fallback when it is absent. Add a regression test proving the invariant (identity, forced-failure fallback, and no duplicated ipywidgets block in graph_objects). Fixes plotly#5849
6e5184b to
ad6cb64
Compare
ad6cb64 to
61bb49e
Compare
|
All three review points are addressed in 61bb49e (rebased onto current
Verification on the pushed head:
One thing I can't do myself: the Could you take another look when you get a chance? |
Link to issue
Closes #5849
Description of change
The code generator wrote the optional
FigureWidgetimport block (thetry: import ...plus themissing_*fallback) into bothplotly/graph_objs/__init__.pyandplotly/graph_objects/__init__.py, leaving an identical block at the end of each generated file.graph_objectsre-exports every other class fromgraph_objs— includingFigure— andgraph_objsalready owns the optional import and the fallback, so the generator now emits the block only forgraph_objsand adds..graph_objs.FigureWidgettograph_objects' re-export list. The change is incodegen/__init__.py;plotly/graph_objects/__init__.pyis regenerated (python commands.py codegen), not hand-edited.Demo
N/A — no user-visible or visual change. Behaviour is unchanged:
plotly.graph_objects.FigureWidgetis the same object asplotly.graph_objs.FigureWidget, and still falls back toplotly.missing_anywidget.FigureWidgetwhenipywidgetsis unavailable.Testing strategy
Adds
tests/test_core/test_figure_widget_backend/test_figurewidget_reexport.py, which asserts the three invariants:graph_objects.FigureWidget is graph_objs.FigureWidget, the forced-ipywidgets-failure fallback still resolves, andplotly/graph_objects/__init__.pycontains no optional-ipywidgetsimport block of its own. The last assertion is the regression signal — it fails on unmodifiedmain.Additional information (optional)
Ran
python commands.py codegenon the committed tree with the pinned ruff and it produces no diff, so the generated file and the generator agree.Guidelines