Source code for encord.utilities.client_utilities

# Copyright (c) 2023 Cord Technologies Limited
# Licensed 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
# 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.

import datetime
import pprint
from dataclasses import dataclass
from enum import Enum
from typing import List, Optional, Set, TypeVar, Union

import dateutil

[docs]def pretty_print(data): return pprint.pformat(data, indent=4, width=10)
[docs]class APIKeyScopes(Enum): """ The APIKeyScope is used to provide specific access rights to a project through :meth:`.EncordUserClient.create_project_api_key`. The options are a follows: * ``LABEL_READ``: access to :ref:`tutorials/projects:Getting label rows` * ``LABEL_WRITE``: access to :ref:`tutorials/projects:Saving label rows` * ``MODEL_INFERENCE``: access to :ref:`tutorials/projects:Inference` * ``MODEL_TRAIN``: access to :ref:`tutorials/projects:Creating a model row` and :ref:`tutorials/projects:Training` * ``LABEL_LOGS_READ``: access to :ref:`tutorials/projects:Reviewing label logs` * ``ALGO_LIBRARY``: access to algorithms like :ref:`tutorials/projects:Object interpolation` """ LABEL_READ = "" LABEL_WRITE = "label.write" MODEL_INFERENCE = "model.inference" MODEL_TRAIN = "model.train" LABEL_LOGS_READ = "" ALGO_LIBRARY = "algo.library"
[docs]@dataclass class LocalImport: """ file_path: Supply the path of the exported folder which contains the images and `annotations.xml` file. Make sure to select "Save images" when exporting your CVAT Task or Project. """ file_path: str
ImportMethod = Union[LocalImport] """Using images/videos in cloud storage as an alternative import method will be supported in the future."""
[docs]@dataclass class Issue: """ For each `issue_type` there may be multiple occurrences which are documented in the `instances`. The `instances` list can provide additional information on how the issue was encountered. If there is no additional information available, the `instances` list will be empty. """ issue_type: str instances: List[str]
[docs]@dataclass class Issues: """ Any issues that came up during importing a project. These usually come from incompatibilities between data saved on different platforms. """ errors: List[Issue] warnings: List[Issue] infos: List[Issue]
[docs] @staticmethod def from_dict(d: dict) -> "Issues": errors, warnings, infos = [], [], [] for error in d["errors"]: issue = Issue(issue_type=error["issue_type"], instances=error["instances"]) errors.append(issue) for warning in d["warnings"]: issue = Issue(issue_type=warning["issue_type"], instances=warning["instances"]) warnings.append(issue) for info in d["infos"]: issue = Issue(issue_type=info["issue_type"], instances=info["instances"]) infos.append(issue) return Issues(errors=errors, warnings=warnings, infos=infos)
[docs]@dataclass class CvatImporterSuccess: project_hash: str dataset_hash: str issues: Issues
[docs]@dataclass class CvatImporterError: dataset_hash: str issues: Issues
[docs]def parse_datetime(key, val): if not val: return None if isinstance(val, str): return dateutil.parser.isoparse(val) if isinstance(val, datetime.datetime): return val.isoformat() else: raise ValueError(f"Value for {key} should be a datetime")
T = TypeVar("T")
[docs]def optional_set_to_list(s: Optional[Set[T]]) -> Optional[List[T]]: if s is None: return s else: return list(s)