Pārlūkot izejas kodu

attempt to clean dn inheritance

Toan Quach 1 gadu atpakaļ
vecāks
revīzija
b4a520264b

+ 1 - 1
taipy/core/data/_abstract_file.py

@@ -13,7 +13,7 @@ import pathlib
 import shutil
 import shutil
 
 
 
 
-class _AbstractFileDataNode(object):
+class _AbstractFileDataNodeMixin(object):
     """Abstract base class for data node implementations (CSVDataNode, ParquetDataNode, ExcelDataNode,
     """Abstract base class for data node implementations (CSVDataNode, ParquetDataNode, ExcelDataNode,
     PickleDataNode and JSONDataNode) that are file based."""
     PickleDataNode and JSONDataNode) that are file based."""
 
 

+ 6 - 9
taipy/core/data/_abstract_sql.py

@@ -25,12 +25,12 @@ from taipy.config.common.scope import Scope
 from .._version._version_manager_factory import _VersionManagerFactory
 from .._version._version_manager_factory import _VersionManagerFactory
 from ..data.operator import JoinOperator, Operator
 from ..data.operator import JoinOperator, Operator
 from ..exceptions.exceptions import MissingRequiredProperty, UnknownDatabaseEngine
 from ..exceptions.exceptions import MissingRequiredProperty, UnknownDatabaseEngine
-from ._abstract_tabular import _AbstractTabularDataNode
+from ._abstract_tabular import _AbstractTabularDataNodeMixin
 from .data_node import DataNode
 from .data_node import DataNode
 from .data_node_id import DataNodeId, Edit
 from .data_node_id import DataNodeId, Edit
 
 
 
 
-class _AbstractSQLDataNode(DataNode, _AbstractTabularDataNode):
+class _AbstractSQLDataNode(DataNode, _AbstractTabularDataNodeMixin):
     """Abstract base class for data node implementations (SQLDataNode and SQLTableDataNode) that use SQL."""
     """Abstract base class for data node implementations (SQLDataNode and SQLTableDataNode) that use SQL."""
 
 
     __STORAGE_TYPE = "NOT_IMPLEMENTED"
     __STORAGE_TYPE = "NOT_IMPLEMENTED"
@@ -95,14 +95,11 @@ class _AbstractSQLDataNode(DataNode, _AbstractTabularDataNode):
             properties = {}
             properties = {}
         self._check_required_properties(properties)
         self._check_required_properties(properties)
 
 
-        if self._EXPOSED_TYPE_PROPERTY not in properties.keys():
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
-        elif properties[self._EXPOSED_TYPE_PROPERTY] == self._EXPOSED_TYPE_MODIN:
-            # Deprecated in favor of pandas since 3.1.0
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
+        properties[self._EXPOSED_TYPE_PROPERTY] = _AbstractTabularDataNodeMixin._get_valid_exposed_type(properties)
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
 
 
-        super().__init__(
+        DataNode.__init__(
+            self,
             config_id,
             config_id,
             scope,
             scope,
             id,
             id,
@@ -117,7 +114,7 @@ class _AbstractSQLDataNode(DataNode, _AbstractTabularDataNode):
             editor_expiration_date,
             editor_expiration_date,
             **properties,
             **properties,
         )
         )
-        _AbstractTabularDataNode.__init__(self, **properties)
+        _AbstractTabularDataNodeMixin.__init__(self, **properties)
         self._engine = None
         self._engine = None
         if not self._last_edit_date:  # type: ignore
         if not self._last_edit_date:  # type: ignore
             self._last_edit_date = datetime.now()
             self._last_edit_date = datetime.now()

+ 15 - 4
taipy/core/data/_abstract_tabular.py

@@ -17,7 +17,7 @@ import pandas as pd
 from ..exceptions.exceptions import InvalidExposedType
 from ..exceptions.exceptions import InvalidExposedType
 
 
 
 
