|
from typing import Dict, List |
|
|
|
from video import YoutubeVideo |
|
from errors import DifferentNumberOfArgumentsError |
|
|
|
def accepts_types(*expected_types): |
|
"""Decorator that checks that the arguments of a method are valid. |
|
:raise TypeError: If type of argument isn't valid |
|
:raise DifferentNumberOfArgumentsError: If number of arguments passed to the |
|
decorator and to the method (minus self) aren't the same |
|
""" |
|
def check_types(func): |
|
def wrapper(*args, **kwargs): |
|
args_without_self = args[1:] |
|
_raise_error_if_number_of_passed_and_expected_arguments_dont_match(args_without_self, expected_types) |
|
_raise_type_error_if_passed_and_expected_types_dont_match(args_without_self, expected_types) |
|
return func(*args, **kwargs) |
|
return wrapper |
|
return check_types |
|
|
|
def _raise_error_if_number_of_passed_and_expected_arguments_dont_match(passed_args, expected_types): |
|
if len(passed_args) != len(expected_types): |
|
msg = "Number of arguments passed in decorator " \ |
|
f"{len(expected_types)} doesn't match with number of " \ |
|
f"arguments in method, i.e., {len(passed_args)}" |
|
raise DifferentNumberOfArgumentsError(msg) |
|
|
|
def _raise_type_error_if_passed_and_expected_types_dont_match(passed_args, expected_types): |
|
for (arg, expected_type) in zip(passed_args, expected_types): |
|
if not isinstance(arg, expected_type): |
|
raise TypeError(f"Argument '{arg}' is of type {type(arg)}. " |
|
f"'{expected_type}' expected instead") |
|
|
|
def create_videos(video_parameters: List[Dict]) -> List[YoutubeVideo]: |
|
"""Factory function that creates a list of YoutubeVideos from a list of |
|
dictionaries representing video parameters |
|
""" |
|
youtube_videos = [] |
|
for params in video_parameters: |
|
youtube_video = YoutubeVideo(channel_name=params["channel_name"], |
|
url=params["url"]) |
|
youtube_videos.append(youtube_video) |
|
return youtube_videos |
|
|
|
def nest_list(list: list, nested_list_length: int) -> List[List]: |
|
new_list = [] |
|
nested_list = [] |
|
for item in list: |
|
nested_list.append(item) |
|
if len(nested_list) == nested_list_length: |
|
new_list.append(nested_list) |
|
nested_list = [] |
|
if len(nested_list) != 0: |
|
new_list.append(nested_list) |
|
return new_list |
|
|
|
def is_google_colab(): |
|
try: |
|
import google.colab |
|
return True |
|
except: |
|
return False |