nova-trame 0.25.0__py3-none-any.whl → 0.25.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,13 @@ from trame_server.core import State
7
7
  from nova.mvvm._internal.utils import rgetdictvalue, rsetdictvalue
8
8
 
9
9
 
10
+ # Trame state handlers don't work on nested properties. When writing Trame state handlers (e.g. flushState, dirty, or
11
+ # change), we instead use the name of the top-level property. For example, "config.parameter_group_a.option_x" becomes
12
+ # "config".
13
+ def get_state_name(name: str) -> str:
14
+ return name.split(".")[0]
15
+
16
+
10
17
  # Reads a state parameter from Trame. For internal use only, if you're using this in your application you're violating
11
18
  # the MVVM framework. :)
12
19
  def get_state_param(state: State, value: Union[Any, Tuple]) -> Any:
@@ -25,6 +32,6 @@ def set_state_param(state: State, value: Union[Any, Tuple], new_value: Any = Non
25
32
  rsetdictvalue(state, value[0], new_value)
26
33
  elif len(value) > 1:
27
34
  rsetdictvalue(state, value[0], value[1])
28
- state.dirty(value[0].split(".")[0])
35
+ state.dirty(get_state_name(value[0]))
29
36
 
30
37
  return get_state_param(state, value)
@@ -173,9 +173,10 @@ class NeutronDataSelectorModel(DataSelectorModel):
173
173
  return self.get_directories_from_path(base_path)
174
174
 
175
175
  def get_datafiles(self) -> List[str]:
176
+ using_custom_directory = self.state.facility == CUSTOM_DIRECTORIES_LABEL
176
177
  if self.state.experiment:
177
178
  base_path = Path("/") / self.state.facility / self.get_instrument_dir() / self.state.experiment
178
- elif self.state.custom_directory:
179
+ elif using_custom_directory and self.state.custom_directory:
179
180
  base_path = Path(self.state.custom_directory)
180
181
  else:
181
182
  return []
@@ -201,10 +201,8 @@ class DataSelector(datagrid.VGrid):
201
201
  InputField(
202
202
  v_model=self._v_model,
203
203
  classes="flex-0-1 nova-readonly",
204
- clearable=True,
205
204
  readonly=True,
206
205
  type="select",
207
- click_clear=self.reset,
208
206
  ),
209
207
  ):
210
208
  with vuetify.Template(raw_attrs=['v-slot:selection="{ item, index }"']):
@@ -213,6 +211,11 @@ class DataSelector(datagrid.VGrid):
213
211
  f"(+{{{{ {self._v_model}.length - 2 }}}} others)", v_if="index === 2", classes="text-caption"
214
212
  )
215
213
 
214
+ with vuetify.Template(v_slot_append_inner=True):
215
+ vuetify.VIcon(
216
+ "mdi-close-box", v_if=f"{self._v_model}.length > 0", color="primary", size=20, click=self.reset
217
+ )
218
+
216
219
  def _create_model(self) -> None:
217
220
  state = DataSelectorState()
218
221
  self._model = DataSelectorModel(state)
@@ -226,6 +229,7 @@ class DataSelector(datagrid.VGrid):
226
229
  self._vm.directories_bind.connect(self._directories_name)
227
230
  self._vm.datafiles_bind.connect(self._datafiles_name)
228
231
  self._vm.reset_bind.connect(self.reset)
232
+ self._vm.reset_grid_bind.connect(self._reset_rv_grid)
229
233
 
230
234
  def refresh_contents(self) -> None:
231
235
  self._vm.update_view(refresh_directories=True)
@@ -1,5 +1,7 @@
1
1
  """Module for the Progress Tab."""
2
2
 
3
+ from typing import Tuple, Union
4
+
3
5
  from trame.app import get_server
4
6
  from trame.widgets import client
5
7
  from trame.widgets import vuetify3 as vuetify
