Skip to content

Commit 3977cd3

Browse files
authored
Merge branch 'main' into orjson_werkzeug
2 parents 355fbec + 38ea31c commit 3977cd3

File tree

5 files changed

+74
-11
lines changed

5 files changed

+74
-11
lines changed

.github/workflows/deploy-docs.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ jobs:
1818
python-version: 3.8
1919

2020
- run: sudo apt-get install python3-sphinx
21-
- name: Install poetry
22-
uses: Gr1N/setup-poetry@v4
21+
- name: Install Poetry
22+
uses: snok/install-poetry@v1
2323
- name: Cache poetry
2424
id: cached-poetry-dependencies
2525
uses: actions/cache@v2

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ poetry build # build the underlying C code
8484
You can run the test with the following code:
8585

8686
```sh
87-
poetry run pytest --cov-report term-missing --cov=plotly-resampler tests
87+
poetry run pytest --cov-report term-missing --cov=plotly_resampler tests
8888
```
8989

9090
To get the selenium tests working you should have Google Chrome installed.

plotly_resampler/figure_resampler/figure_resampler_interface.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,23 @@ def _construct_hf_data_dict(
800800
"hovertext": dc.hovertext,
801801
}
802802

803+
@staticmethod
804+
def _add_trace_to_add_traces_kwargs(kwargs: dict) -> dict:
805+
"""Convert the `add_trace` kwargs to the `add_traces` kwargs."""
806+
# The keywords that need to be converted to a list
807+
convert_keywords = ["row", "col", "secondary_y"]
808+
809+
updated_kwargs = {} # The updated kwargs (from `add_trace` to `add_traces`)
810+
for keyword in convert_keywords:
811+
value = kwargs.pop(keyword, None)
812+
if value is not None:
813+
updated_kwargs[f"{keyword}s"] = [value]
814+
else:
815+
updated_kwargs[f"{keyword}s"] = None
816+
817+
return {**kwargs, **updated_kwargs}
818+
819+
803820
def add_trace(
804821
self,
805822
trace: Union[BaseTraceType, dict],
@@ -961,17 +978,22 @@ def add_trace(
961978
# Hence, you first downsample the trace.
962979
trace = self._check_update_trace_data(trace)
963980
assert trace is not None
964-
return super(self._figure_class, self).add_trace(trace, **trace_kwargs)
981+
return super(AbstractFigureAggregator, self).add_traces(
982+
[trace], **self._add_trace_to_add_traces_kwargs(trace_kwargs)
983+
)
965984
else:
966985
self._print(f"[i] NOT resampling {trace['name']} - len={n_samples}")
967986
# TODO: can be made more generic
968987
trace.x = dc.x
969988
trace.y = dc.y
970989
trace.text = dc.text
971990
trace.hovertext = dc.hovertext
972-
return super(self._figure_class, self).add_trace(trace, **trace_kwargs)
973-
974-
return super(self._figure_class, self).add_trace(trace, **trace_kwargs)
991+
return super(AbstractFigureAggregator, self).add_traces(
992+
[trace], **self._add_trace_to_add_traces_kwargs(trace_kwargs)
993+
)
994+
return super(AbstractFigureAggregator, self).add_traces(
995+
[trace], **self._add_trace_to_add_traces_kwargs(trace_kwargs)
996+
)
975997

976998
def add_traces(
977999
self,
@@ -1158,7 +1180,8 @@ def replace(self, figure: go.Figure, convert_existing_traces: bool = True):
11581180
)
11591181

11601182
def construct_update_data(
1161-
self, relayout_data: dict
1183+
self,
1184+
relayout_data: dict,
11621185
) -> Union[List[dict], dash.no_update]:
11631186
"""Construct the to-be-updated front-end data, based on the layout change.
11641187

tests/test_figure_resampler.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,18 @@ def test_various_dtypes(float_series):
139139
limit_to_view=True,
140140
)
141141

142+
def test_max_n_samples(float_series):
143+
s = float_series[:5000]
144+
145+
fig = FigureResampler()
146+
fig.add_trace(
147+
go.Scattergl(name="test"), hf_x=s.index, hf_y=s, max_n_samples=len(s) + 1
148+
)
149+
# make sure that there is not hf_data
150+
assert len(fig.hf_data) == 0
151+
assert len(fig.data[0]["x"]) == len(s)
152+
153+
142154
def test_add_scatter_trace_no_data():
143155
fig = FigureResampler(default_n_shown_samples=1000)
144156

@@ -1082,7 +1094,7 @@ def test_fr_update_layout_axes_range(driver):
10821094
y=np.arange(nb_datapoints)
10831095
)
10841096

1085-
def check_data(fr: FigureResampler, min_v=0, max_v=nb_datapoints-1):
1097+
def check_data(fr: FigureResampler, min_v=0, max_v=nb_datapoints - 1):
10861098
# closure for n_shown and nb_datapoints
10871099
assert len(fr.data[0]["y"]) == min(n_shown, nb_datapoints)
10881100
assert len(fr.data[0]["x"]) == min(n_shown, nb_datapoints)
@@ -1158,7 +1170,7 @@ def check_data(fr: FigureResampler, min_v=0, max_v=nb_datapoints-1):
11581170
finally:
11591171
proc.terminate()
11601172
f_pr.stop_server()
1161-
1173+
11621174

11631175
def test_fr_update_layout_axes_range_no_update(driver):
11641176
nb_datapoints = 2_000
@@ -1170,7 +1182,7 @@ def test_fr_update_layout_axes_range_no_update(driver):
11701182
y=np.arange(nb_datapoints)
11711183
)
11721184

1173-
def check_data(fr: FigureResampler, min_v=0, max_v=nb_datapoints-1):
1185+
def check_data(fr: FigureResampler, min_v=0, max_v=nb_datapoints - 1):
11741186
# closure for n_shown and nb_datapoints
11751187
assert len(fr.data[0]["y"]) == min(n_shown, nb_datapoints)
11761188
assert len(fr.data[0]["x"]) == min(n_shown, nb_datapoints)

tests/test_figure_resampler_selenium.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,3 +657,31 @@ def test_multi_trace_go_figure(driver, multi_trace_go_figure):
657657
raise e
658658
finally:
659659
proc.terminate()
660+
661+
662+
def test_multi_trace_go_figure_updated_xrange(driver, multi_trace_go_figure):
663+
# This test checks that the xaxis range is updated when the xaxis range is set
664+
# Notet hat this test just hits the .show_dash() method
665+
from pytest_cov.embed import cleanup_on_sigterm
666+
667+
cleanup_on_sigterm()
668+
669+
multi_trace_go_figure.update_xaxes(range=[100, 200_000])
670+
671+
port = 9038
672+
proc = multiprocessing.Process(
673+
target=multi_trace_go_figure.show_dash,
674+
kwargs=dict(mode="external", port=port),
675+
)
676+
proc.start()
677+
try:
678+
# Just hit the code of the .show_dash method when an x-range is set
679+
time.sleep(1)
680+
fr = FigureResamplerGUITests(driver, port=port)
681+
time.sleep(1)
682+
fr.go_to_page()
683+
684+
except Exception as e:
685+
raise e
686+
finally:
687+
proc.terminate()

0 commit comments

Comments
 (0)