text: #
  # Licensed to the Apache Software Foundation (ASF) under one
  # or more contributor license agreements. See the NOTICE file
  # distributed with this work for additional information
  # regarding copyright ownership. The ASF licenses this file
  # to you under the Apache License, Version 2.0 (the
  # "License"); you may not use this file except in compliance
  # with the License. You may obtain a copy of the License at
  #
  # http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing,
  # software distributed under the License is distributed on an
  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  # KIND, either express or implied. See the License for the
  # specific language governing permissions and limitations
  # under the License.
  #
  
  """
  ML registry
  
  Registry object that will keep information about available algorithms and corresponding endpoints.
  """
  
  from ml.classifiers import Classifier
  from typing import Dict
  from api.models import Algorithm, Dataset
  
  
  def has_empty_values(data: dict):
  
      for key, value in data.items():
          if value == None:
              raise ValueError(f'{key} cannot be null')
  
      return False
  
  
  class MLRegistry:
      def __init__(self):
          self.classifiers: Dict[int, Classifier] = {}
  
      def add_algorithms(self,
                         attrs=[{
                             "classifier": None,
                             "description": None,
                             "status": None,
                             "version": None,
                             "dataset": None,
                             "region": None,
                             "created_by": None
                         }]):
  
          for attr in attrs:
  
              if not has_empty_values(attr):
                  #get dataset
                  dataset, _ = Dataset.objects.get_or_create(
                      name=attr['dataset'], region=attr['region'])
  
                  # get algorithm
                  algorithm, _ = Algorithm.objects.get_or_create(
                      classifier=attr['classifier'].__class__.__name__,
                      description=attr['description'],
                      version=attr['version'],
                      status=attr['status'],
                      dataset=dataset,
                      created_by=attr['created_by'])
                  self.classifiers[algorithm.id] = attr['classifier']
  
          return self.classifiers
  