@@ -15,16 +17,17 @@ class ExecutionButtons:
15
17
  This is intended to be used with the `nova-galaxy ToolRunner <https://nova-application-development.readthedocs.io/projects/nova-galaxy/en/latest/core_concepts/tool_runner.html>`__.
16
18
  """
17
19
 
18
- def __init__(self, id: str, stop_btn: bool = False, download_btn: bool = False) -> None:
20
+ def __init__(self, id: str, stop_btn: Union[bool, Tuple] = False, download_btn: Union[bool, Tuple] = False) -> None:
19
21
  """Constructor for ExecutionButtons.
20
22
 
21
23
  Parameters
22
24
  ----------
23
25
  id : str
24
- Component id. Should be used consistently with ToolRunner and other components.
25
- stop_btn: bool
26
+ Component id. Should be used consistently with ToolRunner and other components. Note that this parameter
27
+ does not support Trame bindings.
28
+ stop_btn: Union[bool, Tuple]
26
29
  Display stop button.
27
- download_btn : bool
30
+ download_btn : Union[bool, Tuple]
28
31
  Display download button.
29
32
 
30
33
  Returns
@@ -69,6 +72,9 @@ class ExecutionButtons:
69
72
  click=self.run,
70
73
  )
71
74
  if self.stop_btn:
75
+ extra_params = {}
76
+ if isinstance(self.stop_btn, tuple):
77
+ extra_params["v_if"] = self.stop_btn
72
78
  vuetify.VBtn(
73
79
  "Stop",
74
80
  disabled=(f"{self.id}.stop_disabled",),
@@ -77,6 +83,7 @@ class ExecutionButtons:
77
83
  id=f"{self.id}_stop",
78
84
  prepend_icon="mdi-stop",
79
85
  click=self.stop,
86
+ **extra_params,
80
87
  )
81
88
  vuetify.VBtn(
82
89
  "Cancel",
@@ -89,12 +96,16 @@ class ExecutionButtons:
89
96
  click=self.cancel,
90
97
  )
91
98
  if self.download_btn:
99
+ extra_params = {}
100
+ if isinstance(self.download_btn, tuple):
101
+ extra_params["v_if"] = self.download_btn
92
102
  vuetify.VBtn(
93
103
  "Download Results",
94
104
  disabled=(f"{self.id}.download_disabled",),
95
105
  loading=(f"{self.id}.download_in_progress",),
96
106
  id=f"{self.id}.download",
97
107
  click=self.download,
108
+ **extra_params,
98
109
  )
99
110
 
100
111
  async def download(self) -> None:
@@ -154,6 +154,7 @@ class NeutronDataSelector(DataSelector):
154
154
  self._vm.directories_bind.connect(self._directories_name)
155
155
  self._vm.datafiles_bind.connect(self._datafiles_name)
156
156
  self._vm.reset_bind.connect(self.reset)
157
+ self._vm.reset_grid_bind.connect(self._reset_rv_grid)
157
158
 
158
159
  self._vm.update_view()
159
160
 
@@ -207,8 +208,12 @@ class NeutronDataSelector(DataSelector):
207
208
  @self.state.change(self._experiment[0].split(".")[0])
208
209
  def on_experiment_change(**kwargs: Any) -> None:
209
210
  experiment = rgetdictvalue(kwargs, self._experiment[0])
210
- if experiment != self._last_experiment:
211
+ if experiment and experiment != self._last_experiment:
211
212
  self._last_experiment = experiment
213
+ # See the note in the update_experiment method for why we call this twice.
214
+ self._vm.set_binding_parameters(
215
+ experiment=set_state_param(self.state, (self._selected_experiment_name,), ""),
216
+ )
212
217
  self._vm.set_binding_parameters(
213
218
  experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment)
214
219
  )
@@ -244,6 +249,10 @@ class NeutronDataSelector(DataSelector):
244
249
  self._vm.reset()
245
250
 
246
251
  def update_experiment(self, experiment: str) -> None:
