File size: 2,333 Bytes
207ef6f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import sys
sys.path.append(".")

import time, os
from functools import wraps
import argparse
import inspect
import traceback

def time_it(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        elapsed_time = end_time - start_time
        print(f"Function '{func.__name__}' executed in {elapsed_time:.6f} seconds.")
        return result
    return wrapper

def try_wrapper(function, filename, log_path):
    try:
        return function()
    except Exception as e:
        error_trace = traceback.format_exc()

        with open(log_path, 'a') as log_file:
            log_file.write(f"{filename}: {error_trace}\n")
        print(f"Error in {filename}:\n{error_trace}")

def parse_args(main_function):
    parser = argparse.ArgumentParser()

    used_short_versions = set("h")

    signature = inspect.signature(main_function)
    for param_name, param in signature.parameters.items():
        short_version = param_name[0]
        if short_version in used_short_versions or not short_version.isalpha():
            for char in param_name[1:]:
                short_version = char
                if char.isalpha() and short_version not in used_short_versions:
                    break
            else:
                short_version = None
        
        if short_version:
            used_short_versions.add(short_version)
            param_call = (f'-{short_version}', f'--{param_name}')
        else:
            param_call = (f'--{param_name}',)

        if param.default is not inspect.Parameter.empty:
            if param.default is not None:
                param_type = type(param.default)
            else:
                param_type = str
            parser.add_argument(*param_call, type=param_type, default=param.default,
                                help=f"Automatically detected argument: {param_name}, default: {param.default}")
        else:
            parser.add_argument(*param_call, required=True,
                                help=f"Required argument: {param_name}")

    args = parser.parse_args()

    return args

def assert_file_exist(*args):
    path = os.path.join(*args)
    if not os.path.exists(path):
        raise Exception(f"File {path} does not exist")
    
    return path