From 5c7ea9d9e42b2d1ba8d016cfeadc6b2d2ba608ed Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 23 Mar 2021 17:48:26 +0100 Subject: [PATCH] enum entity was abstracted to be able do more specific schema validations --- pype/settings/entities/__init__.py | 2 + pype/settings/entities/enum_entity.py | 75 +++++++++++-------- pype/settings/entities/root_entities.py | 3 +- .../settings/settings/widgets/categories.py | 4 +- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/pype/settings/entities/__init__.py b/pype/settings/entities/__init__.py index 20e00de4a5..e0910077df 100644 --- a/pype/settings/entities/__init__.py +++ b/pype/settings/entities/__init__.py @@ -96,6 +96,7 @@ from .input_entities import ( ) from .enum_entity import ( + BaseEnumEntity, EnumEntity, AppsEnumEntity, ToolsEnumEntity @@ -141,6 +142,7 @@ __all__ = ( "PathInput", "RawJsonEntity", + "BaseEnumEntity", "EnumEntity", "AppsEnumEntity", "ToolsEnumEntity", diff --git a/pype/settings/entities/enum_entity.py b/pype/settings/entities/enum_entity.py index b7b7d1cf4d..2dcb1a8935 100644 --- a/pype/settings/entities/enum_entity.py +++ b/pype/settings/entities/enum_entity.py @@ -6,34 +6,14 @@ from .lib import ( ) -class EnumEntity(InputEntity): - schema_types = ["enum"] - +class BaseEnumEntity(InputEntity): def _item_initalization(self): - self.multiselection = self.schema_data.get("multiselection", False) - self.enum_items = self.schema_data["enum_items"] - if not self.enum_items: - raise ValueError("Attribute `enum_items` is not defined.") - - valid_keys = set() - for item in self.enum_items: - valid_keys.add(tuple(item.keys())[0]) - - self.valid_keys = valid_keys - - if self.multiselection: - self.valid_value_types = (list, ) - self.value_on_not_set = [] - else: - for key in valid_keys: - if self.value_on_not_set is NOT_SET: - self.value_on_not_set = key - break - - self.valid_value_types = (STRING_TYPE, ) - - # GUI attribute - self.placeholder = self.schema_data.get("placeholder") + self.multiselection = True + self.value_on_not_set = None + self.enum_items = None + self.valid_keys = None + self.valid_value_types = None + self.placeholder = None def schema_validations(self): if not isinstance(self.enum_items, list): @@ -78,7 +58,7 @@ class EnumEntity(InputEntity): for item in check_values: if item not in self.valid_keys: raise ValueError( - "{} Invalid value \"{}\". Expected: {}".format( + "{} Invalid value \"{}\". Expected one of: {}".format( self.path, item, self.valid_keys ) ) @@ -86,7 +66,42 @@ class EnumEntity(InputEntity): self._on_value_change() -class AppsEnumEntity(EnumEntity): +class EnumEntity(BaseEnumEntity): + schema_types = ["enum"] + + def _item_initalization(self): + self.multiselection = self.schema_data.get("multiselection", False) + self.enum_items = self.schema_data.get("enum_items") + + valid_keys = set() + for item in self.enum_items or []: + valid_keys.add(tuple(item.keys())[0]) + + self.valid_keys = valid_keys + + if self.multiselection: + self.valid_value_types = (list, ) + self.value_on_not_set = [] + else: + for key in valid_keys: + if self.value_on_not_set is NOT_SET: + self.value_on_not_set = key + break + + self.valid_value_types = (STRING_TYPE, ) + + # GUI attribute + self.placeholder = self.schema_data.get("placeholder") + + def schema_validations(self): + if not self.enum_items and "enum_items" not in self.schema_data: + raise EntitySchemaError( + self, "Enum item must have defined `enum_items`" + ) + super().schema_validations() + + +class AppsEnumEntity(BaseEnumEntity): schema_types = ["apps-enum"] def _item_initalization(self): @@ -139,7 +154,7 @@ class AppsEnumEntity(EnumEntity): self._current_value = new_value -class ToolsEnumEntity(EnumEntity): +class ToolsEnumEntity(BaseEnumEntity): schema_types = ["tools-enum"] def _item_initalization(self): diff --git a/pype/settings/entities/root_entities.py b/pype/settings/entities/root_entities.py index 89660971f1..82885e8479 100644 --- a/pype/settings/entities/root_entities.py +++ b/pype/settings/entities/root_entities.py @@ -175,7 +175,8 @@ class RootEntity(BaseItemEntity): entities.BaseItemEntity, entities.ItemEntity, entities.EndpointEntity, - entities.InputEntity + entities.InputEntity, + entities.BaseEnumEntity ) self._loaded_types = {} diff --git a/pype/tools/settings/settings/widgets/categories.py b/pype/tools/settings/settings/widgets/categories.py index 07f7291e91..4cab86c30b 100644 --- a/pype/tools/settings/settings/widgets/categories.py +++ b/pype/tools/settings/settings/widgets/categories.py @@ -15,7 +15,7 @@ from pype.settings.entities import ( NumberEntity, BoolEntity, - EnumEntity, + BaseEnumEntity, TextEntity, PathInput, RawJsonEntity, @@ -112,7 +112,7 @@ class SettingsCategoryWidget(QtWidgets.QWidget): elif isinstance(entity, RawJsonEntity): return RawJsonWidget(*args) - elif isinstance(entity, EnumEntity): + elif isinstance(entity, BaseEnumEntity): return EnumeratorWidget(*args) elif isinstance(entity, PathEntity):