252
+ # Setting the experiment to an empty string forces the treeview to clear it's selection state.
253
+ self._vm.set_binding_parameters(
254
+ experiment=set_state_param(self.state, (self._selected_experiment_name,), ""),
255
+ )
247
256
  self._vm.set_binding_parameters(
248
257
  experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment),
249
258
  )
@@ -20,7 +20,8 @@ class ProgressBar:
20
20
  Parameters
21
21
  ----------
22
22
  id : str
23
- Component id. Should be used consistently with ToolRunner and other components
23
+ Component id. Should be used consistently with ToolRunner and other components. Note that this parameter
24
+ does not support Trame bindings.
24
25
 
25
26
  Returns
26
27
  -------
@@ -21,7 +21,8 @@ class ToolOutputWindows:
21
21
  Parameters
22
22
  ----------
23
23
  id : str
24
- Component id. Should be used consistently with ToolRunner and other components
24
+ Component id. Should be used consistently with ToolRunner and other components. Note that this parameter
25
+ does not support Trame bindings.
25
26
 
26
27
  Returns
27
28
  -------
@@ -30,7 +30,7 @@ class Interactive2DPlot(vega.Figure):
30
30
 
31
31
  Parameters
32
32
  ----------
33
- figure : `altair.Chart <https://altair-viz.github.io/user_guide/generated/toplevel/altair.Chart.html#altair.Chart>`_
33
+ figure : `altair.Chart <https://altair-viz.github.io/user_guide/generated/toplevel/altair.Chart.html#altair.Chart>`__, optional
34
34
  Altair chart object
35
35
  kwargs
36
36
  Arguments to be passed to `AbstractElement <https://trame.readthedocs.io/en/latest/core.widget.html#trame_client.widgets.core.AbstractElement>`_
@@ -38,7 +38,7 @@ class Interactive2DPlot(vega.Figure):
38
38
  Returns
39
39
  -------
40
40
  None
41
- """
41
+ """ # noqa: E501
42
42
  self._initialized = False
43
43
 
44
44
  super().__init__(figure=figure, **kwargs)
@@ -83,3 +83,5 @@ class Interactive2DPlot(vega.Figure):
83
83
 
84
84
  if hasattr(self, "_start_update_handlers"):
85
85
  self._start_update_handlers()
86
+
87
+ self.server.state.flush()
@@ -200,18 +200,20 @@ class MatplotlibFigure(matplotlib.Figure):
200
200
 
201
201
  Parameters
202
202
  ----------
203
- figure : `altair.Chart <https://altair-viz.github.io/user_guide/generated/toplevel/altair.Chart.html#altair.Chart>`_
204
- Altair chart object
205
- webagg : bool
203
+ figure : `matplotlib.figure.Figure <https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure>`__, optional
204
+ Initial Matplotlib figure.
205
+ webagg : bool, optional
206
206
  If true, then the WebAgg backend for Matplotlib is used. If not, then the default Trame matplotlib plugin
207
- is used.
207
+ is used. Note that this parameter does not supporting Trame bindings since the user experiences are
208
+ fundamentally different between the two options and toggling them is not considered a good idea by the
209
+ author of this component.
208
210
  kwargs
209
211
  Arguments to be passed to `AbstractElement <https://trame.readthedocs.io/en/latest/core.widget.html#trame_client.widgets.core.AbstractElement>`_
210
212
 
211
213
  Returns
212
214
  -------
213
215
  None
214
- """
216
+ """ # noqa: E501
215
217
  self._webagg = webagg
216
218
  if webagg:
217
219
  self._port = MatplotlibFigure._get_free_port()
@@ -253,6 +255,8 @@ class MatplotlibFigure(matplotlib.Figure):
253
255
  else:
254
256
  super().update(figure)
255
257
 
258
+ self._server.state.flush()
259
+
256
260
  def _setup_figure_websocket(self) -> None:
