Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/artiq
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 49ba8aec18fe
Choose a base ref
...
head repository: m-labs/artiq
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: c414026b298a
Choose a head ref
  • 4 commits
  • 4 files changed
  • 1 contributor

Commits on Sep 2, 2016

  1. Copy the full SHA
    019fe25 View commit details
  2. Copy the full SHA
    ef2195f View commit details
  3. Copy the full SHA
    dbc08bd View commit details
  4. Copy the full SHA
    c414026 View commit details
Showing with 61 additions and 33 deletions.
  1. +2 −0 RELEASE_NOTES.rst
  2. +15 −11 artiq/browser/experiments.py
  3. +4 −1 artiq/compiler/import_cache.py
  4. +40 −21 artiq/dashboard/experiments.py
2 changes: 2 additions & 0 deletions RELEASE_NOTES.rst
Original file line number Diff line number Diff line change
@@ -34,6 +34,8 @@ unreleased [2.x]
(i.e. grouping by day and then by hour, instead of by day and then by minute)
* The ``parent`` keyword argument of ``HasEnvironment`` (and ``EnvExperiment``)
has been replaced. Pass the parent as first argument instead.
* During experiment examination (and a fortiori repository scan), the values of
all arguments are set to ``None`` regardless of any default values supplied.
* In the dashboard's experiment windows, partial or full argument recomputation
takes into account the repository revision field.
* By default, ``NumberValue`` and ``Scannable`` infer the scale from the unit
26 changes: 15 additions & 11 deletions artiq/browser/experiments.py
Original file line number Diff line number Diff line change
@@ -48,7 +48,7 @@ def __init__(self, dock):
self.viewport().installEventFilter(_WheelFilter(self.viewport()))

self._groups = dict()
self._arg_to_entry_widgetitem = dict()
self._arg_to_widgets = dict()
self._dock = dock

if not self._dock.arguments:
@@ -59,12 +59,13 @@ def __init__(self, dock):
gradient.setColorAt(1, self.palette().midlight().color())

for name, argument in self._dock.arguments.items():
try:
entry = argty_to_entry[argument["desc"]["ty"]](argument)
except:
print(name, argument)
widgets = dict()
self._arg_to_widgets[name] = widgets

entry = argty_to_entry[argument["desc"]["ty"]](argument)
widget_item = QtWidgets.QTreeWidgetItem([name])
self._arg_to_entry_widgetitem[name] = entry, widget_item
widgets["entry"] = entry
widgets["widget_item"] = widget_item

for col in range(3):
widget_item.setBackground(col, gradient)
@@ -77,6 +78,7 @@ def __init__(self, dock):
else:
self._get_group(argument["group"]).addChild(widget_item)
fix_layout = LayoutWidget()
widgets["fix_layout"] = fix_layout
fix_layout.addWidget(entry)
self.setItemWidget(widget_item, 1, fix_layout)

@@ -150,12 +152,14 @@ async def _recompute_argument(self, name):
argument["desc"] = procdesc
argument["state"] = state

old_entry, widget_item = self._arg_to_entry_widgetitem[name]
old_entry.deleteLater()
widgets = self._arg_to_widgets[name]

entry = argty_to_entry[procdesc["ty"]](argument)
self._arg_to_entry_widgetitem[name] = entry, widget_item
self.setItemWidget(widget_item, 1, entry)
widgets["entry"].deleteLater()
widgets["entry"] = argty_to_entry[procdesc["ty"]](argument)
widgets["fix_layout"] = LayoutWidget()
widgets["fix_layout"].addWidget(widgets["entry"])
self.setItemWidget(widgets["widget_item"], 1, widgets["fix_layout"])
self.updateGeometries()

def save_state(self):
expanded = []
5 changes: 4 additions & 1 deletion artiq/compiler/import_cache.py
Original file line number Diff line number Diff line change
@@ -29,7 +29,10 @@ def hook_exec_module(self, module):
fn = module.__file__
try:
with tokenize.open(fn) as fp:
cache[fn] = fp.readlines()
lines = fp.readlines()
if lines and not lines[-1].endswith("\n"):
lines[-1] += "\n"
cache[fn] = lines
except:
logger.warning("failed to add '%s' to cache", fn, exc_info=True)
else:
61 changes: 40 additions & 21 deletions artiq/dashboard/experiments.py
Original file line number Diff line number Diff line change
@@ -56,7 +56,7 @@ def __init__(self, manager, dock, expurl):
self.viewport().installEventFilter(_WheelFilter(self.viewport()))

