Skip to content

Commit c5fa7b7

Browse files
committed
Edit Domain: Migrate settings 2 to 3
1 parent d59c045 commit c5fa7b7

File tree

2 files changed

+130
-5
lines changed

2 files changed

+130
-5
lines changed

Orange/widgets/data/oweditdomain.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
)
4343
from Orange.misc.collections import DictMissingConst
4444
from Orange.util import frompyfunc
45-
from Orange.widgets import widget, gui, settings
45+
from Orange.widgets import widget, gui
46+
from Orange.widgets.settings import Setting
4647
from Orange.widgets.utils import itemmodels, ftry, disconnected
4748
from Orange.widgets.utils.buttons import FixedSizeButton
4849
from Orange.widgets.utils.itemmodels import signal_blocking
@@ -1892,9 +1893,9 @@ class Error(widget.OWWidget.Error):
18921893

18931894
settings_version = 3
18941895

1895-
_domain_change_hints = settings.Setting({}, schema_only=True)
1896-
_merge_dialog_settings = settings.Setting({}, schema_only=True)
1897-
output_table_name = settings.Setting("", schema_only=True)
1896+
_domain_change_hints = Setting({}, schema_only=True)
1897+
_merge_dialog_settings = Setting({}, schema_only=True)
1898+
output_table_name = Setting("", schema_only=True)
18981899

18991900
want_main_area = False
19001901

@@ -2311,9 +2312,31 @@ def migrate_context(cls, context, version):
23112312
trs.append(CategoriesMapping(
23122313
list(zip(src.categories, dst.categories))))
23132314
store.append((deconstruct(src), [deconstruct(tr) for tr in trs]))
2314-
# TODO: migrate directly to non-context hints
23152315
context.values["_domain_change_store"] = (dict(store), -2)
23162316

2317+
@classmethod
2318+
def migrate_settings(cls, settings, version):
2319+
if version == 2 and "context_settings" in settings:
2320+
contexts = settings["context_settings"]
2321+
valuess = []
2322+
for context in contexts:
2323+
cls.migrate_context(context, context.values["__version__"])
2324+
valuess.append(context.values)
2325+
# Fix the order of keys
2326+
hints = dict.fromkeys(
2327+
chain(*(values["_domain_change_store"][0]
2328+
for values in reversed(valuess)))
2329+
)
2330+
settings["output_table_name"] = ""
2331+
for values in valuess:
2332+
hints.update(values["_domain_change_store"][0])
2333+
new_name, _ = values.pop("output_table_name", ("", -2))
2334+
if new_name:
2335+
settings["output_table_name"] = new_name
2336+
while len(hints) > MAX_HINTS:
2337+
del hints[next(iter(hints))]
2338+
settings["_domain_change_hints"] = hints
2339+
del settings["context_settings"]
23172340