257
261
  thread = Thread(target=self._mpl_run_ws_server, daemon=True)
258
262
  thread.start()
@@ -202,6 +202,10 @@ html {
202
202
 
203
203
  .v-field {
204
204
  margin: 8px 4px 8px 4px;
205
+
206
+ &.v-field--appended {
207
+ padding-right: 6px;
208
+ }
205
209
  }
206
210
 
207
211
  .v-field--active .v-label {
@@ -12,6 +12,11 @@ class RevoGrid {
12
12
  }
13
13
 
14
14
  updateCheckboxes() {
15
+ // Wait for the DOM to update after the Trame state is updated.
16
+ setTimeout(this._updateCheckboxes.bind(this), 10)
17
+ }
18
+
19
+ _updateCheckboxes() {
15
20
  const trameState = window.trame.state.state
16
21
  const modelValue = _.get(trameState, this.modelKey)
17
22
  const availableData = _.get(trameState, this.dataKey)
@@ -22,23 +27,34 @@ class RevoGrid {
22
27
  return
23
28
  }
24
29
 
30
+ let allSelected = null
31
+ rowCheckboxes.forEach((element) => {
32
+ const input = element.querySelector('input')
33
+
34
+ const rowIndex = element.dataset.rgrow
35
+ if (availableData[rowIndex] !== undefined) {
36
+ input.checked = modelValue.includes(availableData[rowIndex].path)
37
+ } else {
38
+ input.checked = false
39
+ }
40
+
41
+ if (allSelected === null && input.checked) {
42
+ allSelected = true
43
+ } else if (!input.checked) {
44
+ allSelected = false
45
+ }
46
+ })
47
+
25
48
  if (modelValue.length === 0) {
26
49
  selectAllCheckbox.checked = false
27
50
  selectAllCheckbox.indeterminate = false
28
- } else if (modelValue.length === availableData.length) {
51
+ } else if (allSelected === true) {
29
52
  selectAllCheckbox.checked = true
30
53
  selectAllCheckbox.indeterminate = false
31
54
  } else {
32
55
  selectAllCheckbox.checked = false
33
56
  selectAllCheckbox.indeterminate = true
34
57
  }
35
-
36
- rowCheckboxes.forEach((element) => {
37
- const input = element.querySelector('input')
38
-
39
- const rowIndex = element.dataset.rgrow
40
- input.checked = modelValue.includes(availableData[rowIndex].path)
41
- })
42
58
  }
43
59
 
44
60
  cellTemplate(createElement, props) {
@@ -22,6 +22,7 @@ class DataSelectorViewModel:
22
22
  self.directories_bind = binding.new_bind()
23
23
  self.datafiles_bind = binding.new_bind()
24
24
  self.reset_bind = binding.new_bind()
25
+ self.reset_grid_bind = binding.new_bind()
25
26
 
26
27
  def expand_directory(self, paths: List[str]) -> None:
27
28
  if paths[-1] in self.expanded:
@@ -76,3 +77,4 @@ class DataSelectorViewModel:
76
77
  {"path": datafile, "title": os.path.basename(datafile)} for datafile in self.model.get_datafiles()
77
78
  ]
78
79
  self.datafiles_bind.update_in_view(self.datafiles)
80
+ self.reset_grid_bind.update_in_view(None)
@@ -22,6 +22,8 @@ class NeutronDataSelectorViewModel(DataSelectorViewModel):
22
22
  self.model.set_subdirectory("")
23
23
  self.directories = self.model.get_directories()
24
24
  self.expanded = {}
25
+
26
+ self.update_view()
25
27
  self.reset_bind.update_in_view(None)
26
28
 
27
29
  def on_state_updated(self, results: Dict[str, Any]) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nova-trame
3
- Version: 0.25.0
3
+ Version: 0.25.3
4
4
  Summary: A Python Package for injecting curated themes and custom components into Trame applications
5
5
  License: MIT
6
6
  Keywords: NDIP,Python,Trame,Vuetify
@@ -17,6 +17,7 @@ Requires-Dist: altair
17
17
  Requires-Dist: blinker (>=1.9.0,<2.0.0)
18
18
  Requires-Dist: libsass
19
19
  Requires-Dist: mergedeep
20
+ Requires-Dist: mpld3 (>=0.5.11,<0.6.0)
20
21
  Requires-Dist: natsort (>=8.4.0,<9.0.0)
21
22
  Requires-Dist: nova-common (>=0.2.2)
22
23
  Requires-Dist: nova-mvvm
@@ -1,45 +1,45 @@
1
1
  nova/__init__.py,sha256=ED6jHcYiuYpr_0vjGz0zx2lrrmJT9sDJCzIljoDfmlM,65
2
2
  nova/trame/__init__.py,sha256=gFrAg1qva5PIqR5TjvPzAxLx103IKipJLqp3XXvrQL8,59
3
- nova/trame/_internal/utils.py,sha256=Yi6zdHfeIHE5dQXmxZ9x0Yyuwkjn2geFoXAYtZ_PO2s,1060
3
+ nova/trame/_internal/utils.py,sha256=lTTJnfqbbIe21Tg2buf5MXqKUEUop7Va5PZgpWMzRkI,1381
4
4
  nova/trame/model/data_selector.py,sha256=rDmWDtHVGgi5e2fBEYvChM2vVKNu798m67Sq8MUN2UI,4463
5
- nova/trame/model/ornl/neutron_data_selector.py,sha256=Eu-CnX4Gr_T-Kz_l3SsMhyGf61hlHhRCYpcn7em7TCk,6168
5
+ nova/trame/model/ornl/neutron_data_selector.py,sha256=Nkj0DXdv3ydfXV3zeilbOGWuRCVzc_ClAOj6iNnN0uI,6276
6
6
  nova/trame/model/remote_file_input.py,sha256=9KAf31ZHzpsh_aXUrNcF81Q5jvUZDWCzW1QATKls-Jk,3675
7
7
  nova/trame/view/components/__init__.py,sha256=60BeS69aOrFnkptjuD17rfPE1f4Z35iBH56TRmW5MW8,451
8
- nova/trame/view/components/data_selector.py,sha256=EJ8fYCrkhRgDExAcewiUb7jTs7Qzo-GKVYWx7oFlrT0,14592
9
- nova/trame/view/components/execution_buttons.py,sha256=fIkrWKI3jFZqk3GHhtmYh3nK2c-HOXpD3D3zd_TUpi0,4049
8
+ nova/trame/view/components/data_selector.py,sha256=XFwIuKhIeBbkqsNEkIFDhjdDD5PD6cvbgn1jkivUhC4,14817
9
+ nova/trame/view/components/execution_buttons.py,sha256=Br6uAmE5bY67TTYc5ZTHECNJ_RJqKmv17HAKPpQtbeg,4576
10
10
  nova/trame/view/components/file_upload.py,sha256=Q3t7TUJ8w6wlEqb1mnJ23yBsM1XmQPtm0awaoBrlLXo,3509
11
11
  nova/trame/view/components/input_field.py,sha256=Rtcl_eszvhgyC1rhTI7OMSLHjrE7DNH44eY08k7UXks,16094
12
12
  nova/trame/view/components/ornl/__init__.py,sha256=HnxzzSsxw0vQSDCVFfWsAxx1n3HnU37LMuQkfiewmSU,90
13
- nova/trame/view/components/ornl/neutron_data_selector.py,sha256=YTYuLD5eDn3AsKguT8ksPx2Yme2RxheuXQGlhuTLOOc,12527
14
- nova/trame/view/components/progress_bar.py,sha256=fCfPw4MPAvORaeFOXugreok4GLpDVZGMkqvnv-AhMxg,2967
13
+ nova/trame/view/components/ornl/neutron_data_selector.py,sha256=g633Ie3GSNu0QFEuexYl_XUxjUiGEJKjWLP7ZB5PRR0,13122
14
+ nova/trame/view/components/progress_bar.py,sha256=zhbJwPy_HPQ8YL-ISN8sCRUQ7qY6qqo9wiV59BmvL8I,3038
15
15
  nova/trame/view/components/remote_file_input.py,sha256=6mUz6JZVhLO_Y4mZaQd_lpPe33KLtSpjxXS7uTNUmFI,10004
16
- nova/trame/view/components/tool_outputs.py,sha256=-6pDURd2l_FK_8EWa9BI3KhU_KJXJ6uyJ_rW4nQVc08,2337
16
+ nova/trame/view/components/tool_outputs.py,sha256=IbYV4VjrkWAE354Bh5KH76SPsxGLIkOXChijS4-ce_Y,2408
17
17
  nova/trame/view/components/visualization/__init__.py,sha256=reqkkbhD5uSksHHlhVMy1qNUCwSekS5HlXk6wCREYxU,152
18
- nova/trame/view/components/visualization/interactive_2d_plot.py,sha256=foZCMoqbuahT5dtqIQvm8C4ZJcY9P211eJEcpQJltmM,3421
19
- nova/trame/view/components/visualization/matplotlib_figure.py,sha256=GGH2cx-dQFkMAOTnlCrzMGDb2TN451I9J3gAS8tx2cs,12147
18
+ nova/trame/view/components/visualization/interactive_2d_plot.py,sha256=z2s1janxAclpMEdDJk3z-CQ6r3KPNoR_SXPx9ppWnuQ,3481
19
+ nova/trame/view/components/visualization/matplotlib_figure.py,sha256=q0HLaaLFjM3_V1oUk-VBHWvokFY6AQZzmnMcynTroik,12488
20
20
  nova/trame/view/layouts/__init__.py,sha256=cMrlB5YMUoK8EGB83b34UU0kPTVrH8AxsYvKRtpUNEc,141
21
21
  nova/trame/view/layouts/grid.py,sha256=vqEX-jghs6j9_sVtijdRH7uhlD9loWNi90k2qgg4Dhg,5534
22
22
  nova/trame/view/layouts/hbox.py,sha256=cdwnGk93ec6dXAeEamRQx1WTj5T7Ygsmsy0xz130tWM,3519
23
23
  nova/trame/view/layouts/utils.py,sha256=Hg34VQWTG3yHBsgNvmfatR4J-uL3cko7UxSJpT-h3JI,376
24
24
  nova/trame/view/layouts/vbox.py,sha256=XRV14e32MY1HWc9FTVTv1vOatWWbhLMd0lYwZP-isTg,3520
25
25
  nova/trame/view/theme/__init__.py,sha256=70_marDlTigIcPEOGiJb2JTs-8b2sGM5SlY7XBPtBDM,54
26
- nova/trame/view/theme/assets/core_style.scss,sha256=uZKMMhXRsvVy_17dK32ETNJn-4c7_xzj01FRkx7axY0,4262
26
+ nova/trame/view/theme/assets/core_style.scss,sha256=3-3qMc5gpaDhfuVWAF_psBH5alxwiuK-hPGhVgi2cW0,4335
27
27
  nova/trame/view/theme/assets/favicon.png,sha256=Xbp1nUmhcBDeObjsebEbEAraPDZ_M163M_ZLtm5AbQc,1927
28
28
  nova/trame/view/theme/assets/js/delay_manager.js,sha256=mRV6KoO8-Bxq3tG5Bh9CQYy-CRVbkj3IYlqNb-Og7cI,526
29
29
  nova/trame/view/theme/assets/js/lodash.min.js,sha256=KCyAYJ-fsqtp_HMwbjhy6IKjlA5lrVrtWt1JdMsC57k,73016
30
- nova/trame/view/theme/assets/js/revo_grid.js,sha256=WBsmoslu9qI5DHZkHkJam2AVgdiBp6szfOSV8a9cA5Q,3579
30
+ nova/trame/view/theme/assets/js/revo_grid.js,sha256=81s0fUo8HbHmAyWag7pW0jP796Ttb1noAPOgTJlxJss,4069
31
31
  nova/trame/view/theme/assets/vuetify_config.json,sha256=a0FSgpLYWGFlRGSMhMq61MyDFBEBwvz55G4qjkM08cs,5627
32
32
  nova/trame/view/theme/exit_button.py,sha256=Kqv1GVJZGrSsj6_JFjGU3vm3iNuMolLC2T1x2IsdmV0,3094
33
33
  nova/trame/view/theme/theme.py,sha256=8JqSrEbhxK1SccXE1_jUdel9Wtc2QNObVEwtbVWG_QY,13146
34
34
  nova/trame/view/utilities/local_storage.py,sha256=vD8f2VZIpxhIKjZwEaD7siiPCTZO4cw9AfhwdawwYLY,3218
35
- nova/trame/view_model/data_selector.py,sha256=LeVbrBatzwffiOywI8M7F9ldZxlpi92rFRishHkFhmo,2975
35
+ nova/trame/view_model/data_selector.py,sha256=d8qdn6Q2b5fNo5lCXi1LTRdesfmy7wErIvGBa0UjOt8,3075
36
36
  nova/trame/view_model/execution_buttons.py,sha256=MfKSp95D92EqpD48C15cBo6dLO0Yld4FeRZMJNxJf7Y,3551
37
- nova/trame/view_model/ornl/neutron_data_selector.py,sha256=l1l_e0CFsVZ0h-9MPSjXTA2w1rgH3KoGAS67UyL8DvY,1551
37
+ nova/trame/view_model/ornl/neutron_data_selector.py,sha256=zpwvqETPuw0sEUvv0A2sU5Ha2_BKG_3xFYSaUuixLXw,1579
38
38
  nova/trame/view_model/progress_bar.py,sha256=6AUKHF3hfzbdsHqNEnmHRgDcBKY5TT8ywDx9S6ovnsc,2854
39
39
  nova/trame/view_model/remote_file_input.py,sha256=ojEOJ8ZPkajpbAaZi9VLj7g-uBjhb8BMrTdMmwf_J6A,3367
40
40
  nova/trame/view_model/tool_outputs.py,sha256=ev6LY7fJ0H2xAJn9f5ww28c8Kpom2SYc2FbvFcoN4zg,829
41
- nova_trame-0.25.0.dist-info/LICENSE,sha256=Iu5QiDbwNbREg75iYaxIJ_V-zppuv4QFuBhAW-qiAlM,1061
42
- nova_trame-0.25.0.dist-info/METADATA,sha256=Vr8vS4k_Z0Bi4yHF24w5fYtRDcHh8KxcuSO8BWmv0AM,1688
43
- nova_trame-0.25.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
44
- nova_trame-0.25.0.dist-info/entry_points.txt,sha256=J2AmeSwiTYZ4ZqHHp9HO6v4MaYQTTBPbNh6WtoqOT58,42
45
- nova_trame-0.25.0.dist-info/RECORD,,
41
+ nova_trame-0.25.3.dist-info/LICENSE,sha256=Iu5QiDbwNbREg75iYaxIJ_V-zppuv4QFuBhAW-qiAlM,1061
42
+ nova_trame-0.25.3.dist-info/METADATA,sha256=fUOB8LAzrU6ZyuLaEwTISI81BTrr-JbSQC7gX1e0eZo,1727
43
+ nova_trame-0.25.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
44
+ nova_trame-0.25.3.dist-info/entry_points.txt,sha256=J2AmeSwiTYZ4ZqHHp9HO6v4MaYQTTBPbNh6WtoqOT58,42
45
+ nova_trame-0.25.3.dist-info/RECORD,,