-class _AbstractTabularDataNode(object):
+class _AbstractTabularDataNodeMixin(object):
     """Abstract base class for tabular data node implementations (CSVDataNode, ParquetDataNode, ExcelDataNode,
     """Abstract base class for tabular data node implementations (CSVDataNode, ParquetDataNode, ExcelDataNode,
     SQLTableDataNode and SQLDataNode) that are tabular representable."""
     SQLTableDataNode and SQLDataNode) that are tabular representable."""
 
 
@@ -53,9 +53,20 @@ class _AbstractTabularDataNode(object):
             return pd.DataFrame.from_records([self._encoder(row) for row in data])
             return pd.DataFrame.from_records([self._encoder(row) for row in data])
         return pd.DataFrame(data)
         return pd.DataFrame(data)
 
 
-    @staticmethod
-    def _check_exposed_type(exposed_type):
-        valid_string_exposed_types = _AbstractTabularDataNode.__VALID_STRING_EXPOSED_TYPES
+    @classmethod
+    def _get_valid_exposed_type(cls, properties: Dict):
+        if (
+            cls._EXPOSED_TYPE_PROPERTY not in properties.keys()
+            or properties[cls._EXPOSED_TYPE_PROPERTY] == cls._EXPOSED_TYPE_MODIN
+        ):
+            # Default exposed type is pandas
+            # Deprecated modin exposed type in favor of pandas since 3.1.0
+            return cls._EXPOSED_TYPE_PANDAS
+        return properties[cls._EXPOSED_TYPE_PROPERTY]
+
+    @classmethod
+    def _check_exposed_type(cls, exposed_type):
+        valid_string_exposed_types = cls.__VALID_STRING_EXPOSED_TYPES
         if isinstance(exposed_type, str) and exposed_type not in valid_string_exposed_types:
         if isinstance(exposed_type, str) and exposed_type not in valid_string_exposed_types:
             raise InvalidExposedType(
             raise InvalidExposedType(
                 f"Invalid string exposed type {exposed_type}. Supported values are "
                 f"Invalid string exposed type {exposed_type}. Supported values are "

+ 5 - 9
taipy/core/data/csv.py

@@ -23,13 +23,13 @@ from taipy.config.common.scope import Scope
 from .._entity._reload import _self_reload
 from .._entity._reload import _self_reload
 from .._version._version_manager_factory import _VersionManagerFactory
 from .._version._version_manager_factory import _VersionManagerFactory
 from ..job.job_id import JobId
 from ..job.job_id import JobId
-from ._abstract_file import _AbstractFileDataNode
-from ._abstract_tabular import _AbstractTabularDataNode
+from ._abstract_file import _AbstractFileDataNodeMixin
+from ._abstract_tabular import _AbstractTabularDataNodeMixin
 from .data_node import DataNode
 from .data_node import DataNode
 from .data_node_id import DataNodeId, Edit
 from .data_node_id import DataNodeId, Edit
 
 
 
 
-class CSVDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
+class CSVDataNode(DataNode, _AbstractFileDataNodeMixin, _AbstractTabularDataNodeMixin):
     """Data Node stored as a CSV file.
     """Data Node stored as a CSV file.
 
 
     Attributes:
     Attributes:
@@ -97,11 +97,7 @@ class CSVDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
         if self._HAS_HEADER_PROPERTY not in properties.keys():
         if self._HAS_HEADER_PROPERTY not in properties.keys():
             properties[self._HAS_HEADER_PROPERTY] = True
             properties[self._HAS_HEADER_PROPERTY] = True
 
 
-        if self._EXPOSED_TYPE_PROPERTY not in properties.keys():
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
-        elif properties[self._EXPOSED_TYPE_PROPERTY] == self._EXPOSED_TYPE_MODIN:
-            # Deprecated in favor of pandas since 3.1.0
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
+        properties[self._EXPOSED_TYPE_PROPERTY] = _AbstractTabularDataNodeMixin._get_valid_exposed_type(properties)
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
 
 
         DataNode.__init__(
         DataNode.__init__(
@@ -120,7 +116,7 @@ class CSVDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
             editor_expiration_date,
             editor_expiration_date,
             **properties,
             **properties,
         )
         )
-        _AbstractTabularDataNode.__init__(self, **properties)
+        _AbstractTabularDataNodeMixin.__init__(self, **properties)
 
 
         self._path = properties.get(self.__PATH_KEY, properties.get(self.__DEFAULT_PATH_KEY))
         self._path = properties.get(self.__PATH_KEY, properties.get(self.__DEFAULT_PATH_KEY))
         if self._path and ".data" in self._path:
         if self._path and ".data" in self._path:

+ 8 - 12
taipy/core/data/excel.py

@@ -24,13 +24,13 @@ from .._entity._reload import _self_reload
 from .._version._version_manager_factory import _VersionManagerFactory
 from .._version._version_manager_factory import _VersionManagerFactory
 from ..exceptions.exceptions import ExposedTypeLengthMismatch, NonExistingExcelSheet, SheetNameLengthMismatch
 from ..exceptions.exceptions import ExposedTypeLengthMismatch, NonExistingExcelSheet, SheetNameLengthMismatch
 from ..job.job_id import JobId
 from ..job.job_id import JobId
-from ._abstract_file import _AbstractFileDataNode
-from ._abstract_tabular import _AbstractTabularDataNode
+from ._abstract_file import _AbstractFileDataNodeMixin
+from ._abstract_tabular import _AbstractTabularDataNodeMixin
 from .data_node import DataNode
 from .data_node import DataNode
 from .data_node_id import DataNodeId, Edit
 from .data_node_id import DataNodeId, Edit
 
 
 
 
-class ExcelDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
+class ExcelDataNode(DataNode, _AbstractFileDataNodeMixin, _AbstractTabularDataNodeMixin):
     """Data Node stored as an Excel file.
     """Data Node stored as an Excel file.
 
 
     The Excel file format is _xlsx_.
     The Excel file format is _xlsx_.
@@ -101,11 +101,7 @@ class ExcelDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
             properties[self.__SHEET_NAME_PROPERTY] = None
             properties[self.__SHEET_NAME_PROPERTY] = None
         if self._HAS_HEADER_PROPERTY not in properties.keys():
         if self._HAS_HEADER_PROPERTY not in properties.keys():
             properties[self._HAS_HEADER_PROPERTY] = True
             properties[self._HAS_HEADER_PROPERTY] = True
-        if self._EXPOSED_TYPE_PROPERTY not in properties.keys():
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
-        elif properties[self._EXPOSED_TYPE_PROPERTY] == self._EXPOSED_TYPE_MODIN:
-            # Deprecated in favor of pandas since 3.1.0
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
+        properties[self._EXPOSED_TYPE_PROPERTY] = _AbstractTabularDataNodeMixin._get_valid_exposed_type(properties)
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
 
 
         DataNode.__init__(
         DataNode.__init__(
@@ -124,7 +120,7 @@ class ExcelDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
             editor_expiration_date,
             editor_expiration_date,
             **properties,
             **properties,
         )
         )
-        _AbstractTabularDataNode.__init__(self, **properties)
+        _AbstractTabularDataNodeMixin.__init__(self, **properties)
         if self._path and ".data" in self._path:
         if self._path and ".data" in self._path:
             self._path = self._migrate_path(self.storage_type(), self._path)
             self._path = self._migrate_path(self.storage_type(), self._path)
 
 
@@ -176,13 +172,13 @@ class ExcelDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
     @staticmethod
     @staticmethod
     def _check_exposed_type(exposed_type):
     def _check_exposed_type(exposed_type):
         if isinstance(exposed_type, str):
         if isinstance(exposed_type, str):
-            _AbstractTabularDataNode._check_exposed_type(exposed_type)
+            _AbstractTabularDataNodeMixin._check_exposed_type(exposed_type)
         elif isinstance(exposed_type, list):
         elif isinstance(exposed_type, list):
             for t in exposed_type:
             for t in exposed_type:
-                _AbstractTabularDataNode._check_exposed_type(t)
+                _AbstractTabularDataNodeMixin._check_exposed_type(t)
         elif isinstance(exposed_type, dict):
         elif isinstance(exposed_type, dict):
             for t in exposed_type.values():
             for t in exposed_type.values():
-                _AbstractTabularDataNode._check_exposed_type(t)
+                _AbstractTabularDataNodeMixin._check_exposed_type(t)
 
 
     def _read(self):
     def _read(self):
         if self.properties[self._EXPOSED_TYPE_PROPERTY] == self._EXPOSED_TYPE_PANDAS:
         if self.properties[self._EXPOSED_TYPE_PROPERTY] == self._EXPOSED_TYPE_PANDAS:

+ 2 - 2
taipy/core/data/json.py

@@ -22,12 +22,12 @@ from taipy.config.common.scope import Scope
 
 
 from .._entity._reload import _self_reload
 from .._entity._reload import _self_reload
 from .._version._version_manager_factory import _VersionManagerFactory
 from .._version._version_manager_factory import _VersionManagerFactory
-from ._abstract_file import _AbstractFileDataNode
+from ._abstract_file import _AbstractFileDataNodeMixin
 from .data_node import DataNode
 from .data_node import DataNode
 from .data_node_id import DataNodeId, Edit
 from .data_node_id import DataNodeId, Edit
 
 
 
 
-class JSONDataNode(DataNode, _AbstractFileDataNode):
+class JSONDataNode(DataNode, _AbstractFileDataNodeMixin):
     """Data Node stored as a JSON file.
     """Data Node stored as a JSON file.
 
 
     Attributes:
     Attributes:

+ 5 - 9
taipy/core/data/parquet.py

@@ -23,13 +23,13 @@ from .._entity._reload import _self_reload
 from .._version._version_manager_factory import _VersionManagerFactory
 from .._version._version_manager_factory import _VersionManagerFactory
 from ..exceptions.exceptions import UnknownCompressionAlgorithm, UnknownParquetEngine
 from ..exceptions.exceptions import UnknownCompressionAlgorithm, UnknownParquetEngine
 from ..job.job_id import JobId
 from ..job.job_id import JobId
-from ._abstract_file import _AbstractFileDataNode
-from ._abstract_tabular import _AbstractTabularDataNode
+from ._abstract_file import _AbstractFileDataNodeMixin
+from ._abstract_tabular import _AbstractTabularDataNodeMixin
 from .data_node import DataNode
 from .data_node import DataNode
 from .data_node_id import DataNodeId, Edit
 from .data_node_id import DataNodeId, Edit
 
 
 
 
-class ParquetDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode):
+class ParquetDataNode(DataNode, _AbstractFileDataNodeMixin, _AbstractTabularDataNodeMixin):
     """Data Node stored as a Parquet file.
     """Data Node stored as a Parquet file.
 
 
     Attributes:
     Attributes:
@@ -134,11 +134,7 @@ class ParquetDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode)
         if self.__WRITE_KWARGS_PROPERTY not in properties.keys():
         if self.__WRITE_KWARGS_PROPERTY not in properties.keys():
             properties[self.__WRITE_KWARGS_PROPERTY] = {}
             properties[self.__WRITE_KWARGS_PROPERTY] = {}
 
 
