abstract-utilities 0.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- abstract_utilities-0.0.0/PKG-INFO +3 -0
- abstract_utilities-0.0.0/abstract_utilities/__init__.py +135 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/__init__.py +6 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/abstract_classes.py +175 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/caller_utils.py +92 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/class_utils.py +109 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/function_utils.py +153 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/global_utils.py +71 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/imports/imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/imports/utils.py +40 -0
- abstract_utilities-0.0.0/abstract_utilities/class_utils/module_utils.py +63 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/best_match.py +143 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/compare_utils.py +400 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/find_value.py +99 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/imports/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/imports/constants.py +5 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/imports/imports.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/compare_utils/imports/module_imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/__init__.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/directory_utils.py +110 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/imports/imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/name_utils.py +43 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/size_utils.py +57 -0
- abstract_utilities-0.0.0/abstract_utilities/directory_utils/utils.py +117 -0
- abstract_utilities-0.0.0/abstract_utilities/env_utils/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/env_utils/abstractEnv.py +131 -0
- abstract_utilities-0.0.0/abstract_utilities/env_utils/envy_it.py +33 -0
- abstract_utilities-0.0.0/abstract_utilities/env_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/env_utils/imports/imports.py +10 -0
- abstract_utilities-0.0.0/abstract_utilities/env_utils/imports/module_imports.py +21 -0
- abstract_utilities-0.0.0/abstract_utilities/env_utils/imports/utils.py +122 -0
- abstract_utilities-0.0.0/abstract_utilities/error_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/error_utils/error_utils.py +25 -0
- abstract_utilities-0.0.0/abstract_utilities/error_utils/imports/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/error_utils/imports/imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/error_utils/imports/module_imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/imports/__init__.py +5 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/imports/classes.py +414 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/imports/clean_imps.py +145 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/imports/constants.py +96 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/imports/imports.py +15 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/imports/module_imports.py +8 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/__init__.py +7 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/file_filters/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/file_filters/ensure_utils.py +490 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/file_filters/filter_params.py +150 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/file_filters/filter_utils.py +78 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/file_filters/predicate_utils.py +44 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/find_collect.py +200 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/find_content.py +209 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/initFunctionsGen.py +293 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/initFunctionsGens.py +280 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/map_utils.py +29 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/reader_utils/__init__.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/reader_utils/directory_reader.py +53 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/reader_utils/file_reader.py +543 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/reader_utils/file_readers.py +376 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/reader_utils/imports.py +18 -0
- abstract_utilities-0.0.0/abstract_utilities/file_utils/src/reader_utils/pdf_utils.py +300 -0
- abstract_utilities-0.0.0/abstract_utilities/hash_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/hash_utils/hash_utils.py +51 -0
- abstract_utilities-0.0.0/abstract_utilities/hash_utils/imports/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/hash_utils/imports/imports.py +6 -0
- abstract_utilities-0.0.0/abstract_utilities/history_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/history_utils/history_utils.py +37 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/circular_import_finder.py +221 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/circular_import_finder2.py +118 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/imports/__init__.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/imports/constants.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/imports/init_imports.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/imports/module_imports.py +9 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/imports/utils.py +30 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/__init__.py +8 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/clean_imports.py +277 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/dot_utils.py +80 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/extract_utils.py +46 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/import_functions.py +110 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/import_utils.py +338 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/layze_import_utils/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/layze_import_utils/lazy_utils.py +133 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/layze_import_utils/nullProxy.py +37 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/package_utils/__init__.py +139 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/package_utils/context_utils.py +27 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/package_utils/import_collectors.py +53 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/package_utils/path_utils.py +28 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/package_utils/safe_import.py +27 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/pkg_utils.py +194 -0
- abstract_utilities-0.0.0/abstract_utilities/import_utils/src/sysroot_utils.py +112 -0
- abstract_utilities-0.0.0/abstract_utilities/imports/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/imports/imports.py +20 -0
- abstract_utilities-0.0.0/abstract_utilities/imports/utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/imports/utils/utils.py +5500 -0
- abstract_utilities-0.0.0/abstract_utilities/json_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/json_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/json_utils/imports/imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/json_utils/imports/module_imports.py +5 -0
- abstract_utilities-0.0.0/abstract_utilities/json_utils/json_utils.py +775 -0
- abstract_utilities-0.0.0/abstract_utilities/list_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/list_utils/list_utils.py +202 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/__init__.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/abstractLogManager.py +87 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/backups/log_utils.py +253 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/call_response.py +68 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/imports/imports.py +7 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/log_file.py +212 -0
- abstract_utilities-0.0.0/abstract_utilities/log_utils/logger_callable.py +49 -0
- abstract_utilities-0.0.0/abstract_utilities/math_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/math_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/math_utils/imports/imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/math_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/math_utils/math_utils.py +212 -0
- abstract_utilities-0.0.0/abstract_utilities/parse_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/parse_utils/imports/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/parse_utils/imports/constants.py +10 -0
- abstract_utilities-0.0.0/abstract_utilities/parse_utils/imports/imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/parse_utils/imports/module_imports.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/parse_utils/parse_utils.py +539 -0
- abstract_utilities-0.0.0/abstract_utilities/path_utils/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/path_utils/gvfs_utils.py +31 -0
- abstract_utilities-0.0.0/abstract_utilities/path_utils/imports/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/path_utils/imports/imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/path_utils/imports/module_imports.py +7 -0
- abstract_utilities-0.0.0/abstract_utilities/path_utils/path_utils.py +324 -0
- abstract_utilities-0.0.0/abstract_utilities/read_write_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/read_write_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/read_write_utils/imports/imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/read_write_utils/imports/module_imports.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/read_write_utils/read_write_utils.py +438 -0
- abstract_utilities-0.0.0/abstract_utilities/safe_utils/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/safe_utils/imports/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/safe_utils/imports/imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/safe_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/safe_utils/safe_utils.py +186 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/__init__.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/classes.py +126 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/cmd_utils.py +207 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/imports/imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/imports/module_imports.py +4 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/imports/utils.py +189 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/junk/user_utils.py +45 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/pexpect_utils.py +308 -0
- abstract_utilities-0.0.0/abstract_utilities/ssh_utils/type_checks.py +92 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/clean_utils.py +28 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/eat_utils.py +103 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/imports/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/imports/imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/imports/utils.py +81 -0
- abstract_utilities-0.0.0/abstract_utilities/string_utils/replace_utils.py +27 -0
- abstract_utilities-0.0.0/abstract_utilities/thread_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/thread_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/thread_utils/imports/imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/thread_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/thread_utils/thread_utils.py +140 -0
- abstract_utilities-0.0.0/abstract_utilities/time_utils/__init__.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/time_utils/imports/__init__.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/time_utils/imports/imports.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/time_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.0.0/abstract_utilities/time_utils/time_utils.py +392 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/__init__.py +6 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/alpha_utils.py +49 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/ext_utils.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/get_type.py +120 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/imports/__init__.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/imports/constants.py +243 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/imports/imports.py +3 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/imports/module_imports.py +1 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/imports/utils.py +7 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/is_type.py +455 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/make_type.py +109 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/mime_types.py +76 -0
- abstract_utilities-0.0.0/abstract_utilities/type_utils/num_utils.py +19 -0
- abstract_utilities-0.0.0/abstract_utilities.egg-info/PKG-INFO +3 -0
- abstract_utilities-0.0.0/abstract_utilities.egg-info/SOURCES.txt +186 -0
- abstract_utilities-0.0.0/abstract_utilities.egg-info/dependency_links.txt +1 -0
- abstract_utilities-0.0.0/abstract_utilities.egg-info/top_level.txt +1 -0
- abstract_utilities-0.0.0/pyproject.toml +3 -0
- abstract_utilities-0.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
from .imports import *
|
|
2
|
+
from .hash_utils import *
|
|
3
|
+
##from .dynimport import get_abstract_import,import_symbols_to_parent,call_for_all_tabs
|
|
4
|
+
from .json_utils import (unified_json_loader,
|
|
5
|
+
find_keys,
|
|
6
|
+
get_key_values_from_path,
|
|
7
|
+
get_value_from_path,
|
|
8
|
+
find_paths_to_key,
|
|
9
|
+
create_and_read_json,
|
|
10
|
+
unified_json_loader,
|
|
11
|
+
all_try,
|
|
12
|
+
try_json_loads,
|
|
13
|
+
get_error_msg,
|
|
14
|
+
get_any_key,
|
|
15
|
+
get_any_value,
|
|
16
|
+
json_key_or_default,
|
|
17
|
+
format_json_key_values,
|
|
18
|
+
get_all_keys,
|
|
19
|
+
update_dict_value,
|
|
20
|
+
get_all_key_values,
|
|
21
|
+
get_json_data,
|
|
22
|
+
safe_json_dumps,
|
|
23
|
+
safe_json_loads,
|
|
24
|
+
read_from_json,
|
|
25
|
+
safe_load_from_json,
|
|
26
|
+
safe_load_from_file,
|
|
27
|
+
safe_json_reads,
|
|
28
|
+
safe_read_from_json,
|
|
29
|
+
safe_dump_to_file,
|
|
30
|
+
safe_dump_to_json,
|
|
31
|
+
safe_write_to_json,
|
|
32
|
+
safe_write_to_file,
|
|
33
|
+
safe_save_updated_json_data,
|
|
34
|
+
get_result_from_data,
|
|
35
|
+
flatten_json,
|
|
36
|
+
to_json_safe
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
from .directory_utils import *
|
|
40
|
+
from .list_utils import (get_highest_value_obj,
|
|
41
|
+
make_list,
|
|
42
|
+
safe_list_return,
|
|
43
|
+
get_actual_number,
|
|
44
|
+
compare_lists,
|
|
45
|
+
get_symetric_difference,
|
|
46
|
+
list_set,
|
|
47
|
+
make_list_it,
|
|
48
|
+
get_single_from_list
|
|
49
|
+
)
|
|
50
|
+
from .time_utils import (get_time_stamp,
|
|
51
|
+
get_sleep,
|
|
52
|
+
sleep_count_down,
|
|
53
|
+
get_date,
|
|
54
|
+
get_current_time_with_delta,
|
|
55
|
+
format_timestamp,
|
|
56
|
+
timestamp_to_milliseconds,
|
|
57
|
+
parse_timestamp,
|
|
58
|
+
get_time_now_iso,
|
|
59
|
+
is_valid_time)
|
|
60
|
+
from .string_utils import (eatInner,
|
|
61
|
+
eatAll,
|
|
62
|
+
eatOuter,
|
|
63
|
+
url_join,
|
|
64
|
+
capitalize
|
|
65
|
+
)
|
|
66
|
+
from .type_utils import (make_bool,
|
|
67
|
+
T_or_F_obj_eq,
|
|
68
|
+
is_number,
|
|
69
|
+
makeInt,
|
|
70
|
+
str_lower,
|
|
71
|
+
confirm_type,
|
|
72
|
+
get_all_file_types,
|
|
73
|
+
is_media_type,
|
|
74
|
+
get_bool_response,
|
|
75
|
+
get_mime_type,
|
|
76
|
+
get_media_exts,
|
|
77
|
+
if_true_get_string,
|
|
78
|
+
find_for_string,
|
|
79
|
+
is_strings_in_string,
|
|
80
|
+
get_alphabet_str,
|
|
81
|
+
get_alphabet_upper_str,
|
|
82
|
+
get_alphabet_comp_str,
|
|
83
|
+
get_numbers,
|
|
84
|
+
get_numbers_comp,
|
|
85
|
+
is_any_instance,
|
|
86
|
+
break_string,
|
|
87
|
+
MIME_TYPES,
|
|
88
|
+
get_if_None,
|
|
89
|
+
derive_media_type,
|
|
90
|
+
get_media_map
|
|
91
|
+
)
|
|
92
|
+
get_media_types = get_all_types = get_all_file_types
|
|
93
|
+
from .math_utils import (convert_to_percentage,
|
|
94
|
+
exponential,
|
|
95
|
+
get_percentage,
|
|
96
|
+
add_it,
|
|
97
|
+
divide_it,
|
|
98
|
+
exp_it,
|
|
99
|
+
return_0,
|
|
100
|
+
zero_buff_int)
|
|
101
|
+
from .compare_utils import (create_new_name,
|
|
102
|
+
get_last_comp_list,
|
|
103
|
+
get_closest_match_from_list,
|
|
104
|
+
get_first_match,
|
|
105
|
+
get_all_match,
|
|
106
|
+
best_match)
|
|
107
|
+
from .thread_utils import ThreadManager
|
|
108
|
+
from .history_utils import HistoryManager
|
|
109
|
+
|
|
110
|
+
from .parse_utils import (num_tokens_from_string,
|
|
111
|
+
chunk_source_code,
|
|
112
|
+
chunk_any_to_tokens,
|
|
113
|
+
detect_language_from_text,
|
|
114
|
+
chunk_by_language_context,
|
|
115
|
+
search_code,
|
|
116
|
+
get_within_quotes)
|
|
117
|
+
|
|
118
|
+
from .log_utils import get_caller_info,get_logFile,print_or_log,get_json_call_response,initialize_call_log
|
|
119
|
+
from .error_utils import try_func
|
|
120
|
+
from .class_utils import *
|
|
121
|
+
from .ssh_utils import *
|
|
122
|
+
from .env_utils import *
|
|
123
|
+
|
|
124
|
+
from .file_utils import *
|
|
125
|
+
from .string_utils import *
|
|
126
|
+
from .import_utils import *
|
|
127
|
+
from .path_utils import *
|
|
128
|
+
from .read_write_utils import (read_from_file,
|
|
129
|
+
write_to_file,
|
|
130
|
+
make_dirs,
|
|
131
|
+
make_dirs,
|
|
132
|
+
copy_files,
|
|
133
|
+
make_path,
|
|
134
|
+
run_cmd
|
|
135
|
+
)
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
from .imports import *
|
|
2
|
+
import inspect
|
|
3
|
+
from dataclasses import fields, is_dataclass, MISSING
|
|
4
|
+
class SingletonMeta(type):
|
|
5
|
+
_instances = {}
|
|
6
|
+
def __call__(cls, *args, **kwargs):
|
|
7
|
+
if cls not in cls._instances:
|
|
8
|
+
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
|
|
9
|
+
return cls._instances[cls]
|
|
10
|
+
|
|
11
|
+
def get_inputs(cls, *args, **kwargs):
|
|
12
|
+
"""
|
|
13
|
+
Dynamically construct a dataclass instance from args and kwargs,
|
|
14
|
+
filling missing values from defaults in the dataclass.
|
|
15
|
+
"""
|
|
16
|
+
fields = list(cls.__annotations__.keys())
|
|
17
|
+
values = {}
|
|
18
|
+
|
|
19
|
+
args = list(args)
|
|
20
|
+
for field in fields:
|
|
21
|
+
if field in kwargs:
|
|
22
|
+
values[field] = kwargs[field]
|
|
23
|
+
elif args:
|
|
24
|
+
values[field] = args.pop(0)
|
|
25
|
+
else:
|
|
26
|
+
values[field] = getattr(cls(), field) # default from dataclass
|
|
27
|
+
|
|
28
|
+
return cls(**values)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SingletonMeta(type):
|
|
33
|
+
_instances = {}
|
|
34
|
+
def __call__(cls, *args, **kwargs):
|
|
35
|
+
if cls not in cls._instances:
|
|
36
|
+
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
|
|
37
|
+
return cls._instances[cls]
|
|
38
|
+
|
|
39
|
+
def get_inputs(cls, *args, **kwargs):
|
|
40
|
+
"""
|
|
41
|
+
Dynamically construct a dataclass instance from args and kwargs,
|
|
42
|
+
filling missing values from defaults in the dataclass.
|
|
43
|
+
"""
|
|
44
|
+
fields = list(cls.__annotations__.keys())
|
|
45
|
+
values = {}
|
|
46
|
+
|
|
47
|
+
args = list(args)
|
|
48
|
+
for field in fields:
|
|
49
|
+
if field in kwargs:
|
|
50
|
+
values[field] = kwargs[field]
|
|
51
|
+
elif args:
|
|
52
|
+
values[field] = args.pop(0)
|
|
53
|
+
else:
|
|
54
|
+
values[field] = getattr(cls(), field) # default from dataclass
|
|
55
|
+
|
|
56
|
+
return cls(*args,**values)
|
|
57
|
+
def get_input_params(func):
|
|
58
|
+
sig = inspect.signature(func)
|
|
59
|
+
return sig.parameters
|
|
60
|
+
def get_args(func, *args,**kwargs):
|
|
61
|
+
parameters = get_input_params(func)
|
|
62
|
+
parameters = dict(parameters)
|
|
63
|
+
for key,value in parameters.items():
|
|
64
|
+
value = str(value)
|
|
65
|
+
if value.startswith('**'):
|
|
66
|
+
kwargs_key = key
|
|
67
|
+
elif value.startswith('*'):
|
|
68
|
+
args_key = key
|
|
69
|
+
kwargs_copy = kwargs.copy()
|
|
70
|
+
for k_key,k_value in kwargs.items():
|
|
71
|
+
if args_key == k_key and isinstance(k_value,list or tuple or set):
|
|
72
|
+
args = args | tuple(k_value)
|
|
73
|
+
del kwargs[k_key]
|
|
74
|
+
return args,kwargs
|
|
75
|
+
|
|
76
|
+
def prune_inputs(func, *args, **kwargs):
|
|
77
|
+
"""
|
|
78
|
+
Smart argument adapter:
|
|
79
|
+
- Detects if func accepts *args or **kwargs
|
|
80
|
+
- Builds new positional arguments from kwargs when appropriate
|
|
81
|
+
- Handles explicit {"args": [...]} convention
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
sig = inspect.signature(func)
|
|
85
|
+
params = sig.parameters
|
|
86
|
+
|
|
87
|
+
has_varargs = any(p.kind == inspect.Parameter.VAR_POSITIONAL for p in params.values())
|
|
88
|
+
has_varkw = any(p.kind == inspect.Parameter.VAR_KEYWORD for p in params.values())
|
|
89
|
+
|
|
90
|
+
new_args = list(args)
|
|
91
|
+
new_kwargs = dict(kwargs)
|
|
92
|
+
|
|
93
|
+
# -----------------------------------------------------------
|
|
94
|
+
# 1. If user provided explicit args: {"args": [...]}
|
|
95
|
+
# -----------------------------------------------------------
|
|
96
|
+
if "args" in new_kwargs:
|
|
97
|
+
explicit_args = new_kwargs.pop("args")
|
|
98
|
+
if isinstance(explicit_args, (list, tuple)):
|
|
99
|
+
new_args.extend(explicit_args)
|
|
100
|
+
else:
|
|
101
|
+
new_args.append(explicit_args)
|
|
102
|
+
|
|
103
|
+
# -----------------------------------------------------------
|
|
104
|
+
# 2. If function has *args, infer which kwargs belong there
|
|
105
|
+
# -----------------------------------------------------------
|
|
106
|
+
if has_varargs:
|
|
107
|
+
|
|
108
|
+
# Heuristic rules for upgrading kwargs to args:
|
|
109
|
+
# - if the function has NO named params, treat all scalar kwargs as positional
|
|
110
|
+
# - common param names like "file_path" also qualify
|
|
111
|
+
preferred_as_args = {"path", "file", "file_path", "filename", "value"}
|
|
112
|
+
|
|
113
|
+
positional_candidates = []
|
|
114
|
+
|
|
115
|
+
for k in list(new_kwargs.keys()):
|
|
116
|
+
v = new_kwargs[k]
|
|
117
|
+
|
|
118
|
+
# candidate rules:
|
|
119
|
+
if k in preferred_as_args:
|
|
120
|
+
positional_candidates.append(v)
|
|
121
|
+
del new_kwargs[k]
|
|
122
|
+
|
|
123
|
+
# scalars but not mappings/lists (optional)
|
|
124
|
+
elif isinstance(v, (str, int, float)) and len(positional_candidates) == 0:
|
|
125
|
+
positional_candidates.append(v)
|
|
126
|
+
del new_kwargs[k]
|
|
127
|
+
|
|
128
|
+
new_args.extend(positional_candidates)
|
|
129
|
+
|
|
130
|
+
# -----------------------------------------------------------
|
|
131
|
+
# 3. If function does NOT accept **kwargs → strip extras
|
|
132
|
+
# -----------------------------------------------------------
|
|
133
|
+
if not has_varkw:
|
|
134
|
+
allowed = {
|
|
135
|
+
name for name, p in params.items()
|
|
136
|
+
if p.kind in (
|
|
137
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
|
138
|
+
inspect.Parameter.KEYWORD_ONLY
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
new_kwargs = {k: v for k, v in new_kwargs.items() if k in allowed}
|
|
142
|
+
|
|
143
|
+
return tuple(new_args), new_kwargs
|
|
144
|
+
def run_pruned_func(func, *args, **kwargs):
|
|
145
|
+
args,kwargs = prune_inputs(func, *args, **kwargs)
|
|
146
|
+
return func(*args, **kwargs)
|
|
147
|
+
|
|
148
|
+
def safe_construct(cls, *args, **kwargs):
|
|
149
|
+
"""Build cls from whatever's given. Missing fields -> their default
|
|
150
|
+
(or None if none). Unknown keys -> dropped (or stashed in `extra` if
|
|
151
|
+
the class has one). Never raises on arg mismatch."""
|
|
152
|
+
flds = {f.name: f for f in fields(cls)} if is_dataclass(cls) else {}
|
|
153
|
+
|
|
154
|
+
out = {}
|
|
155
|
+
leftover = dict(kwargs)
|
|
156
|
+
arglist = list(args)
|
|
157
|
+
|
|
158
|
+
for name, f in flds.items():
|
|
159
|
+
if name in leftover:
|
|
160
|
+
out[name] = leftover.pop(name)
|
|
161
|
+
elif arglist:
|
|
162
|
+
out[name] = arglist.pop(0)
|
|
163
|
+
elif f.default is not MISSING:
|
|
164
|
+
out[name] = f.default
|
|
165
|
+
elif f.default_factory is not MISSING:
|
|
166
|
+
out[name] = f.default_factory()
|
|
167
|
+
else:
|
|
168
|
+
out[name] = None # required but absent -> None, no crash
|
|
169
|
+
|
|
170
|
+
# unknown keys: keep them if the class has an `extra` field, else drop
|
|
171
|
+
if "extra" in flds:
|
|
172
|
+
out.setdefault("extra", {})
|
|
173
|
+
out["extra"].update(leftover)
|
|
174
|
+
|
|
175
|
+
return cls(**out)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
from .imports import *
|
|
2
|
+
|
|
3
|
+
def get_initial_caller() -> str:
|
|
4
|
+
"""
|
|
5
|
+
Return the TRUE original caller: the entrypoint script that launched the program.
|
|
6
|
+
"""
|
|
7
|
+
main_mod = sys.modules.get('__main__')
|
|
8
|
+
|
|
9
|
+
# interactive environments (REPL) may have no __file__
|
|
10
|
+
if not main_mod or not hasattr(main_mod, '__file__'):
|
|
11
|
+
return None
|
|
12
|
+
|
|
13
|
+
return os.path.realpath(main_mod.__file__)
|
|
14
|
+
def get_initial_caller_dir() -> str:
|
|
15
|
+
"""
|
|
16
|
+
Return the directory of the TRUE original entrypoint script.
|
|
17
|
+
"""
|
|
18
|
+
caller = get_initial_caller()
|
|
19
|
+
return os.path.dirname(caller) if caller else None
|
|
20
|
+
|
|
21
|
+
def get_caller(i: Optional[int] = None) -> str:
|
|
22
|
+
"""
|
|
23
|
+
Return the filename of the calling frame.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
i: Optional stack depth offset.
|
|
27
|
+
None = immediate caller (depth 1).
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Absolute path of the file for the stack frame.
|
|
31
|
+
"""
|
|
32
|
+
depth = 1 if i is None else int(i)
|
|
33
|
+
stack = inspect.stack()
|
|
34
|
+
if depth >= len(stack):
|
|
35
|
+
depth = len(stack) - 1
|
|
36
|
+
return stack[depth].filename
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def get_caller_path(i: Optional[int] = None) -> str:
|
|
40
|
+
"""
|
|
41
|
+
Return the absolute path of the caller's file.
|
|
42
|
+
"""
|
|
43
|
+
depth = 1 if i is None else int(i)
|
|
44
|
+
file_path = get_caller(depth + 1)
|
|
45
|
+
return os.path.realpath(file_path)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_caller_dir(i: Optional[int] = None) -> str:
|
|
49
|
+
"""
|
|
50
|
+
Return the absolute directory of the caller's file.
|
|
51
|
+
"""
|
|
52
|
+
depth = 1 if i is None else int(i)
|
|
53
|
+
abspath = get_caller_path(depth + 1)
|
|
54
|
+
return os.path.dirname(abspath)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def get_original_caller_dir(levels_up: int = None) -> Path:
|
|
58
|
+
"""
|
|
59
|
+
Return the directory of the *original* caller in the call stack.
|
|
60
|
+
|
|
61
|
+
levels_up:
|
|
62
|
+
- None → automatically goes to the bottom-most user-level caller.
|
|
63
|
+
- N → manually walk up N frames for custom behavior.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Path object pointing to caller's directory.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
stack = inspect.stack()
|
|
70
|
+
|
|
71
|
+
# If the user specifies an exact depth
|
|
72
|
+
if levels_up is not None:
|
|
73
|
+
target = min(levels_up + 1, len(stack) - 1)
|
|
74
|
+
frame = stack[target]
|
|
75
|
+
return Path(frame.filename).resolve().parent
|
|
76
|
+
|
|
77
|
+
# Otherwise, auto-detect the FIRST file that isn't inside site-packages or abstract_* utilities
|
|
78
|
+
for frameinfo in reversed(stack):
|
|
79
|
+
file_path = Path(frameinfo.filename).resolve()
|
|
80
|
+
|
|
81
|
+
# Skip internal interpreter/frame files
|
|
82
|
+
if "site-packages" in str(file_path):
|
|
83
|
+
continue
|
|
84
|
+
if "abstract_" in file_path.name:
|
|
85
|
+
continue
|
|
86
|
+
if file_path.name.startswith("<"):
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
return file_path.parent
|
|
90
|
+
|
|
91
|
+
# Fallback: last entry in the stack
|
|
92
|
+
return Path(stack[-1].filename).resolve().parent
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Sheet: Class Utilities
|
|
3
|
+
|
|
4
|
+
Module: class_utils.py
|
|
5
|
+
Part of: abstract_utilities module
|
|
6
|
+
Author: putkoff
|
|
7
|
+
Date: 05/31/2023
|
|
8
|
+
Version: 0.1.2
|
|
9
|
+
|
|
10
|
+
This module contains utility functions tailored for handling classes, objects, and modules. It encapsulates operations like:
|
|
11
|
+
1. Fetching and checking object types.
|
|
12
|
+
2. Manipulating global variables.
|
|
13
|
+
3. Checking object membership in a module.
|
|
14
|
+
4. Inspecting function signatures and their arguments within a module.
|
|
15
|
+
5. Calling functions with supplied arguments.
|
|
16
|
+
6. Converting layout definitions into components.
|
|
17
|
+
7. Retrieving attributes and methods of a module.
|
|
18
|
+
|
|
19
|
+
Function Overview:
|
|
20
|
+
------------------
|
|
21
|
+
- get_type_list: Get a list of common Python types.
|
|
22
|
+
- remove_key: Remove a specified key from a dictionary.
|
|
23
|
+
- get_module_obj: Retrieve an object from a given module.
|
|
24
|
+
- spec_type_mod: Check if an object has a specific type.
|
|
25
|
+
- get_type_mod: Retrieve the type name of a given object.
|
|
26
|
+
- is_module_obj: Check if an object is part of a module.
|
|
27
|
+
- inspect_signature: Fetch the signature of a specified function.
|
|
28
|
+
- get_parameter_defaults: Fetch the default parameter values for a function.
|
|
29
|
+
- convert_layout_to_components: Convert a layout definition to its component representation.
|
|
30
|
+
- get_dir: List all attributes and methods of a module.
|
|
31
|
+
- get_proper_args: Call a function using either positional or keyword arguments.
|
|
32
|
+
- get_fun: Parse a dictionary to retrieve a function and call it.
|
|
33
|
+
- if_none_change: Replace a None object with a default value.
|
|
34
|
+
- call_functions: Call a specified function or method using provided arguments.
|
|
35
|
+
- process_args: Evaluate and process nested function calls in arguments.
|
|
36
|
+
- has_attribute: Check if a function exists in a module.
|
|
37
|
+
- mk_fun: Print a statement indicating the existence of a function in a module.
|
|
38
|
+
|
|
39
|
+
Dependencies:
|
|
40
|
+
-------------
|
|
41
|
+
- inspect
|
|
42
|
+
- json
|
|
43
|
+
|
|
44
|
+
Each function is furnished with its own docstring that elaborates on its purpose, expected inputs, and outputs.
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
from .imports import *
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def inspect_signature(instance: any, function: str):
|
|
51
|
+
"""
|
|
52
|
+
Inspects the signature of a function.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
instance (any): The instance containing the function.
|
|
56
|
+
function (str): The name of the function to inspect.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
inspect.Signature: The signature of the function.
|
|
60
|
+
"""
|
|
61
|
+
return inspect.signature(get_module_obj(instance, function))
|
|
62
|
+
|
|
63
|
+
def get_parameter_defaults(module, function):
|
|
64
|
+
"""
|
|
65
|
+
Retrieves the default parameter values of a function.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
module: The module instance.
|
|
69
|
+
function (str): The name of the function.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
dict: A dictionary containing the parameter names and their default values.
|
|
73
|
+
"""
|
|
74
|
+
signature = inspect_signature(module, function)
|
|
75
|
+
if signature is None:
|
|
76
|
+
return {}
|
|
77
|
+
return json.dumps(remove_key({param_name: param.default if param.default != inspect.Parameter.empty else None for param_name, param in signature.parameters.items()}, 'icon'))
|
|
78
|
+
|
|
79
|
+
def convert_layout_to_components(instance: any = None, component: str = 'function', js: dict = {}):
|
|
80
|
+
"""
|
|
81
|
+
Converts a layout to components.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
instance (any, optional): The instance containing the components. Defaults to None.
|
|
85
|
+
component (str, optional): The name of the component. Defaults to 'function'.
|
|
86
|
+
js (dict, optional): The dictionary of component properties. Defaults to an empty dictionary.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
any: The result of the component conversion.
|
|
90
|
+
"""
|
|
91
|
+
jsN = json.loads(get_parameter_defaults(instance, component))
|
|
92
|
+
keys = list(js.keys())
|
|
93
|
+
for key in jsN:
|
|
94
|
+
if key in js:
|
|
95
|
+
jsN[key] = js[key]
|
|
96
|
+
return call_functions_hard(instance, component, **jsN)
|
|
97
|
+
def get_class_inputs(cls, *args, **kwargs):
|
|
98
|
+
fields = list(cls.__annotations__.keys())
|
|
99
|
+
values = {}
|
|
100
|
+
args = list(args)
|
|
101
|
+
for field in fields:
|
|
102
|
+
if field in kwargs:
|
|
103
|
+
values[field] = kwargs[field]
|
|
104
|
+
elif args:
|
|
105
|
+
values[field] = args.pop(0)
|
|
106
|
+
else:
|
|
107
|
+
values[field] = getattr(cls(), field)
|
|
108
|
+
return cls(**values)
|
|
109
|
+
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
from .imports import *
|
|
2
|
+
def get_proper_args(function,args:(dict or list)={}):
|
|
3
|
+
"""Call a function with either positional or keyword arguments based on the provided args type."""
|
|
4
|
+
return function(*args) if isinstance(args, list) else function(**args)
|
|
5
|
+
def process_args(args):
|
|
6
|
+
"""
|
|
7
|
+
Processes the arguments for a function, replacing nested function calls with their results.
|
|
8
|
+
|
|
9
|
+
Args:
|
|
10
|
+
args (dict): A dictionary of arguments.
|
|
11
|
+
|
|
12
|
+
Returns:
|
|
13
|
+
dict: A dictionary of processed arguments.
|
|
14
|
+
"""
|
|
15
|
+
for key, value in args.items():
|
|
16
|
+
# check if value is a dict and has a 'type' key with value 'get'
|
|
17
|
+
if isinstance(value, dict) and value.get('type') == 'get':
|
|
18
|
+
function_name = value.get('name',None)
|
|
19
|
+
function_args = value.get('args', {})
|
|
20
|
+
instance = value.get('instance',None)
|
|
21
|
+
glob = value.get('global',globals())
|
|
22
|
+
# call the function and replace the arg with its result
|
|
23
|
+
args[key] = call_functions(function_name, function_args, instance, glob)
|
|
24
|
+
return args
|
|
25
|
+
def get_fun(js):
|
|
26
|
+
"""
|
|
27
|
+
Retrieves and calls a function with the given parameters.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
js (dict): A dictionary that contains function details, including name, arguments, instance (optional), and global scope (optional).
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
any: The result of the function call.
|
|
34
|
+
"""
|
|
35
|
+
# Get function details
|
|
36
|
+
function_name = js.get('name',None)
|
|
37
|
+
if function_name is None:
|
|
38
|
+
return None
|
|
39
|
+
function_args = js.get('args', {})
|
|
40
|
+
instance = js.get('instance',None)
|
|
41
|
+
glob = js.get('global',globals())
|
|
42
|
+
# Process arguments
|
|
43
|
+
function_args = process_args(function_args)
|
|
44
|
+
# If instance is not None, get the function from the instance, else get from globals
|
|
45
|
+
if instance is not None:
|
|
46
|
+
function = getattr(instance, function_name)
|
|
47
|
+
else:
|
|
48
|
+
function = glob[function_name]
|
|
49
|
+
# Get function's valid parameter keys
|
|
50
|
+
sig = inspect.signature(function)
|
|
51
|
+
valid_keys = sig.parameters.keys()
|
|
52
|
+
# Filter arguments to only those accepted by the function
|
|
53
|
+
filtered_args = {k: v for k, v in function_args.items() if k in valid_keys}
|
|
54
|
+
return call_functions(function_name, filtered_args, instance, glob)
|
|
55
|
+
def call_functions(function_name: str, args: dict = {}, instance=None, glob:(dict or bool)=globals()):
|
|
56
|
+
"""
|
|
57
|
+
Calls a function or a method with the given arguments.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
function_name (str): The name of the function.
|
|
61
|
+
args (dict, optional): A dictionary of arguments to pass to the function. Defaults to None.
|
|
62
|
+
instance (optional): The instance on which to call the method. Defaults to None.
|
|
63
|
+
glob (optional): The global scope from which to retrieve the function. Defaults to globals().
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
any: The result of the function or method call.
|
|
67
|
+
"""
|
|
68
|
+
glob = if_none_change(glob,globals())
|
|
69
|
+
args = if_none_change(args,{})
|
|
70
|
+
if instance is not None:
|
|
71
|
+
# Calls method on instance
|
|
72
|
+
method = getattr(instance, function_name)
|
|
73
|
+
return get_proper_args(method,args)
|
|
74
|
+
else:
|
|
75
|
+
# Calls function from globals
|
|
76
|
+
return get_proper_args(glob[function_name],args)
|
|
77
|
+
def get_all_functions_for_instance(instance):
|
|
78
|
+
"""
|
|
79
|
+
Retrieves all callable methods/functions of an object instance.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
instance: The object instance for which to retrieve methods/functions.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
list: A list of method/function names that are callable on the given instance.
|
|
86
|
+
"""
|
|
87
|
+
return [method for method in dir(instance) if callable(getattr(instance, method))]
|
|
88
|
+
def get_all_params(instance, function_name):
|
|
89
|
+
"""
|
|
90
|
+
Retrieves information about the parameters of a callable method/function of an instance.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
instance: The object instance containing the method.
|
|
94
|
+
function_name (str): The name of the method/function to inspect.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
dict: A dictionary containing parameter information, including names, defaults, kinds, and required parameters.
|
|
98
|
+
"""
|
|
99
|
+
# Use getattr() to get the method by name
|
|
100
|
+
method = getattr(instance, function_name, None)
|
|
101
|
+
|
|
102
|
+
if callable(method):
|
|
103
|
+
# Now you have the method, and you can inspect it
|
|
104
|
+
func_signature = inspect.signature(method)
|
|
105
|
+
parameters = func_signature.parameters
|
|
106
|
+
|
|
107
|
+
params = {"names": [], "defaults": [], "kinds": [], "required": []}
|
|
108
|
+
|
|
109
|
+
for param_name, param in parameters.items():
|
|
110
|
+
params["names"].append(param_name)
|
|
111
|
+
params["defaults"].append(param.default)
|
|
112
|
+
params["kinds"].append(param.kind)
|
|
113
|
+
|
|
114
|
+
if param.default == inspect._empty:
|
|
115
|
+
params["required"].append(param_name)
|
|
116
|
+
|
|
117
|
+
return params
|
|
118
|
+
else:
|
|
119
|
+
print(f"{function_name} is not a callable method of the instance.")
|
|
120
|
+
return None
|
|
121
|
+
def mk_fun(module,function):
|
|
122
|
+
"""
|
|
123
|
+
Checks if a function exists in a given module.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
module: The module in which to look for the function.
|
|
127
|
+
function: The function to check.
|
|
128
|
+
|
|
129
|
+
Prints a statement indicating whether the function exists.
|
|
130
|
+
"""
|
|
131
|
+
if has_attribute(module,function):
|
|
132
|
+
print(f"The function {function} exists.")
|
|
133
|
+
else:
|
|
134
|
+
print(f"The function {function} does not exist.")
|
|
135
|
+
def alias(*aliases):
|
|
136
|
+
"""
|
|
137
|
+
Decorator to create multiple names for a function.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
*aliases: Names to assign to the function.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
callable: Decorated function.
|
|
144
|
+
"""
|
|
145
|
+
def decorator(func):
|
|
146
|
+
@functools.wraps(func)
|
|
147
|
+
def wrapper(*args, **kwargs):
|
|
148
|
+
return func(*args, **kwargs)
|
|
149
|
+
# Assign aliases in the module's globals
|
|
150
|
+
for name in aliases:
|
|
151
|
+
globals()[name] = func
|
|
152
|
+
return wrapper
|
|
153
|
+
return decorator
|