Skip to content

Commit

Permalink
Merge pull request #722 from pllim/say-my-name-say-my-naaaaame
Browse files Browse the repository at this point in the history
Viewers now have human-readable IDs
  • Loading branch information
pllim authored Jul 14, 2021
2 parents 7603180 + 38e827b commit 915c3c9
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 22 deletions.
58 changes: 53 additions & 5 deletions jdaviz/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,12 @@ def get_viewer(self, viewer_reference):
"""
return self._viewer_by_reference(viewer_reference)

def get_viewer_by_id(self, vid):
"""Like :meth:`get_viewer` but use ID instead of reference name.
This is useful when reference name is `None`.
"""
return self._viewer_store[vid]

def get_data_from_viewer(self, viewer_reference, data_label=None,
cls='default', include_subsets=True):
"""
Expand Down Expand Up @@ -720,6 +726,35 @@ def _data_id_from_label(self, label):
if data_item['name'] == label:
return data_item['id']

def get_viewer_ids(self, prefix=None):
"""Return a list of available viewer IDs.
Parameters
----------
prefix : str or `None`
If not `None`, only return viewer IDs with given prefix
(case-sensitive). Otherwise, all viewer IDs are returned.
Returns
-------
vids : list of str
Sorted list of viewer IDs.
"""
all_keys = sorted(self._viewer_store.keys())

if isinstance(prefix, str):
vids = [k for k in all_keys if k.startswith(prefix)]
else:
vids = all_keys

return vids

def get_viewer_reference_names(self):
"""Return a list of available viewer reference names."""
# Cannot sort because of None
return [self._viewer_item_by_id(vid)['reference'] for vid in self._viewer_store]

def _viewer_by_id(self, vid):
"""
Viewer instance by id.
Expand Down Expand Up @@ -1034,8 +1069,17 @@ def _create_stack_item(container='gl-stack', children=None, viewers=None):
'children': children,
'viewers': viewers}

@staticmethod
def _create_viewer_item(viewer, name=None, reference=None):
def _next_viewer_num(self, prefix):
all_vids = self.get_viewer_ids(prefix=prefix)
if len(all_vids) == 0:
return 0

# Assume name-num format
last_vid = all_vids[-1]
last_num = int(last_vid.split('-')[-1])
return last_num + 1

def _create_viewer_item(self, viewer, name=None, reference=None):
"""
Convenience method for generating viewer item dictionaries.
Expand All @@ -1058,9 +1102,13 @@ def _create_viewer_item(viewer, name=None, reference=None):
tools.borderless = True
tools.tile = True

pfx = self.state.settings.get('configuration', str(name))
n = self._next_viewer_num(pfx)
vid = f"{pfx}-{n}"

return {
'id': str(uuid.uuid4()),
'name': name or "Unnamed Viewer",
'id': vid,
'name': name or vid,
'widget': "IPY_MODEL_" + viewer.figure_widget.model_id,
'tools': "IPY_MODEL_" + viewer.toolbar_selection_tools.model_id,
'layer_options': "IPY_MODEL_" + viewer.layer_options.model_id,
Expand Down Expand Up @@ -1095,7 +1143,7 @@ def _on_new_viewer(self, msg):

# Create the viewer item dictionary
new_viewer_item = self._create_viewer_item(
viewer=viewer)
viewer=viewer, name=viewer.__class__.__name__)

new_stack_item = self._create_stack_item(
container='gl-stack',
Expand Down
44 changes: 28 additions & 16 deletions jdaviz/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,41 @@
# get picked up when running the tests inside an interpreter using
# packagename.test

import numpy as np
import pytest

from astropy.wcs import WCS
from astropy import units as u
from astropy.nddata import StdDevUncertainty
import numpy as np
from astropy.wcs import WCS
from specutils import Spectrum1D
from jdaviz.configs.specviz.helper import SpecViz
from jdaviz.configs.imviz.helper import Imviz

from jdaviz import __version__, CubeViz, Imviz, MosViz, SpecViz, Specviz2d

SPECTRUM_SIZE = 10 # length of spectrum

from jdaviz import __version__

@pytest.fixture
def cubeviz_app():
return CubeViz()


@pytest.fixture
def imviz_app():
return Imviz()


@pytest.fixture
def mosviz_app():
return MosViz()


@pytest.fixture
def specviz_app():
return SpecViz()


@pytest.fixture
def specviz2d_app():
return Specviz2d()


@pytest.fixture
Expand All @@ -27,11 +49,6 @@ def spectral_cube_wcs(request):
return wcs


@pytest.fixture
def specviz_app():
return SpecViz()


@pytest.fixture
def spectrum1d():
np.random.seed(42)
Expand All @@ -45,11 +62,6 @@ def spectrum1d():
return Spectrum1D(spectral_axis=spec_axis, flux=flux, uncertainty=uncertainty)


@pytest.fixture
def imviz_app():
return Imviz()


try:
from pytest_astropy_header.display import PYTEST_HEADER_MODULES, TESTED_VERSIONS
except ImportError:
Expand Down
2 changes: 1 addition & 1 deletion jdaviz/container.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<gl-component
v-for="(viewer, index) in stack.viewers"
:key="index"
title="Viewer"
:title="viewer.id"
:tab-id="viewer.id"
@resize="$emit('resize')"
@destroy="$emit('destroy', viewer.id)"
Expand Down
46 changes: 46 additions & 0 deletions jdaviz/tests/test_viewer_ids.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from jdaviz import Application


def test_default_viewer_ids_default():
app = Application(configuration='default')
assert app.get_viewer_reference_names() == []
assert app.get_viewer_ids() == []


# NOTE: Unable to parametrize fixture as input.

def test_default_viewer_ids_cubeviz(cubeviz_app):
x = cubeviz_app.app
assert x.get_viewer_reference_names() == ['flux-viewer', 'uncert-viewer', 'mask-viewer',
'spectrum-viewer']
assert x.get_viewer_ids() == ['cubeviz-0', 'cubeviz-1', 'cubeviz-2', 'cubeviz-3']


def test_default_viewer_ids_imviz(imviz_app):
x = imviz_app.app
assert x.get_viewer_reference_names() == ['viewer-1']
assert x.get_viewer_ids() == ['imviz-0']
assert x.get_viewer_ids(prefix='imviz') == ['imviz-0']
assert x.get_viewer_ids(prefix='specviz') == []

viewer = x.get_viewer('viewer-1')
assert x.get_viewer_by_id('imviz-0') is viewer


def test_default_viewer_ids_mosviz(mosviz_app):
x = mosviz_app.app
assert x.get_viewer_reference_names() == ['image-viewer', 'spectrum-2d-viewer',
'spectrum-viewer', 'table-viewer']
assert x.get_viewer_ids() == ['mosviz-0', 'mosviz-1', 'mosviz-2', 'mosviz-3']


def test_default_viewer_ids_specviz(specviz_app):
x = specviz_app.app
assert x.get_viewer_reference_names() == ['spectrum-viewer']
assert x.get_viewer_ids() == ['specviz-0']


def test_default_viewer_ids_specviz2d(specviz2d_app):
x = specviz2d_app.app
assert x.get_viewer_reference_names() == ['spectrum-2d-viewer', 'spectrum-viewer']
assert x.get_viewer_ids() == ['specviz2d-0', 'specviz2d-1']

0 comments on commit 915c3c9

Please sign in to comment.