-        if self._EXPOSED_TYPE_PROPERTY not in properties.keys():
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
-        elif properties[self._EXPOSED_TYPE_PROPERTY] == self._EXPOSED_TYPE_MODIN:
-            # Deprecated in favor of pandas since 3.1.0
-            properties[self._EXPOSED_TYPE_PROPERTY] = self._EXPOSED_TYPE_PANDAS
+        properties[self._EXPOSED_TYPE_PROPERTY] = _AbstractTabularDataNodeMixin._get_valid_exposed_type(properties)
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
         self._check_exposed_type(properties[self._EXPOSED_TYPE_PROPERTY])
 
 
         DataNode.__init__(
         DataNode.__init__(
@@ -157,7 +153,7 @@ class ParquetDataNode(DataNode, _AbstractFileDataNode, _AbstractTabularDataNode)
             editor_expiration_date,
             editor_expiration_date,
             **properties,
             **properties,
         )
         )
-        _AbstractTabularDataNode.__init__(self, **properties)
+        _AbstractTabularDataNodeMixin.__init__(self, **properties)
 
 
         self._path = properties.get(self.__PATH_KEY, properties.get(self.__DEFAULT_PATH_KEY))
         self._path = properties.get(self.__PATH_KEY, properties.get(self.__DEFAULT_PATH_KEY))
 
 

