/ src / evidently / ui / service / workspace / base.py
base.py
  1  import abc
  2  from typing import List
  3  from typing import Optional
  4  from typing import Union
  5  
  6  import pandas as pd
  7  
  8  from evidently.legacy.pipeline.column_mapping import ColumnMapping
  9  from evidently.legacy.report import Report
 10  from evidently.legacy.suite.base_suite import ReportBase
 11  from evidently.legacy.test_suite import TestSuite
 12  from evidently.legacy.ui.base import Project
 13  from evidently.legacy.ui.base import Snapshot
 14  from evidently.legacy.ui.base import SnapshotV2
 15  from evidently.legacy.ui.datasets import DatasetSourceType
 16  from evidently.legacy.ui.datasets import get_dataset_name_output_current
 17  from evidently.legacy.ui.datasets import get_dataset_name_output_reference
 18  from evidently.legacy.ui.type_aliases import STR_UUID
 19  from evidently.legacy.ui.type_aliases import DatasetID
 20  from evidently.legacy.ui.type_aliases import OrgID
 21  from evidently.legacy.ui.type_aliases import TeamID
 22  
 23  
 24  class WorkspaceBase(abc.ABC):
 25      @abc.abstractmethod
 26      def create_project(
 27          self,
 28          name: str,
 29          description: Optional[str] = None,
 30          team_id: Optional[TeamID] = None,
 31          org_id: Optional[OrgID] = None,
 32      ) -> Project:
 33          raise NotImplementedError
 34  
 35      @abc.abstractmethod
 36      def add_project(
 37          self, project: Project, team_id: Optional[TeamID] = None, org_id: Optional[OrgID] = None
 38      ) -> Project:
 39          raise NotImplementedError
 40  
 41      @abc.abstractmethod
 42      def get_project(self, project_id: STR_UUID) -> Optional[Project]:
 43          raise NotImplementedError
 44  
 45      @abc.abstractmethod
 46      def delete_project(self, project_id: STR_UUID):
 47          raise NotImplementedError
 48  
 49      @abc.abstractmethod
 50      def list_projects(self, team_id: Optional[TeamID] = None, org_id: Optional[OrgID] = None) -> List[Project]:
 51          raise NotImplementedError
 52  
 53      def _upload_snapshot_datasets(self, project_id, snapshot, current, reference, column_mapping, run_from):
 54          if current is not None:
 55              dataset_name_current = get_dataset_name_output_current(snapshot.is_report, snapshot.id, run_from)
 56              snapshot.links.datasets.output.current = self.add_dataset(
 57                  current,
 58                  dataset_name_current,
 59                  project_id,
 60                  column_mapping=column_mapping,
 61                  dataset_source=DatasetSourceType.snapshot_builder,
 62              )
 63          if reference is not None:
 64              dataset_name_reference = get_dataset_name_output_reference(snapshot.is_report, snapshot.id, run_from)
 65              snapshot.links.datasets.output.reference = self.add_dataset(
 66                  reference,
 67                  dataset_name_reference,
 68                  project_id,
 69                  column_mapping=column_mapping,
 70                  dataset_source=DatasetSourceType.snapshot_builder,
 71              )
 72  
 73      def _add_report_base(self, project_id: STR_UUID, report: ReportBase, include_data: bool = False):
 74          snapshot = report.to_snapshot()
 75          if include_data:
 76              run_from = "ws"
 77              current, reference = report.datasets()
 78              column_mapping = report.get_column_mapping()
 79              self._upload_snapshot_datasets(project_id, snapshot, current, reference, column_mapping, run_from)
 80          self.add_snapshot(project_id, snapshot)
 81  
 82      def add_report(self, project_id: STR_UUID, report: Report, include_data: bool = False):
 83          self._add_report_base(project_id, report, include_data)
 84  
 85      def add_test_suite(self, project_id: STR_UUID, test_suite: TestSuite, include_data: bool = False):
 86          self._add_report_base(project_id, test_suite, include_data)
 87  
 88      @abc.abstractmethod
 89      def add_snapshot(self, project_id: STR_UUID, snapshot: Snapshot):
 90          raise NotImplementedError
 91  
 92      def add_run(self, project_id: STR_UUID, run: SnapshotV2, include_data: bool = False):
 93          from evidently.core.report import _default_input_data_generator
 94          from evidently.ui.backport import snapshot_v2_to_v1
 95  
 96          snapshot = snapshot_v2_to_v1(run)
 97          if include_data:
 98              run_from = "ws"
 99              input_data = _default_input_data_generator(
100                  run.context,
101                  "default",  # TODO: parametrize task name
102              )
103              reference, current = input_data.get_datasets()
104              column_mapping = input_data.column_mapping
105              self._upload_snapshot_datasets(project_id, snapshot, current, reference, column_mapping, run_from)
106  
107          self.add_snapshot(project_id, snapshot)
108  
109      @abc.abstractmethod
110      def delete_snapshot(self, project_id: STR_UUID, snapshot_id: STR_UUID):
111          raise NotImplementedError
112  
113      @abc.abstractmethod
114      def search_project(
115          self, project_name: str, team_id: Optional[TeamID] = None, org_id: Optional[OrgID] = None
116      ) -> List[Project]:
117          raise NotImplementedError
118  
119      @abc.abstractmethod
120      def add_dataset(
121          self,
122          data_or_path: Union[str, pd.DataFrame],
123          name: str,
124          project_id: STR_UUID,
125          description: Optional[str] = None,
126          column_mapping: Optional[ColumnMapping] = None,
127          dataset_source: DatasetSourceType = DatasetSourceType.file,
128      ) -> DatasetID:
129          raise NotImplementedError