diff --git a/CHANGES.rst b/CHANGES.rst index dc07f98f..3983faa7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,7 @@ ------------------ * Ability to create additional viewers. [#94] +* Updates to use jdaviz 3.9. [#68] 0.2.0 (02-26-2024) ------------------ diff --git a/docs/plugins.rst b/docs/plugins.rst index 60f5f24c..aae63e16 100644 --- a/docs/plugins.rst +++ b/docs/plugins.rst @@ -318,10 +318,10 @@ This plugin supports binning a light curve in time or phase-space. * :meth:`lightkurve.LightCurve.bin` -.. _export-plot: +.. _export: -Export Plot -=========== +Export +====== This plugin allows exporting the plot in a given viewer to various image formats. @@ -329,7 +329,7 @@ This plugin allows exporting the plot in a given viewer to various image formats .. admonition:: User API Example :class: dropdown - See the :class:`~lcviz.plugins.export_plot.export_plot.ExportViewer` user API documentation for more details. + See the :class:`~lcviz.plugins.export.export.Export` user API documentation for more details. .. code-block:: python @@ -340,11 +340,11 @@ This plugin allows exporting the plot in a given viewer to various image formats lcviz.load_data(lc) lcviz.show() - export = lcviz.plugins['Export Plot'] - export.save_figure('test.png') + export = lcviz.plugins['Export'] + export.export('test.png') .. seealso:: :ref:`Jdaviz Export Plot ` - Jdaviz documentation on the Export Plot plugin. + Jdaviz documentation on the Export plugin. diff --git a/docs/reference/api_plugins.rst b/docs/reference/api_plugins.rst index a366d19a..56149ce7 100644 --- a/docs/reference/api_plugins.rst +++ b/docs/reference/api_plugins.rst @@ -9,7 +9,7 @@ Plugins API .. automodapi:: lcviz.plugins.ephemeris.ephemeris :no-inheritance-diagram: -.. automodapi:: lcviz.plugins.export_plot.export_plot +.. automodapi:: lcviz.plugins.export.export :no-inheritance-diagram: .. automodapi:: lcviz.plugins.flatten.flatten diff --git a/lcviz/helper.py b/lcviz/helper.py index 295d4477..ca34d032 100644 --- a/lcviz/helper.py +++ b/lcviz/helper.py @@ -66,11 +66,11 @@ class LCviz(ConfigHelper): 'tab_headers': True}, 'dense_toolbar': False, 'context': {'notebook': {'max_height': '600px'}}}, - 'toolbar': ['g-data-tools', 'g-subset-tools', 'lcviz-viewer-creator', 'lcviz-coords-info'], + 'toolbar': ['g-data-tools', 'g-subset-tools', 'g-viewer-creator', 'lcviz-coords-info'], 'tray': ['lcviz-metadata-viewer', 'flux-column', 'lcviz-plot-options', 'lcviz-subset-plugin', 'lcviz-markers', 'flatten', 'frequency-analysis', 'ephemeris', - 'binning', 'lcviz-export-plot'], + 'binning', 'lcviz-export'], 'viewer_area': [{'container': 'col', 'children': [{'container': 'row', 'viewers': [{'name': 'flux-vs-time', @@ -92,11 +92,7 @@ def __init__(self, *args, **kwargs): ) # inject custom css from lcviz_style.vue (on top of jdaviz styles) - if hasattr(self.app, '_add_style'): - # will be guaranteed after jdaviz 3.9 - self.app._add_style((__file__, 'lcviz_style.vue')) - else: - self.app.set_style_template_file((__file__, 'lcviz_style.vue')) + self.app._add_style((__file__, 'lcviz_style.vue')) # set the link to read the docs self.app.docs_link = "https://lcviz.readthedocs.io" diff --git a/lcviz/lcviz_style.vue b/lcviz/lcviz_style.vue index ecf6ee17..22ee9bb4 100644 --- a/lcviz/lcviz_style.vue +++ b/lcviz/lcviz_style.vue @@ -1,7 +1,3 @@ diff --git a/lcviz/plugins/__init__.py b/lcviz/plugins/__init__.py index 42ba1f17..9fbeef06 100644 --- a/lcviz/plugins/__init__.py +++ b/lcviz/plugins/__init__.py @@ -3,7 +3,7 @@ from .binning.binning import * # noqa from .ephemeris.ephemeris import * # noqa -from .export_plot.export_plot import * # noqa +from .export.export import * # noqa from .flatten.flatten import * # noqa from .flux_column.flux_column import * # noqa from .frequency_analysis.frequency_analysis import * # noqa diff --git a/lcviz/plugins/binning/binning.py b/lcviz/plugins/binning/binning.py index f2440404..75941833 100644 --- a/lcviz/plugins/binning/binning.py +++ b/lcviz/plugins/binning/binning.py @@ -1,7 +1,5 @@ -import numpy as np -from time import time from astropy.time import Time -from traitlets import Bool, Float, observe +from traitlets import Bool, observe from glue.config import data_translator from jdaviz.core.custom_traitlets import IntHandleEmpty @@ -10,7 +8,7 @@ from jdaviz.core.template_mixin import (PluginTemplateMixin, DatasetSelectMixin, AddResultsMixin, skip_if_no_updates_since_last_active, - with_spinner) + with_spinner, with_temp_disable) from jdaviz.core.user_api import PluginUserApi from lcviz.components import FluxColumnSelectMixin @@ -54,9 +52,6 @@ class Binning(PluginTemplateMixin, FluxColumnSelectMixin, DatasetSelectMixin, n_bins = IntHandleEmpty(100).tag(sync=True) bin_enabled = Bool(True).tag(sync=True) - last_live_time = Float(0).tag(sync=True) - previews_temp_disable = Bool(False).tag(sync=True) - def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -164,8 +159,9 @@ def _toggle_marks(self, event={}): @observe('flux_column_selected', 'dataset_selected', 'ephemeris_selected', - 'n_bins', 'previews_temp_disable') + 'n_bins', 'previews_temp_disabled') @skip_if_no_updates_since_last_active() + @with_temp_disable(timeout=0.3) def _live_update(self, event={}): self.bin_enabled = self.n_bins != '' and self.n_bins > 0 @@ -173,11 +169,6 @@ def _live_update(self, event={}): self._clear_marks() return - if self.previews_temp_disable: - return - - start = time() - if event.get('name', '') not in ('is_active', 'show_live_preview'): # mark visibility hasn't been handled yet self._toggle_marks() @@ -214,10 +205,6 @@ def _live_update(self, event={}): mark.times = [] mark.update_xy(times, lc.flux.value) - self.last_live_time = np.round(time() - start, 2) - if self.last_live_time > 0.3: - self.previews_temp_disable = True - def _on_ephemeris_update(self, msg): if not self.show_live_preview or not self.is_active: return diff --git a/lcviz/plugins/binning/binning.vue b/lcviz/plugins/binning/binning.vue index c280da46..6bad2b59 100644 --- a/lcviz/plugins/binning/binning.vue +++ b/lcviz/plugins/binning/binning.vue @@ -57,23 +57,11 @@ - - Live-updating is temporarily disabled (last update took {{last_live_time}}s) - - - - disable previews - - - - - - - update preview - - - - + ` for more details. + See the :ref:`Export Plot Plugin Documentation ` for more details. Only the following attributes and methods are available through the :ref:`public plugin API `: @@ -15,10 +15,11 @@ class ExportViewer(ExportViewer): * :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.show` * :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.open_in_tray` * :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.close_in_tray` - * ``viewer`` (:class:`~jdaviz.core.template_mixin.ViewerSelect`): - Viewer to select for exporting the figure image. - * :meth:`save_figure` + * ``viewer`` (:class:`~jdaviz.core.template_mixin.ViewerSelect`) + * ``viewer_format`` (:class:`~jdaviz.core.template_mixin.SelectPluginComponent`) + * ``filename`` + * :meth:`export` """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.docs_link = f"https://lcviz.readthedocs.io/en/{self.vdocs}/plugins.html#export-plot" + self.docs_link = f"https://lcviz.readthedocs.io/en/{self.vdocs}/plugins.html#export" diff --git a/lcviz/plugins/export_plot/__init__.py b/lcviz/plugins/export_plot/__init__.py deleted file mode 100644 index dbcfe9b4..00000000 --- a/lcviz/plugins/export_plot/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .export_plot import * # noqa diff --git a/lcviz/plugins/flatten/flatten.py b/lcviz/plugins/flatten/flatten.py index 172ff904..35b2323f 100644 --- a/lcviz/plugins/flatten/flatten.py +++ b/lcviz/plugins/flatten/flatten.py @@ -1,7 +1,6 @@ import numpy as np -from time import time -from traitlets import Bool, Float, Unicode, observe +from traitlets import Bool, Unicode, observe from jdaviz.core.custom_traitlets import FloatHandleEmpty, IntHandleEmpty from jdaviz.core.events import ViewerAddedMessage @@ -10,7 +9,7 @@ DatasetSelectMixin, AutoTextField, skip_if_no_updates_since_last_active, - with_spinner) + with_spinner, with_temp_disable) from jdaviz.core.user_api import PluginUserApi from lcviz.components import FluxColumnSelectMixin @@ -70,9 +69,6 @@ class Flatten(PluginTemplateMixin, FluxColumnSelectMixin, DatasetSelectMixin): flux_label_invalid_msg = Unicode('').tag(sync=True) flux_label_overwrite = Bool(False).tag(sync=True) - last_live_time = Float(0).tag(sync=True) - previews_temp_disable = Bool(False).tag(sync=True) - def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -217,16 +213,14 @@ def _toggle_marks(self, event={}): @observe('dataset_selected', 'flux_column_selected', 'window_length', 'polyorder', 'break_tolerance', - 'niters', 'sigma', 'previews_temp_disable') + 'niters', 'sigma', 'previews_temp_disabled') @skip_if_no_updates_since_last_active() + @with_temp_disable(0.3) def _live_update(self, event={}): - if self.previews_temp_disable: - return if self.dataset_selected == '' or self.flux_column_selected == '': self._clear_marks() return - start = time() try: output_lc, trend_lc = self.flatten(add_data=False) except Exception as e: @@ -253,10 +247,6 @@ def _live_update(self, event={}): for mark in flattened_marks.values(): mark.update_ty(times.value, output_flux) - self.last_live_time = np.round(time() - start, 2) - if self.last_live_time > 0.3: - self.previews_temp_disable = True - def vue_apply(self, *args, **kwargs): try: self.flatten(add_data=True) diff --git a/lcviz/plugins/flatten/flatten.vue b/lcviz/plugins/flatten/flatten.vue index 191df121..be51f402 100644 --- a/lcviz/plugins/flatten/flatten.vue +++ b/lcviz/plugins/flatten/flatten.vue @@ -138,23 +138,12 @@ hint="Label for flux column." > - - Live-updating is temporarily disabled (last update took {{last_live_time}}s) - - - - disable previews - - - - - - - update preview - - - - + diff --git a/lcviz/plugins/viewer_creator/viewer_creator.py b/lcviz/plugins/viewer_creator/viewer_creator.py index d33a533e..69b29298 100644 --- a/lcviz/plugins/viewer_creator/viewer_creator.py +++ b/lcviz/plugins/viewer_creator/viewer_creator.py @@ -7,7 +7,8 @@ __all__ = ['ViewerCreator'] -@tool_registry('lcviz-viewer-creator') +# overwrite requires upstream changes, we can do without if we just lose the tooltip +@tool_registry('g-viewer-creator', overwrite=True) class ViewerCreator(ViewerCreator): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/lcviz/state.py b/lcviz/state.py index ddf393e2..fbab96c8 100644 --- a/lcviz/state.py +++ b/lcviz/state.py @@ -1,4 +1,3 @@ -from echo import delay_callback import numpy as np from glue.viewers.scatter.state import ScatterViewerState @@ -24,9 +23,10 @@ def _reset_att_limits(self, ax): if not np.all(np.isfinite([ax_min, ax_max])): # pragma: no cover return - with delay_callback(self, f'{ax}_min', f'{ax}_max'): - setattr(self, f'{ax}_min', ax_min) - setattr(self, f'{ax}_max', ax_max) + lim_helper = getattr(self, f'{ax}_lim_helper') + lim_helper.lower = ax_min + lim_helper.upper = ax_max + lim_helper.update_values() def _reset_x_limits(self, *event): self._reset_att_limits('x') @@ -50,11 +50,15 @@ def reset_limits(self, *event): y_min = min(y_min, np.nanmin(y_data)) y_max = max(y_max, np.nanmax(y_data)) - with delay_callback(self, 'x_min', 'x_max', 'y_min', 'y_max'): - self.x_min = x_min - self.x_max = x_max - self.y_min = y_min - self.y_max = y_max - # We need to adjust the limits in here to avoid triggering all - # the update events then changing the limits again. - self._adjust_limits_aspect() + x_lim_helper = getattr(self, 'x_lim_helper') + x_lim_helper.lower = x_min + x_lim_helper.upper = x_max + + y_lim_helper = getattr(self, 'y_lim_helper') + y_lim_helper.lower = y_min + y_lim_helper.upper = y_max + + x_lim_helper.update_values() + y_lim_helper.update_values() + + self._adjust_limits_aspect() diff --git a/lcviz/tests/test_plugin_ephemeris.py b/lcviz/tests/test_plugin_ephemeris.py index dea97b68..ac01e755 100644 --- a/lcviz/tests/test_plugin_ephemeris.py +++ b/lcviz/tests/test_plugin_ephemeris.py @@ -1,8 +1,4 @@ import pytest -from packaging.version import Version - -import jdaviz -JDAVIZ_LT_3_9_0 = Version(jdaviz.__version__) < Version('3.9.0') def test_docs_snippets(helper, light_curve_like_kepler_quarter): @@ -49,13 +45,12 @@ def test_plugin_ephemeris(helper, light_curve_like_kepler_quarter): assert len(ephem.ephemerides) == 2 assert 'custom component' in ephem.ephemerides - if not JDAVIZ_LT_3_9_0: - with pytest.raises(ValueError): - # brackets interfere with cloned viewer label logic - ephem.rename_component('custom component', 'custom component[blah]') - with pytest.raises(ValueError): - # colons interfere with viewer ephemeris logic - ephem.rename_component('custom component', 'custom component:blah') + with pytest.raises(ValueError): + # brackets interfere with cloned viewer label logic + ephem.rename_component('custom component', 'custom component[blah]') + with pytest.raises(ValueError): + # colons interfere with viewer ephemeris logic + ephem.rename_component('custom component', 'custom component:blah') ephem.rename_component('custom component', 'renamed custom component') assert len(ephem.ephemerides) == 2 @@ -116,7 +111,7 @@ def test_cloned_phase_viewer(helper, light_curve_like_kepler_quarter): def test_create_phase_viewer(helper, light_curve_like_kepler_quarter): helper.load_data(light_curve_like_kepler_quarter) ephem = helper.plugins['Ephemeris'] - vc = helper._tray_tools['lcviz-viewer-creator'] + vc = helper._tray_tools['g-viewer-creator'] assert len(vc.viewer_types) == 2 # time viewer, phase viewer for default _ = ephem.create_phase_viewer() diff --git a/lcviz/tests/test_tray_viewer_creator.py b/lcviz/tests/test_tray_viewer_creator.py index e2a6b835..b48fc5b2 100644 --- a/lcviz/tests/test_tray_viewer_creator.py +++ b/lcviz/tests/test_tray_viewer_creator.py @@ -1,7 +1,7 @@ def test_tray_viewer_creator(helper, light_curve_like_kepler_quarter): # additional coverage in test_plugin_ephemeris helper.load_data(light_curve_like_kepler_quarter) - vc = helper._tray_tools['lcviz-viewer-creator'] + vc = helper._tray_tools['g-viewer-creator'] assert len(helper.viewers) == 1 assert len(vc.viewer_types) == 2 # time and default phase diff --git a/lcviz/tools.py b/lcviz/tools.py index badb5aa2..e2b8e155 100644 --- a/lcviz/tools.py +++ b/lcviz/tools.py @@ -9,7 +9,7 @@ # point to the lcviz-version of plot options instead of jdaviz's SidebarShortcutPlotOptions.plugin_name = 'lcviz-plot-options' -SidebarShortcutExportPlot.plugin_name = 'lcviz-export-plot' +SidebarShortcutExportPlot.plugin_name = 'lcviz-export' __all__ = ['ViewerClone'] diff --git a/pyproject.toml b/pyproject.toml index 0f9907e6..a974fdce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ dependencies = [ "astropy>=5.2", # NOTE: if/when we stop pinning a minor version of jdaviz, add jdaviz # to devdeps in tox.ini - "jdaviz==3.8.*", + "jdaviz==3.9.*", "lightkurve>=2.4.1", ] dynamic = [