+ 2 - 2
taipy/core/data/pickle.py

@@ -18,12 +18,12 @@ from taipy.config.common.scope import Scope
 
 
 from .._entity._reload import _self_reload
 from .._entity._reload import _self_reload
 from .._version._version_manager_factory import _VersionManagerFactory
 from .._version._version_manager_factory import _VersionManagerFactory
-from ._abstract_file import _AbstractFileDataNode
+from ._abstract_file import _AbstractFileDataNodeMixin
 from .data_node import DataNode
 from .data_node import DataNode
 from .data_node_id import DataNodeId, Edit
 from .data_node_id import DataNodeId, Edit
 
 
 
 
-class PickleDataNode(DataNode, _AbstractFileDataNode):
+class PickleDataNode(DataNode, _AbstractFileDataNodeMixin):
     """Data Node stored as a pickle file.
     """Data Node stored as a pickle file.
 
 
     Attributes:
     Attributes:

+ 3 - 3
taipy/gui_core/_context.py

@@ -52,7 +52,7 @@ from taipy.core import (
 from taipy.core import delete as core_delete
 from taipy.core import delete as core_delete
 from taipy.core import get as core_get
 from taipy.core import get as core_get
 from taipy.core import submit as core_submit
 from taipy.core import submit as core_submit
-from taipy.core.data._abstract_tabular import _AbstractTabularDataNode
+from taipy.core.data._abstract_tabular import _AbstractTabularDataNodeMixin
 from taipy.core.notification import CoreEventConsumerBase, EventEntityType
 from taipy.core.notification import CoreEventConsumerBase, EventEntityType
 from taipy.core.notification.event import Event, EventOperation
 from taipy.core.notification.event import Event, EventOperation
 from taipy.core.notification.notifier import Notifier
 from taipy.core.notification.notifier import Notifier
@@ -724,7 +724,7 @@ class _GuiCoreContext(CoreEventConsumerBase):
 
 
     @staticmethod
     @staticmethod
     def __is_tabular_data(datanode: DataNode, value: t.Any):
     def __is_tabular_data(datanode: DataNode, value: t.Any):
-        if isinstance(datanode, _AbstractTabularDataNode):
+        if isinstance(datanode, _AbstractTabularDataNodeMixin):
             return True
             return True
         if datanode.is_ready_for_reading:
         if datanode.is_ready_for_reading:
             return isinstance(value, (pd.DataFrame, pd.Series, list, tuple, dict))
             return isinstance(value, (pd.DataFrame, pd.Series, list, tuple, dict))
@@ -739,7 +739,7 @@ class _GuiCoreContext(CoreEventConsumerBase):
             and isinstance(dn, DataNode)
             and isinstance(dn, DataNode)
         ):
         ):
             if dn._last_edit_date:
             if dn._last_edit_date:
-                if isinstance(dn, _AbstractTabularDataNode):
+                if isinstance(dn, _AbstractTabularDataNodeMixin):
                     return (None, None, True, None)
                     return (None, None, True, None)
                 try:
                 try:
                     value = dn.read()
                     value = dn.read()