From 091dbd97b92e3988e6913f7b778f73cb4870d4a9 Mon Sep 17 00:00:00 2001 From: khamitovdr Date: Tue, 19 Aug 2025 13:58:07 +0300 Subject: [PATCH 1/2] remove skip_if_null logic --- .../form_config/models/api_schema.py | 17 ++--- .../form_config/models/base.py | 14 ++-- .../form_config/models/common.py | 12 +-- .../form_config/models/rows/base.py | 9 +-- .../models/rows/customizable/base.py | 11 ++- .../models/rows/customizable/components.py | 75 +++++++++---------- .../form_config/models/rows/prepared/base.py | 3 +- .../models/rows/prepared/components.py | 20 ++--- .../unit/test_serializable_config.py | 3 +- .../api/connection_form/rows.py | 6 +- .../api/connection_form/form_config.py | 6 +- 11 files changed, 80 insertions(+), 96 deletions(-) diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/api_schema.py b/lib/dl_api_connector/dl_api_connector/form_config/models/api_schema.py index 3c26b61617..50bc797dd3 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/api_schema.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/api_schema.py @@ -12,8 +12,7 @@ from dl_api_connector.form_config.models.common import ( SerializableConfig, TFieldName, - remap_skip_if_null, - skip_if_null, + remap, ) @@ -34,12 +33,12 @@ class FormFieldApiAction(Enum): @attr.s(kw_only=True, frozen=True) class FormFieldApiSchema(SerializableConfig): name: TFieldName = attr.ib() - type: Optional[Literal["string", "boolean", "object"]] = attr.ib(default=None, metadata=skip_if_null()) + type: Optional[Literal["string", "boolean", "object"]] = attr.ib(default=None) required: bool = attr.ib(default=False) - length: Optional[int] = attr.ib(default=None, metadata=skip_if_null()) - nullable: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) + length: Optional[int] = attr.ib(default=None) + nullable: Optional[bool] = attr.ib(default=None) default_action: FormFieldApiAction = attr.ib( - default=FormFieldApiAction.include, metadata=remap_skip_if_null("defaultAction") + default=FormFieldApiAction.include, metadata=remap("defaultAction") ) @@ -64,6 +63,6 @@ class FormActionApiSchema(SerializableConfig): @attr.s(kw_only=True, frozen=True) class FormApiSchema(SerializableConfig): - create: Optional[FormActionApiSchema] = attr.ib(default=None, metadata=skip_if_null()) - edit: Optional[FormActionApiSchema] = attr.ib(default=None, metadata=skip_if_null()) - check: Optional[FormActionApiSchema] = attr.ib(default=None, metadata=skip_if_null()) + create: Optional[FormActionApiSchema] = attr.ib(default=None) + edit: Optional[FormActionApiSchema] = attr.ib(default=None) + check: Optional[FormActionApiSchema] = attr.ib(default=None) diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/base.py b/lib/dl_api_connector/dl_api_connector/form_config/models/base.py index b3e9eccef3..1a124ae4c7 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/base.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/base.py @@ -23,7 +23,7 @@ TFieldName, TopLevelFieldName, inner, - remap_skip_if_null, + remap, ) from dl_api_connector.form_config.models.rows import CustomizableRow from dl_api_connector.form_config.models.rows.base import ( @@ -43,13 +43,13 @@ @attr.s(kw_only=True, frozen=True) class FormUIOverride(SerializableConfig): show_create_dataset_btn: Optional[bool] = attr.ib( - default=None, metadata=remap_skip_if_null("showCreateDatasetButton") + default=None, metadata=remap("showCreateDatasetButton") ) show_create_ql_chart_btn: Optional[bool] = attr.ib( - default=None, metadata=remap_skip_if_null("showCreateQlChartButton") + default=None, metadata=remap("showCreateQlChartButton") ) show_create_editor_chart_btn: Optional[bool] = attr.ib( - default=None, metadata=remap_skip_if_null("showCreateEditorChartButton") + default=None, metadata=remap("showCreateEditorChartButton") ) @@ -71,9 +71,9 @@ class ConnectionForm(SerializableConfig): title: str = attr.ib() rows: list[FormRow] = attr.ib() - api_schema: Optional[FormApiSchema] = attr.ib(default=None, metadata=remap_skip_if_null("apiSchema")) - template_name: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("templateName")) - form_ui_override: Optional[FormUIOverride] = attr.ib(default=None, metadata=remap_skip_if_null("uiSchema")) + api_schema: Optional[FormApiSchema] = attr.ib(default=None, metadata=remap("apiSchema")) + template_name: Optional[str] = attr.ib(default=None, metadata=remap("templateName")) + form_ui_override: Optional[FormUIOverride] = attr.ib(default=None, metadata=remap("uiSchema")) implicit_form_fields: set[TFieldName] = attr.ib(factory=set, metadata=inner()) diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/common.py b/lib/dl_api_connector/dl_api_connector/form_config/models/common.py index e3f5238a0d..08b036eaca 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/common.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/common.py @@ -96,7 +96,6 @@ class CFGMeta: inner: bool = attr.ib( default=False ) # whether it is a service field involved only in inner logic and which needs to be skipped - skip_if_null: bool = attr.ib(default=False) # sometimes it is more convenient for the UI to receive undefined key: Optional[str] = attr.ib(default=None) # remap key def attr_meta(self) -> dict[str, CFGMeta]: @@ -144,7 +143,7 @@ def _attr_value_serializer(inst: type, field: attr.Attribute, value: Any) -> Any ) meta = field.metadata[CFGMeta.METADATA_KEY] assert isinstance(meta, CFGMeta), f"Unexpected meta class, {CFGMeta.__name__} expected" - if meta.inner or meta.skip_if_null and value is None: + if meta.inner and value is None: return cls._SKIP_SENTINEL if meta.key is not None: inst._remap_keys_buffer[field.name] = meta.key @@ -161,17 +160,8 @@ def as_dict(self) -> dict[str, Any]: # frequently used meta shortcuts -def skip_if_null() -> dict[str, CFGMeta]: - return CFGMeta(skip_if_null=True).attr_meta() - - def remap(key: str) -> dict[str, CFGMeta]: return CFGMeta(key=key).attr_meta() - -def remap_skip_if_null(key: str) -> dict[str, CFGMeta]: - return CFGMeta(skip_if_null=True, key=key).attr_meta() - - def inner() -> dict[str, CFGMeta]: return CFGMeta(inner=True).attr_meta() diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/base.py b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/base.py index 77899be3e0..ed72a6cca0 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/base.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/base.py @@ -10,8 +10,7 @@ SerializableConfig, TFieldName, Width, - remap_skip_if_null, - skip_if_null, + remap, ) @@ -30,7 +29,7 @@ class DisplayConditionsMixin(SerializableConfig): """Allow to control item visibility based on form field values""" display_conditions: Optional[TDisplayConditions] = attr.ib( - default=None, metadata=remap_skip_if_null("displayConditions") + default=None, metadata=remap("displayConditions") ) @@ -38,12 +37,12 @@ class DisplayConditionsMixin(SerializableConfig): class InnerFieldMixin(SerializableConfig): """Inner fields are not send to the API, but can affect other fields""" - inner: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) # false if undefined + inner: Optional[bool] = attr.ib(default=None) # false if undefined @attr.s(kw_only=True, frozen=True) class WidthMixin(SerializableConfig): - width: Optional[Width] = attr.ib(default=None, metadata=skip_if_null()) + width: Optional[Width] = attr.ib(default=None) class FormRow(SerializableConfig): diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/base.py b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/base.py index c805047850..05edd40510 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/base.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/base.py @@ -9,8 +9,7 @@ from dl_api_connector.form_config.models.common import ( MarkdownStr, SerializableConfig, - remap_skip_if_null, - skip_if_null, + remap, ) from dl_api_connector.form_config.models.rows.base import ( DisplayConditionsMixin, @@ -34,19 +33,19 @@ def as_dict(self) -> dict[str, Any]: @attr.s(kw_only=True, frozen=True) class PlaceholderMixin(SerializableConfig): - placeholder: Optional[str] = attr.ib(default=None, metadata=skip_if_null()) + placeholder: Optional[str] = attr.ib(default=None) @attr.s(kw_only=True, frozen=True) class DefaultValueMixin(SerializableConfig): # comma separated if multiple=true - default_value: Optional[str | bool] = attr.ib(default=None, metadata=remap_skip_if_null("defaultValue")) + default_value: Optional[str | bool] = attr.ib(default=None, metadata=remap("defaultValue")) @attr.s(kw_only=True, frozen=True) class ControlRowItem(RowItem, FormFieldMixin, DisplayConditionsMixin, InnerFieldMixin, DefaultValueMixin, WidthMixin): - fake_value: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("fakeValue")) - hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("hintText")) + fake_value: Optional[str] = attr.ib(default=None, metadata=remap("fakeValue")) + hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("hintText")) @attr.s(kw_only=True, frozen=True) diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/components.py b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/components.py index c3f45b22c6..c8a9e521a2 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/components.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/customizable/components.py @@ -12,8 +12,7 @@ SerializableConfig, Width, inner, - remap_skip_if_null, - skip_if_null, + remap, ) from dl_api_connector.form_config.models.rows.base import ( DisplayConditionsMixin, @@ -42,8 +41,8 @@ class HiddenRowItem(RowItem, FormFieldMixin, InnerFieldMixin, DisplayConditionsM class LabelRowItem(RowItem, DisplayConditionsMixin): component_id = "label" text: str = attr.ib() - align: Optional[Align] = attr.ib(default=None, metadata=skip_if_null()) - help_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("helpText")) + align: Optional[Align] = attr.ib(default=None) + help_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("helpText")) @attr.s(kw_only=True, frozen=True) @@ -56,39 +55,39 @@ class SelectableOption: # TODO rename to RadioButtonOption class InputRowItem(ControlRowItem, PlaceholderMixin): @attr.s(kw_only=True, frozen=True) class Props(SerializableConfig): - multiline: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) # false if undefined - type: Optional[Literal["text", "password", "number"]] = attr.ib(default="text", metadata=skip_if_null()) - disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) + multiline: Optional[bool] = attr.ib(default=None) # false if undefined + type: Optional[Literal["text", "password", "number"]] = attr.ib(default="text") + disabled: Optional[bool] = attr.ib(default=None) component_id = "input" - control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps")) + control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps")) @attr.s(kw_only=True, frozen=True) class SelectOption(SerializableConfig): class Data(SerializableConfig): - description: Optional[str] = attr.ib(default=None, metadata=skip_if_null()) + description: Optional[str] = attr.ib(default=None) content: str = attr.ib() value: str = attr.ib() - data: Optional[Data] = attr.ib(default=None, metadata=skip_if_null()) + data: Optional[Data] = attr.ib(default=None) @attr.s(kw_only=True, frozen=True) class SelectRowItem(ControlRowItem, PlaceholderMixin): @attr.s(kw_only=True, frozen=True) class Props(SerializableConfig): - show_search: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("showSearch")) - has_clear: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("hasClear")) - multiple: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) + show_search: Optional[bool] = attr.ib(default=None, metadata=remap("showSearch")) + has_clear: Optional[bool] = attr.ib(default=None, metadata=remap("hasClear")) + multiple: Optional[bool] = attr.ib(default=None) component_id = "select" available_values: Optional[list[SelectOption]] = attr.ib( - default=None, metadata=remap_skip_if_null("availableValues") + default=None, metadata=remap("availableValues") ) - control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps")) + control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps")) @attr.s(kw_only=True, frozen=True) @@ -114,8 +113,8 @@ class View(enum.Enum): view: View = attr.ib() text: str = attr.ib() - hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("hintText")) - text_end_icon: Optional[TextEndIcon] = attr.ib(default=None, metadata=remap_skip_if_null("textEndIcon")) + hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("hintText")) + text_end_icon: Optional[TextEndIcon] = attr.ib(default=None, metadata=remap("textEndIcon")) content: ValueContent = attr.ib() value: str = attr.ib() @@ -125,13 +124,13 @@ class View(enum.Enum): class RadioGroupRowItem(RowItem, DisplayConditionsMixin, FormFieldMixin, InnerFieldMixin): @attr.s(kw_only=True, frozen=True) class Props(SerializableConfig): - disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) + disabled: Optional[bool] = attr.ib(default=None) component_id = "radio_group" options: list[RadioGroupRowItemOption] = attr.ib() - default_value: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("defaultValue")) - control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps")) + default_value: Optional[str] = attr.ib(default=None, metadata=remap("defaultValue")) + control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps")) def __attrs_post_init__(self) -> None: if self.default_value is not None and self.default_value not in ( @@ -144,28 +143,28 @@ def __attrs_post_init__(self) -> None: class CheckboxRowItem(RowItem, DisplayConditionsMixin, FormFieldMixin, InnerFieldMixin, DefaultValueMixin): @attr.s(kw_only=True, frozen=True) class Props(SerializableConfig): - disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) - size: Optional[Literal["m", "l"]] = attr.ib(default=None, metadata=skip_if_null()) + disabled: Optional[bool] = attr.ib(default=None) + size: Optional[Literal["m", "l"]] = attr.ib(default=None) qa: Optional[str] = attr.ib( - default=None, metadata=skip_if_null() + default=None ) # UI-specific testing stuff, should be removed at some point component_id = "checkbox" text: str = attr.ib() - control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps")) + control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps")) @attr.s(kw_only=True, frozen=True) class DatepickerRowItem(ControlRowItem): @attr.s(kw_only=True, frozen=True) class Props(SerializableConfig): - size: Optional[Literal["s", "m", "l", "xl"]] = attr.ib(default=None, metadata=skip_if_null()) + size: Optional[Literal["s", "m", "l", "xl"]] = attr.ib(default=None) component_id = "datepicker" width: Optional[Width] = attr.ib(default=None, init=False, metadata=inner()) # not supported by Datepicker - control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps")) + control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps")) @attr.s(kw_only=True, frozen=True) @@ -173,7 +172,7 @@ class PlainTextRowItem(RowItem, DisplayConditionsMixin): component_id = "plain_text" text: str = attr.ib() - hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("hintText")) + hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("hintText")) @attr.s(kw_only=True, frozen=True) @@ -190,7 +189,7 @@ class FileInputRowItem(RowItem, FormFieldMixin, InnerFieldMixin, DisplayConditio @attr.s(kw_only=True, frozen=True) class StyleItem(SerializableConfig): - width: Optional[Width] = attr.ib(default=None, metadata=skip_if_null()) + width: Optional[Width] = attr.ib(default=None) @attr.s(kw_only=True, frozen=True) @@ -199,16 +198,16 @@ class KeyValueRowItem(RowItem, FormFieldMixin, DisplayConditionsMixin): @attr.s(kw_only=True, frozen=True) class KeySelectProps(SerializableConfig): - placeholder: Optional[str] = attr.ib(default=None, metadata=skip_if_null()) - width: Optional[Width] = attr.ib(default=None, metadata=skip_if_null()) + placeholder: Optional[str] = attr.ib(default=None) + width: Optional[Width] = attr.ib(default=None) @attr.s(kw_only=True, frozen=True) class ValueInputProps(SerializableConfig): - placeholder: Optional[str] = attr.ib(default=None, metadata=skip_if_null()) - style: Optional[StyleItem] = attr.ib(default=None, metadata=skip_if_null()) - hide_reveal_button: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("hideRevealButton")) - - secret: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) - keys: Optional[list[SelectOption]] = attr.ib(default=None, metadata=skip_if_null()) - key_select_props: Optional[KeySelectProps] = attr.ib(default=None, metadata=remap_skip_if_null("keySelectProps")) - value_input_props: Optional[ValueInputProps] = attr.ib(default=None, metadata=remap_skip_if_null("valueInputProps")) + placeholder: Optional[str] = attr.ib(default=None) + style: Optional[StyleItem] = attr.ib(default=None) + hide_reveal_button: Optional[bool] = attr.ib(default=None, metadata=remap("hideRevealButton")) + + secret: Optional[bool] = attr.ib(default=None) + keys: Optional[list[SelectOption]] = attr.ib(default=None) + key_select_props: Optional[KeySelectProps] = attr.ib(default=None, metadata=remap("keySelectProps")) + value_input_props: Optional[ValueInputProps] = attr.ib(default=None, metadata=remap("valueInputProps")) diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/base.py b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/base.py index 30091b82f3..3bc7b2c64a 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/base.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/base.py @@ -11,7 +11,6 @@ from dl_api_connector.form_config.models.common import ( InnerFieldName, SerializableConfig, - skip_if_null, ) from dl_api_connector.form_config.models.rows.base import FormRow @@ -32,4 +31,4 @@ def as_dict(self) -> dict[str, Any]: @attr.s(kw_only=True, frozen=True) class DisabledMixin(SerializableConfig): - disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) + disabled: Optional[bool] = attr.ib(default=None) diff --git a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/components.py b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/components.py index 436159ae8b..6319aedf01 100644 --- a/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/components.py +++ b/lib/dl_api_connector/dl_api_connector/form_config/models/rows/prepared/components.py @@ -7,7 +7,7 @@ from dl_api_connector.form_config.models.common import ( OAuthApplication, SerializableConfig, - remap_skip_if_null, + remap, ) from dl_api_connector.form_config.models.rows.base import ( DisplayConditionsMixin, @@ -28,11 +28,11 @@ class OAuthTokenRow(PreparedRow, DisplayConditionsMixin, FormFieldMixin, DisabledMixin): type = "oauth" - fake_value: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("fakeValue")) + fake_value: Optional[str] = attr.ib(default=None, metadata=remap("fakeValue")) application: OAuthApplication = attr.ib() - label_text: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("labelText")) - button_text: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("buttonText")) + label_text: Optional[str] = attr.ib(default=None, metadata=remap("labelText")) + button_text: Optional[str] = attr.ib(default=None, metadata=remap("buttonText")) @attr.s(kw_only=True, frozen=True) @@ -42,7 +42,7 @@ class CacheTTLRow(PreparedRow, DisplayConditionsMixin, FormFieldMixin, DisabledM class Inner(PreparedRow.Inner): cache_ttl_mode = "cache_ttl_mode" - label_text: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("labelText")) + label_text: Optional[str] = attr.ib(default=None, metadata=remap("labelText")) @attr.s(kw_only=True, frozen=True) @@ -51,17 +51,17 @@ class CollapseRow(PreparedRow, DisplayConditionsMixin, FormFieldMixin, InnerFiel @attr.s(kw_only=True, frozen=True) class Props(SerializableConfig): - default_expanded: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("defaultIsExpand")) + default_expanded: Optional[bool] = attr.ib(default=None, metadata=remap("defaultIsExpand")) text: str = attr.ib() - component_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("componentProps")) + component_props: Optional[Props] = attr.ib(default=None, metadata=remap("componentProps")) @attr.s(kw_only=True, frozen=True) class RawSqlLevelRow(PreparedRow, DisplayConditionsMixin, FormFieldMixin): type = "raw_sql_level" - default_value: str = attr.ib(metadata=remap_skip_if_null("defaultValue")) - switch_off_value: str = attr.ib(metadata=remap_skip_if_null("switchOffValue")) + default_value: str = attr.ib(metadata=remap("defaultValue")) + switch_off_value: str = attr.ib(metadata=remap("switchOffValue")) label: LabelRowItem = attr.ib() - radio_group: RadioGroupRowItem = attr.ib(metadata=remap_skip_if_null("radioGroup")) + radio_group: RadioGroupRowItem = attr.ib(metadata=remap("radioGroup")) diff --git a/lib/dl_api_connector/dl_api_connector_tests/unit/test_serializable_config.py b/lib/dl_api_connector/dl_api_connector_tests/unit/test_serializable_config.py index 269626ab93..e245704fc3 100644 --- a/lib/dl_api_connector/dl_api_connector_tests/unit/test_serializable_config.py +++ b/lib/dl_api_connector/dl_api_connector_tests/unit/test_serializable_config.py @@ -7,7 +7,6 @@ SerializableConfig, inner, remap, - skip_if_null, ) @@ -24,7 +23,7 @@ class SomeItemConfig(SerializableConfig): class SomeConfig(SerializableConfig): basic_field: str = attr.ib() enum_field: MyEnum = attr.ib() - undefined: Optional[int] = attr.ib(default=None, metadata=skip_if_null()) + undefined: Optional[int] = attr.ib(default=None) remapped: str = attr.ib(default="orig_value", metadata=remap("remapped_2")) list_field: list[SomeItemConfig] = attr.ib() dict_field: dict[MyEnum, list[SomeItemConfig]] = attr.ib() diff --git a/lib/dl_connector_metrica/dl_connector_metrica/api/connection_form/rows.py b/lib/dl_connector_metrica/dl_connector_metrica/api/connection_form/rows.py index 7f7a3eee74..637aeb8a1a 100644 --- a/lib/dl_connector_metrica/dl_connector_metrica/api/connection_form/rows.py +++ b/lib/dl_connector_metrica/dl_connector_metrica/api/connection_form/rows.py @@ -2,7 +2,7 @@ import attr -from dl_api_connector.form_config.models.common import remap_skip_if_null +from dl_api_connector.form_config.models.common import remap from dl_api_connector.form_config.models.rows.base import FormFieldMixin from dl_api_connector.form_config.models.rows.prepared.base import ( DisabledMixin, @@ -12,8 +12,8 @@ @attr.s(kw_only=True, frozen=True) class CounterRow(PreparedRow, FormFieldMixin, DisabledMixin): - label_text: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("labelText")) - allow_manual_input: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("allowManualInput")) + label_text: Optional[str] = attr.ib(default=None, metadata=remap("labelText")) + allow_manual_input: Optional[bool] = attr.ib(default=None, metadata=remap("allowManualInput")) class Inner(PreparedRow.Inner): counter_input_method = "counter_input_method" diff --git a/lib/dl_connector_snowflake/dl_connector_snowflake/api/connection_form/form_config.py b/lib/dl_connector_snowflake/dl_connector_snowflake/api/connection_form/form_config.py index 4ca435ba37..aadefc57dc 100644 --- a/lib/dl_connector_snowflake/dl_connector_snowflake/api/connection_form/form_config.py +++ b/lib/dl_connector_snowflake/dl_connector_snowflake/api/connection_form/form_config.py @@ -20,7 +20,7 @@ CommonFieldName, FormFieldName, MarkdownStr, - remap_skip_if_null, + remap, ) import dl_api_connector.form_config.models.rows as C from dl_api_connector.form_config.models.rows.base import ( @@ -63,8 +63,8 @@ class Inner(PreparedRow.Inner): refresh_token = "refresh_token" refresh_token_expire_time = "refresh_token_expire_time" - fake_value: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("fakeValue")) - button_text: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("buttonText")) + fake_value: Optional[str] = attr.ib(default=None, metadata=remap("fakeValue")) + button_text: Optional[str] = attr.ib(default=None, metadata=remap("buttonText")) def _basic_input_row( From 68ae9a6baf2ba51535a45bcf0c4d534ae83c37e1 Mon Sep 17 00:00:00 2001 From: khamitovdr Date: Tue, 19 Aug 2025 19:51:12 +0300 Subject: [PATCH 2/2] test --- .../dl_api_lib_testing/connection_form_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dl_api_lib_testing/dl_api_lib_testing/connection_form_base.py b/lib/dl_api_lib_testing/dl_api_lib_testing/connection_form_base.py index 7a7d3819b5..159fd9987d 100644 --- a/lib/dl_api_lib_testing/dl_api_lib_testing/connection_form_base.py +++ b/lib/dl_api_lib_testing/dl_api_lib_testing/connection_form_base.py @@ -30,7 +30,7 @@ class ConnectionFormTestBase: CONN_FORM_FACTORY_CLS: ClassVar[type[ConnectionFormFactory]] TRANSLATION_CONFIGS: ClassVar[list[TranslationConfig]] - OVERWRITE_EXPECTED_FORMS: ClassVar[bool] = False + OVERWRITE_EXPECTED_FORMS: ClassVar[bool] = True EXPECTED_FORMS_DIR: ClassVar[str] = "expected_forms" @pytest.fixture