Source code for Katna.decorators

"""
.. module:: Katna.decorators
    :platform: OS X
    :synopsis: This module has decorators for video and image modules
"""
import os.path
import os
import sys
import errno
import functools
import inspect
import Katna.config as config
from Katna.exceptions import MediapipeAutoflipBuildNotFound


[docs]class VideoDecorators(object): """File validation decorator Arguments: object {[type]} -- [description] Raises: FileNotFoundError: [Video File is missing] Returns: [boolean] -- [if the file exists and is valid] """
[docs] @classmethod def validate_video(cls, decorated): """Validate if the input video is a valid file """ @functools.wraps(decorated) def wrapper(*args, **kwargs): """ wrapper for decorated function Arguments: cls {VideoDecorators} -- [Video decorators class] Raises: FileNotFoundError: [If the file is missing] Returns: [function] -- [Decorated function] """ func_args = inspect.getcallargs(decorated, *args, **kwargs) key = "file_path" if key not in func_args: raise Exception("File_path parameter is missing") else: f_path = func_args.get(key) if bool(f_path is None or os.path.isfile(f_path) is False): raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), f_path) else: return decorated(*args, **kwargs) return wrapper
[docs]class FileDecorators(object): """File validation decorator :raises FileNotFoundError: File or path is incorrect """
[docs] @classmethod def validate_dir_path(cls, decorated): """Validate if the input path is a valid dir or location :param decorated: decorated function :type decorated: function, required :return: function if the path is valid :rtype: function object """ @functools.wraps(decorated) def wrapper(*args, **kwargs): """ wrapper for decorated function. args and kwargs are standard function parameters. """ func_args = inspect.getcallargs(decorated, *args, **kwargs) key = "dir_path" if key not in func_args: raise Exception("dir_path parameter is missing") else: f_path = func_args.get(key) if bool(f_path is None or os.path.exists(f_path) is False): raise NotADirectoryError(errno.ENOENT, os.strerror(errno.ENOENT), f_path) else: return decorated(*args, **kwargs) return wrapper
[docs] @classmethod def validate_file_path(cls, decorated): """Validate if the input path is a valid file or location :param decorated: decorated function :type decorated: function, required :return: function if the path is valid :rtype: function object """ @functools.wraps(decorated) def wrapper(*args, **kwargs): """ wrapper for decorated function. args and kwargs are standard function parameters. """ func_args = inspect.getcallargs(decorated, *args, **kwargs) key = "file_path" if key not in func_args: raise Exception("File_path parameter is missing") else: f_path = func_args.get(key) if bool(f_path is None or os.path.exists(f_path) is False): raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), f_path) else: return decorated(*args, **kwargs) return wrapper
[docs]def exception(logger): """ A decorator that wraps the passed in function and logs exceptions should one occur param logger: The logging object type logger: logger """ def decorator(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except: # log the exception err = "There was an exception in " err += func.__name__ logger.exception(err, exc_info=True) # re-raise the exception raise return wrapper return decorator
[docs]class DebugDecorators(object): """File validation decorator Arguments: object {[type]} -- [description] Raises: None: Returns: [] -- [Decorated function] """
[docs] @classmethod def add_optional_debug_images_for_image_module(cls, decorated): """Add optional debug images in image_module class if DEBUG option is True in config """ @functools.wraps(decorated) def wrapper(*args, **kwargs): """ wrapper for decorated function Arguments: cls {VideoDecorators} -- [Video decorators class] Returns: [function] -- [Decorated function with optional debug images if Debug option is on in config] """ if config.Image.DEBUG == True: returnValue = decorated(*args, **kwargs) args[0].debug_images = args[0].crop_extractor.extracted_feature_maps if args[0].crop_selector.debug_image is not None: args[0].debug_images.append(args[0].crop_selector.debug_image) return returnValue else: return decorated(*args, **kwargs) return wrapper