23182341
def enumerate_columns(
23192342
table: Orange.data.Table

Orange/widgets/data/tests/test_oweditdomain.py

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
QStyleOptionViewItem, QDialog, QMenu, QToolTip, QListView
1717
from AnyQt.QtTest import QTest, QSignalSpy
1818

19+
from orangewidget.settings import Context
1920
from orangewidget.tests.utils import simulate
2021

2122
from Orange.data import (
@@ -408,6 +409,107 @@ def data(fr, to):
408409
self.assertEqual([var.name for var in outp.domain.attributes],
409410
["v0", "v1", "v2", "xv3", "v4"])
410411

412+
def test_migrate_settings_hints_2_to_3(self):
413+
settings = {
414+
'__version__': 2,
415+
'context_settings':
416+
[Context(values={
417+
'_domain_change_store': (
418+
{('Categorical', ('a', ('mir1', 'mir4', 'mir2'), (), False)):
419+
[('Rename', ('disease mir',))],
420+
('Categorical', ('b', ('mir4', 'mir1', 'mir2'), (), False)):
421+
[('Rename', ('disease mirs',))]
422+
},
423+
-2),
424+
'_merge_dialog_settings': ({}, -4),
425+
'_selected_item': (('1', 0), -2),
426+
'output_table_name': ('boo', -2),
427+
'__version__': 2}),
428+
Context(values={
429+
'_domain_change_store': (
430+
{('Categorical', ('b', ('mir4', 'mir1', 'mir2'), (), False)):
431+
[('Rename', ('disease bmir',))],
432+
('Categorical', ('c', ('mir4', 'mir1', 'mir2'), (), False)):
433+
[('Rename', ('disease mirs',))]
434+
},
435+
-2),
436+
'_merge_dialog_settings': ({}, -4),
437+
'_selected_item': (('1', 0), -2),
438+
'output_table_name': ('far', -2),
439+
'__version__': 2}),
440+
]}
441+
migrated_hints = {
442+
('Categorical', ('b', ('mir4', 'mir1', 'mir2'), (), False)):
443+
[('Rename', ('disease bmir',))],
444+
('Categorical', ('c', ('mir4', 'mir1', 'mir2'), (), False)):
445+
[('Rename', ('disease mirs',))],
446+
('Categorical', ('a', ('mir1', 'mir4', 'mir2'), (), False)):
447+
[('Rename', ('disease mir',))],
448+
}
449+
widget = self.create_widget(OWEditDomain, stored_settings=settings)
450+
self.assertEqual(widget._domain_change_hints, migrated_hints)
451+
# order matters
452+
self.assertEqual(list(widget._domain_change_hints), list(migrated_hints))
453+
self.assertEqual(widget.output_table_name, "far")
454+
455+
def test_migrate_settings_2_to_3_realworld(self):
456+
settings = {
457+
'controlAreaVisible': True,
458+
'__version__': 2,
459+
'context_settings': [Context(
460+
values={
461+
'_domain_change_store':
462+
({('Real', ('sepal length', (1, 'f'), (), False)):
463+
[('AsString', ())],
464+
('Real', ('sepal width', (1, 'f'), (), False)):
465+
[('AsTime', ()), ('StrpTime', ('Detect automatically', None, 1, 1))],
466+
('Real', ('petal width', (1, 'f'), (), False)):
467+
[('Annotate', ((('a', 'b'),),))]}, -2),
468+
'_merge_dialog_settings': ({}, -4),
469+
'_selected_item': (('petal width', 2), -2),
470+
'output_table_name': ('', -2),
471+
'__version__': 2},
472+
attributes={'sepal length': 2, 'sepal width': 2,
473+
'petal length': 2, 'petal width': 2, 'iris': 1},
474+
metas={}
475+
)]
476+
}
477+
widget = self.create_widget(OWEditDomain, stored_settings=settings)
478+
self.assertEqual(
479+
widget._domain_change_hints,
480+
{('Real', ('sepal length', (1, 'f'), (), False)):
481+
[('AsString', ())],
482+
('Real', ('sepal width', (1, 'f'), (), False)):
483+
[('AsTime', ()),
484+
('StrpTime', ('Detect automatically', None, 1, 1))],
485+
('Real', ('petal width', (1, 'f'), (), False)):
486+
[('Annotate', ((('a', 'b'),),))]}
487+
)
488+
489+
def test_migrate_settings_name_2_to_3(self):
490+
settings = {
491+
'__version__': 2,
492+
'context_settings':
493+
[Context(values={
494+
'_domain_change_store': ({}, -2),
495+
'output_table_name': ('boo', -2),
496+
'__version__': 2}),
497+
Context(values={
498+
'_domain_change_store': ({}, -2),
499+
'output_table_name': ('far', -2),
500+
'__version__': 2}),
501+
Context(values={
502+
'_domain_change_store': ({}, -2),
503+
'output_table_name': ('', -2),
504+
'__version__': 2}),
505+
Context(values={
506+
'_domain_change_store': ({}, -2),
507+
'__version__': 2})
508+
]
509+
}
510+
widget = self.create_widget(OWEditDomain, stored_settings=settings)
511+
self.assertEqual(widget.output_table_name, "far")
512+
411513

412514
class TestEditors(GuiTest):
413515
def test_variable_editor(self):

0 commit comments

Comments
 (0)