self._groups = dict()
self._arg_to_entry_widgetitem = dict()
self._arg_to_widgets = dict()

arguments = self.manager.get_submission_arguments(self.expurl)

@@ -68,9 +68,13 @@ def __init__(self, manager, dock, expurl):
gradient.setColorAt(0, self.palette().base().color())
gradient.setColorAt(1, self.palette().midlight().color())
for name, argument in arguments.items():
widgets = dict()
self._arg_to_widgets[name] = widgets

entry = argty_to_entry[argument["desc"]["ty"]](argument)
widget_item = QtWidgets.QTreeWidgetItem([name])
self._arg_to_entry_widgetitem[name] = entry, widget_item
widgets["entry"] = entry
widgets["widget_item"] = widget_item

for col in range(3):
widget_item.setBackground(col, gradient)
@@ -83,6 +87,7 @@ def __init__(self, manager, dock, expurl):
else:
self._get_group(argument["group"]).addChild(widget_item)
fix_layout = LayoutWidget()
widgets["fix_layout"] = fix_layout
fix_layout.addWidget(entry)
self.setItemWidget(widget_item, 1, fix_layout)
recompute_argument = QtWidgets.QToolButton()
@@ -97,18 +102,20 @@ def __init__(self, manager, dock, expurl):
tool_buttons = LayoutWidget()
tool_buttons.addWidget(recompute_argument, 1)

if isinstance(entry, ScanEntry):
disable_other_scans = QtWidgets.QToolButton()
disable_other_scans.setIcon(
QtWidgets.QApplication.style().standardIcon(
QtWidgets.QStyle.SP_DialogResetButton))
disable_other_scans.setToolTip("Disable all other scans in "
"this experiment")
disable_other_scans.clicked.connect(
partial(self._disable_other_scans, name))
tool_buttons.layout.setRowStretch(0, 1)
tool_buttons.layout.setRowStretch(3, 1)
tool_buttons.addWidget(disable_other_scans, 2)
disable_other_scans = QtWidgets.QToolButton()
widgets["disable_other_scans"] = disable_other_scans
disable_other_scans.setIcon(
QtWidgets.QApplication.style().standardIcon(
QtWidgets.QStyle.SP_DialogResetButton))
disable_other_scans.setToolTip("Disable all other scans in "
"this experiment")
disable_other_scans.clicked.connect(
partial(self._disable_other_scans, name))
tool_buttons.layout.setRowStretch(0, 1)
tool_buttons.layout.setRowStretch(3, 1)
tool_buttons.addWidget(disable_other_scans, 2)
if not isinstance(entry, ScanEntry):
disable_other_scans.setVisible(False)

self.setItemWidget(widget_item, 2, tool_buttons)

@@ -165,16 +172,26 @@ async def _recompute_argument(self, name):
argument["desc"] = procdesc
argument["state"] = state

old_entry, widget_item = self._arg_to_entry_widgetitem[name]
old_entry.deleteLater()
# Qt needs a setItemWidget() to handle layout correctly,
# simply replacing the entry inside the LayoutWidget
# results in a bug.

entry = argty_to_entry[procdesc["ty"]](argument)
self._arg_to_entry_widgetitem[name] = entry, widget_item
self.setItemWidget(widget_item, 1, entry)
widgets = self._arg_to_widgets[name]

widgets["entry"].deleteLater()
widgets["entry"] = argty_to_entry[procdesc["ty"]](argument)
widgets["disable_other_scans"].setVisible(
isinstance(widgets["entry"], ScanEntry))
widgets["fix_layout"].deleteLater()
widgets["fix_layout"] = LayoutWidget()
widgets["fix_layout"].addWidget(widgets["entry"])
self.setItemWidget(widgets["widget_item"], 1, widgets["fix_layout"])
self.updateGeometries()

def _disable_other_scans(self, current_name):
for name, (entry, _) in self._arg_to_entry_widgetitem.items():
if name != current_name and isinstance(entry, ScanEntry):
for name, widgets in self._arg_to_widgets.items():
if (name != current_name
and isinstance(widgets["entry"], ScanEntry)):
entry.disable()

def save_state(self):
@@ -606,6 +623,8 @@ async def compute_arginfo(self, expurl):
file, class_name, use_repository = self.resolve_expurl(expurl)
if use_repository:
revision = self.get_submission_options(expurl)["repo_rev"]
else:
revision = None
description = await self.experiment_db_ctl.examine(
file, use_repository, revision)
return description[class_name]["arginfo"]