Spaces:
Runtime error
Runtime error
| import sys | |
| from datetime import datetime, timezone | |
| from zoneinfo import ZoneInfo | |
| from box.color import Code | |
| # from .ic import ic, ib | |
| from box.timer import Timer | |
| from box.ic import ic | |
| from contextlib import contextmanager | |
| def get_args(frame, summary): | |
| import inspect # builtin | |
| if summary.name in [ "<module>", "<listcomp>" ]: | |
| # Line is not inside a function | |
| return [] | |
| if summary.name in frame.f_globals.keys(): | |
| # Line is inside a GLOBAL function | |
| return inspect.getfullargspec(frame.f_globals[summary.name]).args | |
| # Line is inside a LOCAL function of a class | |
| import gc # builtin | |
| # https://stackoverflow.com/a/52762678 | |
| function_object = [obj for obj in gc.get_referrers(frame.f_code) if hasattr(obj, '__code__') and obj.__code__ is frame.f_code][0] | |
| return inspect.getfullargspec(function_object).args | |
| class Frame: | |
| def __init__(self, frame, summary): | |
| from os.path import basename | |
| keys = get_args(frame, summary) | |
| self.signature = "(" + ", ".join(keys) + ")" | |
| self.method = summary.name | |
| self.locals = frame.f_locals | |
| self.line_number = str(summary.lineno) | |
| self.path = basename(summary.filename) | |
| def pretty(self): | |
| from box.ic import Table | |
| header = "\n".join([ self.path+":"+self.line_number, self.method + self.signature ]) | |
| rows = [ (k, v) for k, v in self.locals.items() ] | |
| table = Table() | |
| for row in rows: | |
| table.row(row) | |
| import textwrap # built-in | |
| if table.table: | |
| table_string = "\n".join(str(table).split("\n")[1:]) | |
| else: | |
| table_string = " (empty table)" | |
| table_string = textwrap.dedent(table_string) | |
| table_string = textwrap.indent(table_string, " ") | |
| # print(header + "\n" + table_string) | |
| print(header) | |
| print_variables(self.locals) | |
| def __repr__(self): | |
| repr_string = f"Frame(method={self.method}, locals={self.locals})" | |
| return repr_string | |
| def __getitem__(self, key): | |
| return self.locals[key] | |
| def __str__(self): | |
| return repr(self) | |
| class Frames: | |
| def __init__(self, error): | |
| import traceback | |
| tb = error.__traceback__ | |
| frames = [ frame for frame, _ in traceback.walk_tb(tb) ] | |
| summaries = traceback.extract_tb(tb) | |
| pairs = list(reversed(list(zip(frames, summaries)))) | |
| self.frames = [] | |
| for frame, summary in pairs: | |
| frm = Frame(frame, summary) | |
| self.frames.append(frm) | |
| # self.frames = [ Frame(frame, summary) for frame, summary in pairs ] | |
| def __getitem__(self, index): | |
| return self.frames[index] | |
| def __str__(self): | |
| return str(self.frames) | |
| def __repr__(self): | |
| return str(self.frames) | |
| def pretty(self): | |
| from box.ic import Table | |
| from box.common import truncate | |
| dictionaries = [ ( "i", "method", "local_count", "locals" ) ] | |
| dictionaries = dictionaries + [ ( i, D.method, D.local_count, truncate(str(D.locals), 120) ) for i, D in enumerate(self.frames) ] | |
| table = Table() | |
| for row in dictionaries: | |
| table.row(row) | |
| def print_stack(self): | |
| print() | |
| for frame in self.frames: | |
| frame.pretty() | |
| def color_D_if_big(D): | |
| if len(str(D)) < 120: | |
| return str(D) | |
| else: | |
| colored_items = [] | |
| for i, (k, v) in enumerate(D.items()): | |
| code = Code.CYAN if i % 2 == 0 else Code.LIGHTCYAN_EX | |
| # code = "[cyan]" if i % 2 == 0 else "[blue]" | |
| colored_items.append(code + f"{repr(k)}: {repr(v)}") | |
| return "{" + ", ".join(colored_items) + "}" | |
| def print_variables_by_frame(error): | |
| import traceback | |
| from os.path import basename | |
| import os | |
| import textwrap | |
| import types | |
| from box.ic import Table | |
| tb = error.__traceback__ | |
| frames = [ frame for frame, _ in traceback.walk_tb(tb) ] | |
| summaries = traceback.extract_tb(tb) | |
| pairs = list(reversed(list(zip(frames, summaries)))) | |
| exclude_types = [types.FunctionType, types.ModuleType, types.BuiltinFunctionType, type] | |
| tuples = [] | |
| table = Table() | |
| method_lines = [] | |
| for frame, summary in pairs: | |
| keys = get_args(frame, summary) | |
| signature = "(" + ", ".join(keys) + ")" | |
| method = summary.name | |
| method_line = method + signature if summary.name != "<module>" else "<module>" | |
| method_lines.append(method_line) | |
| METHOD_LINE_LENGTH_LIMIT = 60 | |
| variable_line_width = os.get_terminal_size()[0] - 2*len(table.gutter) - len(table.separator) - min(max(len(method_line) for method_line in method_lines), METHOD_LINE_LENGTH_LIMIT) | |
| for frame, summary in pairs: | |
| keys = get_args(frame, summary) | |
| signature = "(" + ", ".join(keys) + ")" | |
| method = summary.name | |
| local_D = frame.f_locals | |
| method_line = method + signature if summary.name != "<module>" else "<module>" | |
| path_line = basename(summary.filename) + ":" + str(summary.lineno) | |
| variable_D = { k:v for k, v in local_D.items() | |
| if type(v) not in exclude_types and k[0:2] != "__" and str(v)[0] != "<" and not isinstance(v, Exception) } | |
| variable_lines = textwrap.wrap(color_D_if_big(variable_D), variable_line_width) | |
| variable_line = "\n".join(variable_lines) | |
| # print(method_line) | |
| # print(path_line) | |
| method_line_wrapped = "\n".join(textwrap.wrap(method_line, METHOD_LINE_LENGTH_LIMIT)) | |
| table.row([method_line_wrapped, variable_line]) | |
| table_string = textwrap.indent(textwrap.dedent("\n".join(str(table).split("\n")[1:])), ' ') | |
| print(Code.LIGHTCYAN_EX + 'Variables by frame') | |
| print(table_string) | |
| def color_error_repr_old(error): | |
| string = repr(error) | |
| lhs, rhs = string.split("'", 1) | |
| rhs = "'" + rhs[:-1] | |
| lhs = Code.LIGHTRED_EX + lhs | |
| rhs = (Code.YELLOW + rhs) + (Code.LIGHTRED_EX + ')') | |
| colored_string = lhs + rhs | |
| return colored_string | |
| def color_error_regex(error): | |
| string = repr(error) | |
| import re | |
| m = re.match(r"""(\w+\(["'])(.*)(["']\))""", string) | |
| if m is None: | |
| return string | |
| lhs = Code.LIGHTRED_EX + m.group(1) | |
| middle = Code.YELLOW + m.group(2) | |
| # middle = re.sub(r"('\w+')", Code.LIGHTCYAN_EX + r'\1', middle) | |
| rhs = Code.LIGHTRED_EX + m.group(3) | |
| colored_string = lhs + middle + rhs | |
| return colored_string | |
| def color_arg(arg): | |
| BLACK = '\x1b[30m' | |
| RED = '\x1b[31m' | |
| GREEN = '\x1b[32m' | |
| YELLOW = '\x1b[33m' | |
| BLUE = '\x1b[34m' | |
| MAGENTA = '\x1b[35m' | |
| CYAN = '\x1b[36m' | |
| WHITE = '\x1b[37m' | |
| LIGHTBLACK_EX = '\x1b[90m' | |
| LIGHTRED_EX = '\x1b[91m' | |
| LIGHTGREEN_EX = '\x1b[92m' | |
| LIGHTYELLOW_EX = '\x1b[93m' | |
| LIGHTBLUE_EX = '\x1b[94m' | |
| LIGHTMAGENTA_EX = '\x1b[95m' | |
| LIGHTCYAN_EX = '\x1b[96m' | |
| LIGHTWHITE_EX = '\x1b[97m' | |
| RESET = '\x1b[39m' | |
| if type(arg) == str: | |
| arg = YELLOW + repr(arg) | |
| else: | |
| arg = CYAN + repr(arg) | |
| return arg | |
| def color_error_repr(error): | |
| BLACK = '\x1b[30m' | |
| RED = '\x1b[31m' | |
| GREEN = '\x1b[32m' | |
| YELLOW = '\x1b[33m' | |
| BLUE = '\x1b[34m' | |
| MAGENTA = '\x1b[35m' | |
| CYAN = '\x1b[36m' | |
| WHITE = '\x1b[37m' | |
| LIGHTBLACK_EX = '\x1b[90m' | |
| LIGHTRED_EX = '\x1b[91m' | |
| LIGHTGREEN_EX = '\x1b[92m' | |
| LIGHTYELLOW_EX = '\x1b[93m' | |
| LIGHTBLUE_EX = '\x1b[94m' | |
| LIGHTMAGENTA_EX = '\x1b[95m' | |
| LIGHTCYAN_EX = '\x1b[96m' | |
| LIGHTWHITE_EX = '\x1b[97m' | |
| RESET = '\x1b[39m' | |
| string = repr(error) | |
| args = ', '.join(color_arg(arg) for arg in error.args) | |
| colored_string = f"{LIGHTRED_EX}{error.__class__.__name__}({YELLOW}{args}{LIGHTRED_EX}){RESET}" | |
| return colored_string | |
| # lhs = Code.LIGHTRED_EX + m.group(1) | |
| # middle = Code.YELLOW + m.group(2) | |
| # # middle = re.sub(r"('\w+')", Code.LIGHTCYAN_EX + r'\1', middle) | |
| # rhs = Code.LIGHTRED_EX + m.group(3) | |
| # colored_string = lhs + middle + rhs | |
| return colored_string | |
| def print_error_information(error): | |
| # C:\Users\vivek\Documents\Python -> ~/Documents/Python | |
| # C:\Users\vivek\AppData\Roaming\Python\Python310\site-packages -> $APPDATA/Python/site-packages | |
| # C:\Program Files\Python310\Lib\site-packages -> | |
| import traceback | |
| import os | |
| from pathlib import Path | |
| tb = error.__traceback__ | |
| print() | |
| print(color_error_repr(error)) | |
| # print(Code.LIGHTRED_EX + repr(error)) | |
| from box.frame import frame_gen | |
| call_frames = list(frame_gen()) | |
| call_file = call_frames[3].f_code.co_filename | |
| frames = [ frame for frame, _ in traceback.walk_tb(tb) ] | |
| summaries = traceback.extract_tb(tb) | |
| pairs = reversed(list(zip(frames, summaries))) | |
| from box.ic import Table | |
| table = Table() | |
| table.gutter = ' ' | |
| table.separator = ' ... ' | |
| green_done = False | |
| for i, (frame, summary) in enumerate(pairs): | |
| filepath = summary.filename | |
| filepath = str(Path(filepath).resolve()) # C:\users -> C:\Users | |
| if os.getcwd() in filepath: | |
| filepath = os.path.relpath(os.path.abspath(filepath)) | |
| else: | |
| homedir = os.path.expanduser("~") | |
| filepath = filepath.replace(homedir, "~") | |
| line_number = summary.lineno | |
| line = summary.line | |
| # line = Code.LIGHTGREEN_EX + line if i == 0 else line | |
| if green_done is False and frame.f_code.co_filename == call_file: | |
| line = Code.LIGHTGREEN_EX + line | |
| green_done = True | |
| lhs_string = f"{filepath}:{line_number}" | |
| table.row([lhs_string, line]) | |
| table_string = str(table) | |
| table_lines = table_string.split("\n") | |
| table_lines = table_lines[1:] | |
| table_string = "\n".join(table_lines) | |
| print(table_string) | |
| # print() | |
| def print_variables(D): | |
| import types | |
| from box.common import truncate | |
| exclude_types = [types.FunctionType, types.ModuleType, types.BuiltinFunctionType, type] | |
| table = [ {"name":k,"type":type(v), "value": truncate(str(v), 160)} for k,v in D.items() | |
| if type(v) not in exclude_types and k[0:2] != "__" and str(v)[0] != "<" and not isinstance(v, Exception) ] | |
| if table: | |
| ic(table) | |
| else: | |
| print(" (empty table)") | |
| def get_error_filepath(): | |
| import platform | |
| import os.path | |
| if platform.system() == 'Linux': | |
| vimpath = "~/.vim" | |
| else: | |
| vimpath = "~/.vimfiles" | |
| folder = os.path.join(os.path.expanduser(vimpath), "tmp") | |
| os.makedirs(folder, exist_ok=True) | |
| filename = 'handler_error.txt' | |
| filepath = os.path.join(folder, filename) | |
| filepath = os.path.abspath(filepath) | |
| return filepath | |
| def write_vim_error_file(error: Exception): | |
| # test.py:34:5: import sys | |
| import linecache | |
| import traceback | |
| import re | |
| from box.ic import ic | |
| import os | |
| from box.frame import frame_gen | |
| call_frames = list(frame_gen()) | |
| call_file = call_frames[3].f_code.co_filename | |
| filepath = get_error_filepath() | |
| frames = [ frame for frame, _ in reversed(list(traceback.walk_tb(error.__traceback__))) ] | |
| error_lines = [] | |
| cc_nr = -1 | |
| for index, frame in enumerate(frames): | |
| path = frame.f_code.co_filename | |
| lineno = frame.f_lineno | |
| line = linecache.getline(path, lineno) | |
| if cc_nr == -1 and path == call_file: | |
| cc_nr = index + 1 | |
| m = re.search(r"\S", line) | |
| if not m: | |
| raise ValueError(f"Error: {line}") | |
| column = m.start() + 1 | |
| error_line = f"{path}:{lineno}:{column}:{line}".rstrip() | |
| error_lines.append(error_line) | |
| with open(filepath, "w") as f: | |
| f.write("\n".join(error_lines)) | |
| # we use threading to make os\.system call not take up 0.08 seconds | |
| if sys.platform == 'win32': | |
| gvim_command = lambda : os.system(f'''start gvim --servername GVIM --remote-send ":call RHEF('{filepath}', {cc_nr})<CR>" ''') | |
| import threading | |
| threading.Thread(target=gvim_command).start() | |
| elif sys.platform == 'linux': | |
| command = f''' | |
| vim --servername FOO --remote-send "<C-w><C-w>:call RHEF('{filepath}', {cc_nr})<CR>" | |
| '''.strip() | |
| # os.system(command) | |
| import threading | |
| threading.Thread(target=lambda : os.system(command)).start() | |
| def handler(): | |
| try: | |
| yield | |
| except Exception as e: | |
| error = e | |
| # append_traceback_to_file(error) | |
| # return | |
| if type(e).__name__ == 'bdb.BdbQuit': | |
| # Exit Via CTRL-D | |
| pass | |
| else: | |
| if False: | |
| write_vim_error_file(e) | |
| print_error_information(e) | |
| # print_variables_by_frame(e) | |
| import sys | |
| # frames = Frames(error) | |
| # for frame in frames: | |
| # | |
| # print(frame.method) | |
| print(Code.LIGHTCYAN_EX + "alias ic, ib | import sys, ic, ib") | |
| print() | |
| # try __builtins__.__dict__ | |
| # if "ipython" in sys.argv[0] or __builtins__.get("get_ipython", False): | |
| if "ipython" in sys.argv[0]: | |
| import importlib | |
| # import ipdb | |
| ipdb = importlib.import_module("ipdb") | |
| ipdb.post_mortem(e.__traceback__) | |
| else: | |
| import pdb | |
| pdb.post_mortem(e.__traceback__) | |
| def divide_by_zero(): | |
| # Error 1: | |
| # ======== | |
| # upper = 5 | |
| # lower = 0 | |
| # result = upper / lower | |
| # Error 2: | |
| # ======== | |
| # item = bytes() | |
| # bytes.encode() | |
| # Error 3: | |
| # ======== | |
| from box.reltools import here | |
| path = here() / "f1/f2/f3/item.txt" # type: ignore[reportOperatorIssue] | |
| path.mkdir(exist_ok=True) | |
| result = 1 | |
| return result | |
| def append_traceback_to_file(error: Exception): | |
| import os.path | |
| import traceback | |
| path = os.path.expanduser("~/.cache/python_common_cache/error-traceback.txt") | |
| folder = os.path.dirname(path) | |
| # ansi constant codes {{{ | |
| ANSI_RED_BG_BLACK_FG = "\x1b[41;30m" | |
| ANSI_GRAY_FG = "\x1b[90m" | |
| ANSI_MAGENTA_FG = "\x1b[35m" | |
| ANSI_BLUE_FG = "\x1b[34m" | |
| ANSI_RESET = "\x1b[0m" | |
| # }}} | |
| dt = datetime.now(ZoneInfo("Asia/Kolkata")).replace(microsecond=0) | |
| if not os.path.exists(folder): | |
| error_tag = ANSI_RED_BG_BLACK_FG + " OSError " + ANSI_RESET | |
| file_tag = ANSI_MAGENTA_FG + "{}".format(os.path.join(os.path.basename(os.path.dirname(__file__)), os.path.basename(__file__))) + ANSI_RESET | |
| datetime_tag = ANSI_GRAY_FG + dt.isoformat() + ANSI_RESET | |
| folder_tag = ANSI_BLUE_FG + folder + ANSI_RESET | |
| error_string = f"{datetime_tag} {file_tag} {error_tag} Directory does not exist: {folder_tag}" | |
| print(error_string) | |
| sys.exit(1) | |
| traceback_string = "".join(traceback.format_exception(type(error), error, error.__traceback__)) | |
| print(traceback_string) | |
| def table_wide(): | |
| pass | |
| # from .ic import Table | |
| # import textwrap | |
| # import json | |
| # # L = [['_make_api_call(self, operation_name, api_params)', '{\'operation_name\': \'PutIntegration\',\'api_params\': {\'restApiId\': \'p343uq88aa\', \'resourceId\':\'tbfu9qe6w7\', \'type\': \'HTTP_PROXY\', \'httpMethod\': \'ANY\',\'integrationHttpMethod\': \'ANY\', \'uri\': \'gql.twitch.tv\',\'connectionType\': \'INTERNET\', \'requestParameters\':{\'integration.request.path.proxy\':\'method.request.path.proxy\',\'integration.request.header.X-Forwarded-For\':\'method.request.header.X-My-X-Forwarded-For\'}},\'operation_model\':OperationModel(name=PutIntegration),\'service_name\': \'apigateway\',\'request_context\': {\'client_region\': \'us-east-2\',\'client_config\': <botocore.config.Config object at0x00000241D3DE7730>, \'has_streaming_input\': False,\'auth_type\': None, \'timestamp\': \'20220209T204914Z\'},\'request_dict\': {\'url_path\': \'/restapis/p343uq88aa/resources/tbfu9qe6w7/methods/ANY/integration\', \'query_string\':{}, \'method\': \'PUT\', \'headers\': {\'Content-Type\':\'application/json\', \'User-Agent\': \'Boto3/1.20.37Python/3.10.1 Windows/10 Botocore/1.23.37\', \'Accept\':\'application/json\'}, \'body\': b\'{"type": "HTTP_PROXY","httpMethod": "ANY", "uri": "gql.twitch.tv","connectionType": "INTERNET", "requestParameters":{"integration.request.path.proxy":"method.request.path.proxy","integration.request.header.X-Forwarded-For":"method.request.header.X-My-X-Forwarded-For"}}\', \'url\':\'https://apigateway.us-east-2.amazonaws.com/restapis/p343uq88aa/resources/tbfu9qe6w7/methods/ANY/integration\', \'context\': {\'client_region\': \'us-east-2\', \'client_config\': <botocore.config.Config object at0x00000241D3DE7730>, \'has_streaming_input\': False,\'auth_type\': None, \'timestamp\': \'20220209T204914Z\'}},\'service_id\': \'api-gateway\',\'event_response\': None, \'parsed_response\':{\'Error\': {\'Message\': \'Invalid HTTP endpoint specified forURI\', \'Code\': \'BadRequestException\'}, \'ResponseMetadata\':{\'RequestId\': \'31570f5f-1014-4d12-a555-9ba1b845a0d9\',\'HTTPStatusCode\': 400, \'HTTPHeaders\': {\'date\': \'Wed, 09 Feb2022 20:49:14 GMT\', \'content-type\': \'application/json\',\'content-length\': \'54\', \'connection\': \'keep-alive\', \'x-amzn-requestid\': \'31570f5f-1014-4d12-a555-9ba1b845a0d9\', \'x-amzn-errortype\': \'BadRequestException\', \'x-amz-apigw-id\':\'NStPrLmBCYcEdtQ=\'}, \'RetryAttempts\': 0}, \'message\':\'Invalid HTTP endpoint specified for URI\'},\'error_code\': \'BadRequestException\'}'], ['_api_call(self)', "{'args': (), 'kwargs': {'restApiId':'p343uq88aa', 'resourceId': 'tbfu9qe6w7', 'type':'HTTP_PROXY', 'httpMethod': 'ANY', 'integrationHttpMethod':'ANY', 'uri': 'gql.twitch.tv', 'connectionType': 'INTERNET','requestParameters': {'integration.request.path.proxy':'method.request.path.proxy','integration.request.header.X-Forwarded-For':'method.request.header.X-My-X-Forwarded-For'}},'operation_name': 'PutIntegration','py_operation_name': 'put_integration'}"], ['init_gateway(self, region, force)', "{'region': 'us-east-2', 'force': False,'session': Session(region_name='us-west-2'),'current_apis': [{'id': 'dtob7epyn2', 'name':'https://api.ipify.org/ - IP Rotate API', 'createdDate':datetime.datetime(2022, 2, 10, 1, 5, 41, tzinfo=tzlocal()),'apiKeySource': 'HEADER', 'endpointConfiguration': {'types':['REGIONAL']}, 'disableExecuteApiEndpoint': False}, {'id':'hfzgbt7mo0', 'name': 'https://gql.twitch.tv/ - IP RotateAPI', 'createdDate': datetime.datetime(2022, 1, 15, 18, 31,15, tzinfo=tzlocal()), 'apiKeySource': 'HEADER','endpointConfiguration': {'types': ['REGIONAL']},'disableExecuteApiEndpoint': False}], 'api':{'id': 'hfzgbt7mo0', 'name': 'https://gql.twitch.tv/ - IPRotate API', 'createdDate': datetime.datetime(2022, 1, 15,18, 31, 15, tzinfo=tzlocal()), 'apiKeySource': 'HEADER','endpointConfiguration': {'types': ['REGIONAL']},'disableExecuteApiEndpoint': False},'create_api_response': {'ResponseMetadata':{'RequestId': 'b46c081f-8baa-4ee4-99a8-5c76ef0a419b','HTTPStatusCode': 201, 'HTTPHeaders': {'date': 'Wed, 09 Feb2022 20:49:13 GMT', 'content-type': 'application/json','content-length': '202', 'connection': 'keep-alive','x-amzn-requestid': 'b46c081f-8baa-4ee4-99a8-5c76ef0a419b','x-amz-apigw-id': 'NStPcLEoiYcEb-Q='}, 'RetryAttempts': 0},'id': 'p343uq88aa', 'name': 'gql.twitch.tv - IP Rotate API','createdDate': datetime.datetime(2022, 2, 10, 2, 19, 13,tzinfo=tzlocal()), 'apiKeySource': 'HEADER','endpointConfiguration': {'types': ['REGIONAL']},'disableExecuteApiEndpoint': False},'get_resource_response': {'ResponseMetadata':{'RequestId': 'd7a96d82-3eca-4b6c-b602-e9944b56e009','HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Wed, 09 Feb2022 20:49:13 GMT', 'content-type': 'application/json','content-length': '42', 'connection': 'keep-alive', 'x-amzn-requestid': 'd7a96d82-3eca-4b6c-b602-e9944b56e009', 'x-amz-apigw-id': 'NStPiKaLCYcEbpA='}, 'RetryAttempts': 0},'items': [{'id': 'tbfu9qe6w7', 'path': '/'}]},'rest_api_id': 'p343uq88aa','create_resource_response': {'ResponseMetadata':{'RequestId': '61d46688-1caf-4e87-8e11-d564d4a6904d','HTTPStatusCode': 201, 'HTTPHeaders': {'date': 'Wed, 09 Feb2022 20:49:13 GMT', 'content-type': 'application/json','content-length': '81', 'connection': 'keep-alive', 'x-amzn-requestid': '61d46688-1caf-4e87-8e11-d564d4a6904d', 'x-amz-apigw-id': 'NStPlLrMiYcEd1w='}, 'RetryAttempts': 0}, 'id':'830kkp', 'parentId': 'tbfu9qe6w7', 'pathPart': '{proxy+}','path': '/{proxy+}'}}"], ['run(self)', "{'self': None}"], ['__get_result(self)', "{'self': None}"], ['result(self, timeout)', "{'self': None, 'timeout': None}"], ['start(self, force, endpoints)', "{'force': False, 'endpoints': [],'new_endpoints': 0, 'futures': [<Future at0x241d10a49d0 state=finished returned dict>, <Future at0x241d10dc970 state=finished raised BadRequestException>,<Future at 0x241d10f8af0 state=finished returned dict>,<Future at 0x241d1128c10 state=finished returned dict>,<Future at 0x241d1128f40 state=finished returned dict>,<Future at 0x241d116cd00 state=finished returned dict>,<Future at 0x241d118cd30 state=finished returned dict>,<Future at 0x241d11b8d60 state=finished returned dict>,<Future at 0x241d11d8d90 state=finished returned dict>,<Future at 0x241d12228c0 state=finished returneddict>], 'region': 'ca-central-1','result': {'success': True, 'endpoint':'mpwkk460o2.execute-api.us-west-2.amazonaws.com', 'new':False}}"], ['post_anonymous(url, data, json, params, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert)', '{\'url\': \'https://gql.twitch.tv/gql\', \'data\':None, \'json\': {\'query\': \' query {c0:clip(slug:"AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC"){slug, videoOffsetSeconds}c1:clip(slug:"HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V"){slug, videoOffsetSeconds}c2:clip(slug:"SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5"){slug, videoOffsetSeconds}c3:clip(slug:"PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9"){slug, videoOffsetSeconds}c4:clip(slug:"CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u"){slug, videoOffsetSeconds} }\'},\'params\': None, \'headers\': {\'Client-Id\':\'kimne78kx3ncx6brgo4mv6wki5h1ko\'}, \'cookies\':None, \'files\': None, \'auth\': None,\'timeout\': None, \'allow_redirects\':None, \'proxies\': None, \'hooks\':None, \'stream\': None, \'verify\':None, \'cert\': None, \'fu\':furl(\'https://gql.twitch.tv/gql\'), \'domain\':\'gql.twitch.tv\', \'endpoints\': {\'api.ipify.org\':[\'f2zfzh3tq3.execute-api.eu-west-1.amazonaws.com\',\'jt27jndj26.execute-api.eu-west-2.amazonaws.com\',\'iwi6olde13.execute-api.eu-central-1.amazonaws.com\',\'5aan9q8hkb.execute-api.eu-north-1.amazonaws.com\',\'2lv7s6djz2.execute-api.eu-west-3.amazonaws.com\',\'hwxvmq4d0k.execute-api.ca-central-1.amazonaws.com\',\'dtob7epyn2.execute-api.us-east-2.amazonaws.com\',\'7ogy03096l.execute-api.us-east-1.amazonaws.com\',\'bw4siipcr8.execute-api.us-west-1.amazonaws.com\',\'0f3l66pta8.execute-api.us-west-2.amazonaws.com\']}}'], ['gql(query)', '{\'query\': \' query {c0:clip(slug:"AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC"){slug, videoOffsetSeconds}c1:clip(slug:"HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V"){slug, videoOffsetSeconds}c2:clip(slug:"SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5"){slug, videoOffsetSeconds}c3:clip(slug:"PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9"){slug, videoOffsetSeconds}c4:clip(slug:"CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u"){slug, videoOffsetSeconds} }\'}'], ['get_clip_offsets(clip_ids)', '{\'clip_ids\': [\'AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC\', \'HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V\', \'SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5\', \'PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9\', \'CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u\'], \'slugs\':[\'AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC\',\'HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V\',\'SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5\',\'PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9\',\'CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u\'],\'aliases\': [\'c0\', \'c1\', \'c2\', \'c3\', \'c4\'],\'url\': \'https://gql.twitch.tv/gql\',\'query_slugs\': [\'AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC\', \'HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V\', \'SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5\', \'PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9\', \'CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u\'], \'query_aliases\': [\'c0\', \'c1\',\'c2\', \'c3\', \'c4\'], \'query_strings\':[\'c0:clip(slug:"AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC"){slug, videoOffsetSeconds}\',\'c1:clip(slug:"HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V"){slug, videoOffsetSeconds}\',\'c2:clip(slug:"SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5"){slug, videoOffsetSeconds}\',\'c3:clip(slug:"PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9"){slug, videoOffsetSeconds}\',\'c4:clip(slug:"CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u"){slug, videoOffsetSeconds}\'],\'query\': \' query {c0:clip(slug:"AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC"){slug, videoOffsetSeconds}c1:clip(slug:"HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V"){slug, videoOffsetSeconds}c2:clip(slug:"SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5"){slug, videoOffsetSeconds}c3:clip(slug:"PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9"){slug, videoOffsetSeconds}c4:clip(slug:"CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u"){slug, videoOffsetSeconds} }\',\'i\': 0, \'alias_to_slug\': {\'c0\':\'AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC\', \'c1\':\'HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V\', \'c2\':\'SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5\', \'c3\':\'PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9\', \'c4\':\'CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u\'},\'slug_to_offset\': {\'AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC\': None, \'HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V\': None, \'SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5\': None, \'PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9\': None, \'CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u\': None}}'], ['duration_runner()', "{'CLIP_COUNT': 5, 'slugs':['AbrasiveGeniusClintTheRinger-eEswgwJ6b0pSfSEC','HappyArborealClipsmomBlargNaut-Qd9yKSJdoj6ghj1V','SpineyMuddyPuddingYouDontSay-qYSaw1qvv4bbn_D5','PuzzledColdbloodedGarbage4Head-XClB8beXWPeSXFf9','CarelessObliqueApeSquadGoals-KR8NUysH7GJ0nV-u']}"], ['<module>', "{'get_dictionaries': []}"], ['handler()', '{}']] | |
| # table = Table() | |
| # for name, value in L: | |
| # w_name = "\n".join(textwrap.wrap(name, 60)) | |
| # row = (w_name, color_D_if_big(D)) | |
| # table.row(row) | |
| # print(table) | |
| # | |
| def library_error(): | |
| import json | |
| json.loads("{'a': 1}") | |
| def main(): | |
| library_error() | |
| if __name__ == "__main__": | |
| timer = Timer() | |
| with handler(): | |
| main() | |