Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/superannotate/lib/app/interface/base_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ def __init__(self, token: TokenStr = None, config_path: str = None):
config = ConfigEntity(SA_TOKEN=token)
elif config_path:
config_path = Path(config_path)
if not Path(config_path).is_file() or not os.access(config_path, os.R_OK):
if not Path(config_path).is_file() or not os.access(
config_path, os.R_OK
):
raise AppException(
f"SuperAnnotate config file {str(config_path)} not found."
)
Expand Down Expand Up @@ -77,8 +79,12 @@ def _retrieve_configs_from_json(path: Path) -> typing.Union[ConfigEntity]:
config = ConfigEntity(SA_TOKEN=token)
except pydantic.ValidationError:
raise pydantic.ValidationError(
[pydantic.error_wrappers.ErrorWrapper(ValueError("Invalid token."), loc='token')],
model=ConfigEntity
[
pydantic.error_wrappers.ErrorWrapper(
ValueError("Invalid token."), loc="token"
)
],
model=ConfigEntity,
)
host = json_data.get("main_endpoint")
verify_ssl = json_data.get("ssl_verify")
Expand Down
1 change: 1 addition & 0 deletions src/superannotate/lib/app/interface/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,5 @@ def wrapped(self, *args, **kwargs):
return pydantic_validate_arguments(func)(self, *args, **kwargs)
except ValidationError as e:
raise AppException(wrap_error(e)) from e

return wrapped
80 changes: 39 additions & 41 deletions src/superannotate/lib/core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@
from logging.handlers import RotatingFileHandler
from os.path import expanduser

from superannotate.lib.core.config import Config
from superannotate.lib.core.enums import AnnotationStatus
from superannotate.lib.core.enums import ApprovalStatus
from superannotate.lib.core.enums import FolderStatus
from superannotate.lib.core.enums import ImageQuality
from superannotate.lib.core.enums import ProjectStatus
from superannotate.lib.core.enums import ProjectType
from superannotate.lib.core.enums import SegmentationStatus
from superannotate.lib.core.enums import TrainingStatus
from superannotate.lib.core.enums import UploadState
from superannotate.lib.core.enums import UserRole
from lib.core.config import Config
from lib.core.enums import AnnotationStatus
from lib.core.enums import ApprovalStatus
from lib.core.enums import FolderStatus
from lib.core.enums import ImageQuality
from lib.core.enums import ProjectStatus
from lib.core.enums import ProjectType
from lib.core.enums import SegmentationStatus
from lib.core.enums import TrainingStatus
from lib.core.enums import UploadState
from lib.core.enums import UserRole


CONFIG = Config()
BACKEND_URL = "https://api.superannotate.com"
HOME_PATH = expanduser("~/.superannotate")

CONFIG_JSON_PATH = f"{HOME_PATH}/config.json"
Expand All @@ -32,38 +34,34 @@

def setup_logging(level=DEFAULT_LOGGING_LEVEL, file_path=LOG_FILE_LOCATION):

global _loggers
if not _loggers.get("sa"):
logger = logging.getLogger("sa")
logger.propagate = True
logger.setLevel(level)
stream_handler = logging.StreamHandler()
formatter = Formatter("SA-PYTHON-SDK - %(levelname)s - %(message)s")
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
try:
log_file_path = os.path.join(file_path, "sa.log")
open(log_file_path, "w").close()
if os.access(log_file_path, os.W_OK):
file_handler = RotatingFileHandler(
log_file_path,
maxBytes=5 * 1024 * 1024,
backupCount=5,
mode="a",
)
file_formatter = Formatter(
"SA-PYTHON-SDK - %(levelname)s - %(asctime)s - %(message)s"
)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
except OSError:
pass
finally:
_loggers["sa"] = logger
logger = logging.getLogger("sa")
for handler in logger.handlers[:]: # remove all old handlers
logger.removeHandler(handler)
logger.propagate = True
logger.setLevel(level)
stream_handler = logging.StreamHandler()
formatter = Formatter("SA-PYTHON-SDK - %(levelname)s - %(message)s")
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
try:
log_file_path = os.path.join(file_path, "sa.log")
open(log_file_path, "w").close()
if os.access(log_file_path, os.W_OK):
file_handler = RotatingFileHandler(
log_file_path,
maxBytes=5 * 1024 * 1024,
backupCount=5,
mode="a",
)
file_formatter = Formatter(
"SA-PYTHON-SDK - %(levelname)s - %(asctime)s - %(message)s"
)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
except OSError as e:
logging.error(e)


BACKEND_URL = "https://api.superannotate.com"

DEFAULT_IMAGE_EXTENSIONS = ["jpg", "jpeg", "png", "tif", "tiff", "webp", "bmp"]
DEFAULT_FILE_EXCLUDE_PATTERNS = ["___save.png", "___fuse.png"]
DEFAULT_VIDEO_EXTENSIONS = ["mp4", "avi", "mov", "webm", "flv", "mpg", "ogg"]
Expand Down
4 changes: 2 additions & 2 deletions src/superannotate/lib/core/entities/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
from lib.core.enums import BaseTitledEnum
from pydantic import BaseModel as PydanticBaseModel
from pydantic import Extra
from pydantic import StrictStr
from pydantic import Field
from pydantic import StrictStr
from pydantic.datetime_parse import parse_datetime
from pydantic.typing import is_namedtuple
from pydantic.utils import ROOT_KEY
Expand Down Expand Up @@ -295,7 +295,7 @@ def map_fields(entity: dict) -> dict:


class TokenStr(StrictStr):
regex = r'^[-.@_A-Za-z0-9]+=\d+$'
regex = r"^[-.@_A-Za-z0-9]+=\d+$"

@classmethod
def validate(cls, value: Union[str]) -> Union[str]:
Expand Down
4 changes: 4 additions & 0 deletions src/superannotate/lib/core/reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ def __init__(
self.session = CONFIG.get_current_session()
self._spinner = None

@property
def log_enabled(self):
return self._log_info

@property
def spinner(self):
return Spinner()
Expand Down
23 changes: 13 additions & 10 deletions src/superannotate/lib/core/serviceproviders.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,28 +312,31 @@ def delete_multiple(

class BaseAnnotationService(SuperannotateServiceProvider):
@abstractmethod
async def get_small_annotations(
async def get_big_annotation(
self,
project: entities.ProjectEntity,
folder: entities.FolderEntity,
items: List[str],
item: entities.BaseItemEntity,
reporter: Reporter,
callback: Callable = None,
) -> List[dict]:
) -> dict:
raise NotImplementedError

@abstractmethod
async def get_big_annotation(
self, project: entities.ProjectEntity, item: dict, reporter: Reporter
) -> dict:
async def list_small_annotations(
self,
project: entities.ProjectEntity,
folder: entities.FolderEntity,
item_ids: List[int],
reporter: Reporter,
callback: Callable = None,
) -> List[dict]:
raise NotImplementedError

@abstractmethod
def sort_items_by_size(
self,
project: entities.ProjectEntity,
folder: entities.FolderEntity,
item_names: List[str],
item_ids: List[int],
) -> Dict[str, List]:
raise NotImplementedError

Expand All @@ -356,7 +359,7 @@ async def download_small_annotations(
reporter: Reporter,
download_path: str,
postfix: str,
items: List[str] = None,
item_ids: List[int],
callback: Callable = None,
):
raise NotImplementedError
Expand Down
Loading