abstract-utilities 0.2.2.476__tar.gz → 0.2.2.515__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.2.2.476 → abstract_utilities-0.2.2.515}/PKG-INFO +1 -1
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/setup.py +1 -1
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/__init__.py +6 -10
- abstract_utilities-0.2.2.515/src/abstract_utilities/circular_import_finder.py +222 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/circular_import_finder2.py +118 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils/__init__.py +7 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils}/abstract_classes.py +2 -1
- abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils/caller_utils.py +35 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils/class_utils.py +109 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils/function_utils.py +153 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils/imports/utils.py +40 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils/module_utils.py +63 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/directory_utils/__init__.py +4 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/directory_utils/directory_utils.py +94 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/directory_utils/name_utils.py +43 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/directory_utils/size_utils.py +57 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/directory_utils/utils.py +116 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/env_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/env_utils/imports/imports.py +10 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/error_utils/__init__.py +2 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/error_utils}/error_utils.py +1 -1
- abstract_utilities-0.2.2.515/src/abstract_utilities/error_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/error_utils/imports/imports.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/error_utils/imports/module_imports.py +1 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/robust_reader/imports → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils}/__init__.py +1 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/file_utils/imports/constants.py +6 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities}/file_utils/imports/imports.py +21 -10
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/file_utils/imports/module_imports.py +2 -7
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src}/__init__.py +2 -1
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src}/file_filters.py +14 -8
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src}/file_reader.py +1 -1
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src}/file_utils.py +86 -20
- abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src/filter_params.py +155 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src/find_collect.py +270 -0
- abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/req.py → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src/initFunctionsGen.py +2 -45
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src}/map_utils.py +1 -1
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/file_utils/src}/pdf_utils.py +1 -1
- abstract_utilities-0.2.2.515/src/abstract_utilities/hash_utils/__init__.py +2 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/hash_utils}/hash_utils.py +1 -1
- abstract_utilities-0.2.2.515/src/abstract_utilities/hash_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/hash_utils/imports/imports.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/hash_utils/imports/module_imports.py +0 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/history_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/history_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/history_utils/imports/imports.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/history_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/cmd_utils/imports → abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils}/__init__.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/imports/__init__.py +4 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/imports/constants.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/imports/imports.py +4 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/imports/module_imports.py +6 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/imports/utils.py +30 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src}/__init__.py +4 -4
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/clean_imports.py +147 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src}/dot_utils.py +10 -4
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils/function_utils.py → abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/extract_utils.py +1 -4
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/import_functions.py +46 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src}/import_utils.py +14 -8
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/package_utils/__init__.py +139 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/package_utils/context_utils.py +27 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/package_utils/import_collectors.py +53 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/package_utils/path_utils.py +28 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/package_utils/safe_import.py +27 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src/pkg_utils.py +140 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/import_utils/src}/sysroot_utils.py +4 -17
- abstract_utilities-0.2.2.515/src/abstract_utilities/imports.py +18 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/json_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/json_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/json_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/json_utils/imports/module_imports.py +5 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/json_utils}/json_utils.py +2 -11
- abstract_utilities-0.2.2.515/src/abstract_utilities/list_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/list_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/list_utils/imports/imports.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/list_utils/imports/module_imports.py +0 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/__init__.py +5 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/abstractLogManager.py +64 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/call_response.py +68 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/imports/imports.py +7 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/log_file.py +58 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/log_utils/logger_callable.py +49 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/math_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/math_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/math_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/math_utils/imports/module_imports.py +1 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/math_utils}/math_utils.py +1 -3
- abstract_utilities-0.2.2.515/src/abstract_utilities/parse_utils/__init__.py +2 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/parse_utils}/imports/__init__.py +2 -2
- abstract_utilities-0.2.2.515/src/abstract_utilities/parse_utils/imports/constants.py +10 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/parse_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/parse_utils/imports/module_imports.py +4 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/parse_utils}/parse_utils.py +1 -17
- abstract_utilities-0.2.2.515/src/abstract_utilities/path_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/path_utils/imports/__init__.py +3 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/path_utils/imports/imports.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/path_utils/imports/module_imports.py +8 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/path_utils/path_utils.py +251 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/read_write_utils/__init__.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/read_write_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/read_write_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/read_write_utils/imports/module_imports.py +5 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/read_write_utils}/read_write_utils.py +139 -22
- abstract_utilities-0.2.2.515/src/abstract_utilities/safe_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/safe_utils/imports/__init__.py +3 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/safe_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/safe_utils/imports/module_imports.py +2 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/safe_utils}/safe_utils.py +7 -4
- abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils/__init__.py +5 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/ssh_utils/classes.py +0 -1
- {abstract_utilities-0.2.2.476/src/abstract_utilities/cmd_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils}/cmd_utils.py +22 -54
- abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils/imports/__init__.py +3 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils/imports/imports.py +5 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils/imports/module_imports.py +6 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/ssh_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils/imports}/utils.py +1 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/cmd_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils}/pexpect_utils.py +1 -3
- {abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/ssh_utils}/type_checks.py +34 -24
- abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/__init__.py +4 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/clean_utils.py +28 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/eat_utils.py +103 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/imports/__init__.py +3 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/imports/module_imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/imports/utils.py +81 -0
- abstract_utilities-0.2.2.476/src/abstract_utilities/string_utils.py → abstract_utilities-0.2.2.515/src/abstract_utilities/string_utils/replace_utils.py +2 -23
- abstract_utilities-0.2.2.515/src/abstract_utilities/thread_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/thread_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/thread_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/thread_utils/imports/module_imports.py +2 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/thread_utils}/thread_utils.py +1 -3
- abstract_utilities-0.2.2.515/src/abstract_utilities/time_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/time_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/time_utils/imports/imports.py +3 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/time_utils/imports/module_imports.py +1 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/time_utils}/time_utils.py +1 -4
- abstract_utilities-0.2.2.515/src/abstract_utilities/type_utils/__init__.py +3 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/type_utils/alpha_utils.py +59 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/type_utils/imports/__init__.py +2 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/type_utils/imports/imports.py +4 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/type_utils/imports/module_imports.py +1 -0
- abstract_utilities-0.2.2.515/src/abstract_utilities/type_utils/num_utils.py +19 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/type_utils}/type_utils.py +3 -22
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
- abstract_utilities-0.2.2.515/src/abstract_utilities.egg-info/SOURCES.txt +167 -0
- abstract_utilities-0.2.2.476/src/abstract_utilities/class_utils.py +0 -407
- abstract_utilities-0.2.2.476/src/abstract_utilities/cmd_utils/__init__.py +0 -2
- abstract_utilities-0.2.2.476/src/abstract_utilities/cmd_utils/imports/imports.py +0 -10
- abstract_utilities-0.2.2.476/src/abstract_utilities/cmd_utils/user_utils.py +0 -45
- abstract_utilities-0.2.2.476/src/abstract_utilities/collator_utils.py +0 -81
- abstract_utilities-0.2.2.476/src/abstract_utilities/doit.py +0 -49
- abstract_utilities-0.2.2.476/src/abstract_utilities/dynimport.py +0 -186
- abstract_utilities-0.2.2.476/src/abstract_utilities/env_utils/imports/imports.py +0 -8
- abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/__init__.py +0 -3
- abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils/filter_params.py +0 -89
- abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils/find_collect.py +0 -154
- abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils/imports/constants.py +0 -39
- abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/file_utils/imports/module_imports.py +0 -13
- abstract_utilities-0.2.2.476/src/abstract_utilities/file_utils/imports/imports.py +0 -65
- abstract_utilities-0.2.2.476/src/abstract_utilities/log_utils.py +0 -253
- abstract_utilities-0.2.2.476/src/abstract_utilities/path_utils.py +0 -663
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_reader/__init__.py +0 -2
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_reader/file_reader2.py +0 -629
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_reader/file_readers.py +0 -629
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_reader/imports/imports.py +0 -3
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_reader/sadfsad.py +0 -625
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/__init__.py +0 -2
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils/clean_imports.py +0 -175
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils/impot_functions.py +0 -70
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils/safe_import_utils.py +0 -68
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/import_utils/utils.py +0 -25
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/imports.py +0 -8
- abstract_utilities-0.2.2.476/src/abstract_utilities/robust_readers/initFuncGen.py +0 -151
- abstract_utilities-0.2.2.476/src/abstract_utilities/ssh_utils/__init__.py +0 -3
- abstract_utilities-0.2.2.476/src/abstract_utilities/ssh_utils/imports.py +0 -10
- abstract_utilities-0.2.2.476/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -315
- abstract_utilities-0.2.2.476/src/abstract_utilities/string_clean.py +0 -229
- abstract_utilities-0.2.2.476/src/abstract_utilities/tetsts.py +0 -1
- abstract_utilities-0.2.2.476/src/abstract_utilities.egg-info/SOURCES.txt +0 -94
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/README.md +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/pyproject.toml +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/setup.cfg +0 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils}/global_utils.py +0 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities/env_utils → abstract_utilities-0.2.2.515/src/abstract_utilities/class_utils}/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/compare_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/compare_utils/best_match.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/compare_utils/find_value.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/env_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/env_utils/envy_it.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/file_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/file_utils/imports/classes.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/file_utils/imports/clean_imps.py +0 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/history_utils}/history_utils.py +0 -0
- {abstract_utilities-0.2.2.476/src/abstract_utilities → abstract_utilities-0.2.2.515/src/abstract_utilities/list_utils}/list_utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/utils.py +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities.egg-info/requires.txt +0 -0
- {abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: abstract_utilities
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.515
|
|
4
4
|
Summary: abstract_utilities is a collection of utility modules providing a variety of functions to aid in tasks such as data comparison, list manipulation, JSON handling, string manipulation, mathematical computations, and time operations.
|
|
5
5
|
Home-page: https://github.com/AbstractEndeavors/abstract_utilities
|
|
6
6
|
Author: putkoff
|
|
@@ -4,7 +4,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
|
4
4
|
long_description = fh.read()
|
|
5
5
|
setuptools.setup(
|
|
6
6
|
name='abstract_utilities',
|
|
7
|
-
version='0.2.2.
|
|
7
|
+
version='0.2.2.515',
|
|
8
8
|
author='putkoff',
|
|
9
9
|
author_email='partners@abstractendeavors.com',
|
|
10
10
|
description='abstract_utilities is a collection of utility modules providing a variety of functions to aid in tasks such as data comparison, list manipulation, JSON handling, string manipulation, mathematical computations, and time operations.',
|
{abstract_utilities-0.2.2.476 → abstract_utilities-0.2.2.515}/src/abstract_utilities/__init__.py
RENAMED
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
from datetime import timedelta
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
from typing import *
|
|
1
|
+
from .imports import *
|
|
5
2
|
from .hash_utils import *
|
|
6
3
|
##from .dynimport import get_abstract_import,import_symbols_to_parent,call_for_all_tabs
|
|
7
|
-
from .robust_readers import *
|
|
8
|
-
from .dynimport import get_abstract_import
|
|
9
4
|
from .json_utils import (unified_json_loader,
|
|
10
5
|
find_keys,
|
|
11
6
|
get_key_values_from_path,
|
|
@@ -41,6 +36,7 @@ from .json_utils import (unified_json_loader,
|
|
|
41
36
|
)
|
|
42
37
|
from .read_write_utils import (read_from_file,
|
|
43
38
|
write_to_file)
|
|
39
|
+
from .directory_utils import *
|
|
44
40
|
from .path_utils import *
|
|
45
41
|
from .file_utils import *
|
|
46
42
|
from .list_utils import (get_highest_value_obj,
|
|
@@ -61,7 +57,7 @@ from .time_utils import (get_time_stamp,
|
|
|
61
57
|
parse_timestamp,
|
|
62
58
|
get_time_now_iso,
|
|
63
59
|
is_valid_time)
|
|
64
|
-
from .
|
|
60
|
+
from .string_utils import (eatInner,
|
|
65
61
|
eatAll,
|
|
66
62
|
eatOuter,
|
|
67
63
|
url_join,
|
|
@@ -106,7 +102,7 @@ from .compare_utils import (create_new_name,
|
|
|
106
102
|
best_match)
|
|
107
103
|
from .thread_utils import ThreadManager
|
|
108
104
|
from .history_utils import HistoryManager
|
|
109
|
-
|
|
105
|
+
|
|
110
106
|
from .parse_utils import (num_tokens_from_string,
|
|
111
107
|
chunk_source_code,
|
|
112
108
|
chunk_any_to_tokens,
|
|
@@ -116,10 +112,10 @@ from .parse_utils import (num_tokens_from_string,
|
|
|
116
112
|
|
|
117
113
|
from .log_utils import get_caller_info,get_logFile,print_or_log,get_json_call_response,initialize_call_log
|
|
118
114
|
from .error_utils import try_func
|
|
115
|
+
from .class_utils import *
|
|
119
116
|
from .ssh_utils import *
|
|
120
117
|
from .env_utils import *
|
|
121
118
|
from .path_utils import *
|
|
122
119
|
from .file_utils import *
|
|
123
|
-
from .file_utils import call_for_all_tabs
|
|
124
120
|
from .string_utils import *
|
|
125
|
-
from .
|
|
121
|
+
from .import_utils import *
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
from abstract_utilities import *
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
def clean_line(line):
|
|
4
|
+
return eatAll(line,[' ','','\t','\n'])
|
|
5
|
+
def is_from_line_group(line):
|
|
6
|
+
if line and line.startswith(FROM_TAG) and IMPORT_TAG in line and '(' in line:
|
|
7
|
+
import_spl = line.split(IMPORT_TAG)[-1]
|
|
8
|
+
import_spl_clean = clean_line(line)
|
|
9
|
+
if not import_spl_clean.endswith(')'):
|
|
10
|
+
return True
|
|
11
|
+
return False
|
|
12
|
+
def clean_imports(text=None,file_path=None,import_pkg_js=None,fill_nulines=False):
|
|
13
|
+
if text and os.path.isfile(text):
|
|
14
|
+
file_path = text
|
|
15
|
+
input(file_path)
|
|
16
|
+
text = read_from_file(file_path)
|
|
17
|
+
if not import_pkg_js:
|
|
18
|
+
import_pkg_js = get_all_imports(text=text,file_path=file_path)
|
|
19
|
+
import_pkg_js = ensure_import_pkg_js(import_pkg_js,file_path=file_path)
|
|
20
|
+
nu_lines = import_pkg_js["context"]["nulines"]
|
|
21
|
+
for pkg,values in import_pkg_js.items():
|
|
22
|
+
comments = []
|
|
23
|
+
if pkg not in ["context"]:
|
|
24
|
+
|
|
25
|
+
imports = values.get('imports')
|
|
26
|
+
for i,imp in enumerate(imports):
|
|
27
|
+
if '#' in imp:
|
|
28
|
+
imp_spl = imp.split('#')
|
|
29
|
+
comments.append(imp_spl[-1])
|
|
30
|
+
imports[i] = clean_line(imp_spl[0])
|
|
31
|
+
imports = list(set(imports))
|
|
32
|
+
if '*' in imports:
|
|
33
|
+
imports="*"
|
|
34
|
+
else:
|
|
35
|
+
imports=','.join(imports)
|
|
36
|
+
if comments:
|
|
37
|
+
comments=','.join(comments)
|
|
38
|
+
imports+=f" #{comments}"
|
|
39
|
+
import_pkg_js[pkg]["imports"]=imports
|
|
40
|
+
if fill_nulines:
|
|
41
|
+
line = values.get('line')
|
|
42
|
+
if len(nu_lines) >= line:
|
|
43
|
+
nu_lines[line] += imports
|
|
44
|
+
return import_pkg_js
|
|
45
|
+
def get_all_imports(text=None,file_path=None,import_pkg_js=None):
|
|
46
|
+
if text and os.path.isfile(text):
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
text = read_from_file(text)
|
|
50
|
+
except:
|
|
51
|
+
pass
|
|
52
|
+
file_path = text
|
|
53
|
+
text = get_text_or_read(text=text,file_path=file_path)
|
|
54
|
+
lines = text.split('\n')
|
|
55
|
+
cleaned_import_list=[]
|
|
56
|
+
nu_lines = []
|
|
57
|
+
is_from_group = False
|
|
58
|
+
import_pkg_js = ensure_import_pkg_js(import_pkg_js,file_path=file_path)
|
|
59
|
+
for line in lines:
|
|
60
|
+
if line.startswith(IMPORT_TAG) and ' from ' not in line:
|
|
61
|
+
cleaned_import_list = get_cleaned_import_list(line)
|
|
62
|
+
import_pkg_js = add_imports_to_import_pkg_js("import",cleaned_import_list,import_pkg_js=import_pkg_js)
|
|
63
|
+
else:
|
|
64
|
+
if is_from_group:
|
|
65
|
+
import_pkg=is_from_group
|
|
66
|
+
line = clean_line(line)
|
|
67
|
+
if line.endswith(')'):
|
|
68
|
+
is_from_group=False
|
|
69
|
+
line=line[:-1]
|
|
70
|
+
imports_from_import_pkg = clean_imports(line)
|
|
71
|
+
import_pkg_js = add_imports_to_import_pkg_js(import_pkg,imports_from_import_pkg,import_pkg_js=import_pkg_js)
|
|
72
|
+
|
|
73
|
+
else:
|
|
74
|
+
import_pkg_js=update_import_pkg_js(line,import_pkg_js=import_pkg_js)
|
|
75
|
+
if is_from_line_group(line) and is_from_group == False:
|
|
76
|
+
is_from_group=get_import_pkg(line)
|
|
77
|
+
return import_pkg_js
|
|
78
|
+
def get_path_or_init(pkg_info):
|
|
79
|
+
root_dirname = pkg_info.get("root_dirname")
|
|
80
|
+
pkg = pkg_info.get("pkg")
|
|
81
|
+
rel_path = pkg.replace('.','/')
|
|
82
|
+
dirname = os.path.dirname(root_dirname)
|
|
83
|
+
pkg_path = os.path.join(dirname,rel_path)
|
|
84
|
+
pkg_py_path = f"{pkg_path}.py"
|
|
85
|
+
if os.path.isfile(pkg_py_path):
|
|
86
|
+
return pkg_py_path
|
|
87
|
+
pkg_init_path = os.path.join(pkg_path,'__init__.py')
|
|
88
|
+
if os.path.isdir(pkg_path):
|
|
89
|
+
if os.path.isfile(pkg_init_path):
|
|
90
|
+
return pkg_init_path
|
|
91
|
+
#input(f"nnot found == {pkg_info}")
|
|
92
|
+
def get_dot_fro_line(line,dirname=None,file_path=None,get_info=False):
|
|
93
|
+
info_js = {"nuline":line,"og_line":line,"pkg":line,"dirname":dirname,"file_path":file_path,"root_dirname":None,"local":False}
|
|
94
|
+
if dirname and is_file(dirname):
|
|
95
|
+
file_path=dirname
|
|
96
|
+
dirname = os.path.dirname(dirname)
|
|
97
|
+
info_js["file_path"]=file_path
|
|
98
|
+
info_js["dirname"]=dirname
|
|
99
|
+
from_line = line.split(FROM_TAG)[-1]
|
|
100
|
+
dot_fro = ""
|
|
101
|
+
for char in from_line:
|
|
102
|
+
if char != '.':
|
|
103
|
+
pkg = f"{dot_fro}{eatAll(from_line,'.')}"
|
|
104
|
+
nuline=f"from {pkg}"
|
|
105
|
+
info_js["nuline"]=nuline
|
|
106
|
+
info_js["pkg"]=pkg
|
|
107
|
+
break
|
|
108
|
+
if dirname:
|
|
109
|
+
info_js["root_dirname"]=dirname
|
|
110
|
+
dirbase = os.path.basename(dirname)
|
|
111
|
+
dirname = os.path.dirname(dirname)
|
|
112
|
+
|
|
113
|
+
dot_fro = f"{dirbase}.{dot_fro}"
|
|
114
|
+
if get_info:
|
|
115
|
+
if dot_fro and os.path.isdir(info_js["root_dirname"]):
|
|
116
|
+
info_js["local"]=True
|
|
117
|
+
info_js["pkg_path"]=get_path_or_init(info_js)
|
|
118
|
+
return info_js
|
|
119
|
+
return line
|
|
120
|
+
def get_top_level_imp(line,dirname=None):
|
|
121
|
+
imp = get_dot_fro_line(line,dirname)
|
|
122
|
+
return imp.split('.')[0]
|
|
123
|
+
def return_local_imps(file_path):
|
|
124
|
+
local_imps = []
|
|
125
|
+
dirname = os.path.dirname(file_path)
|
|
126
|
+
imports_js = get_all_imports(file_path)
|
|
127
|
+
for pkg,imps in imports_js.items():
|
|
128
|
+
if pkg not in ['context','nulines']:
|
|
129
|
+
full_imp_info = get_dot_fro_line(pkg,dirname,file_path=file_path,get_info=True)
|
|
130
|
+
if full_imp_info.get("local") == True:
|
|
131
|
+
local_imps.append(full_imp_info)
|
|
132
|
+
return local_imps
|
|
133
|
+
def get_all_pkg_paths(file_path):
|
|
134
|
+
pkg_paths = []
|
|
135
|
+
local_imps = return_local_imps(file_path)
|
|
136
|
+
for local_imp in local_imps:
|
|
137
|
+
curr_file_path = local_imp.get('file_path')
|
|
138
|
+
pkg_path = local_imp.get('pkg_path')
|
|
139
|
+
if pkg_path != None:
|
|
140
|
+
pkg_paths.append(pkg_path)
|
|
141
|
+
return pkg_paths
|
|
142
|
+
def get_cir_dir(pkg_path):
|
|
143
|
+
dirname = os.path.dirname(pkg_path)
|
|
144
|
+
dirbase = os.path.basename(dirname)
|
|
145
|
+
while True:
|
|
146
|
+
if dirname == "/home/flerb/Documents/pythonTools/modules/src/modules/abstract_utilities/src/abstract_utilities":
|
|
147
|
+
break
|
|
148
|
+
dirbase = os.path.basename(dirname)
|
|
149
|
+
dirname = os.path.dirname(dirname)
|
|
150
|
+
#input(f"{dirbase} is circular")
|
|
151
|
+
return dirbase
|
|
152
|
+
def is_circular(pkg_path):
|
|
153
|
+
pkg_paths = get_all_pkg_paths(pkg_path)
|
|
154
|
+
if pkg_path in pkg_paths:
|
|
155
|
+
return pkg_path
|
|
156
|
+
def are_circular(pkg_path,cir_dirs = None):
|
|
157
|
+
cir_dirs = cir_dirs or []
|
|
158
|
+
pkg_path = is_circular(pkg_path)
|
|
159
|
+
if pkg_path:
|
|
160
|
+
if pkg_path not in cir_dirs:
|
|
161
|
+
cir_dirs.append(pkg_path)
|
|
162
|
+
return cir_dirs
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def build_dependency_graph(main_directory):
|
|
166
|
+
"""Map each file to all local imports (by resolved pkg_path)."""
|
|
167
|
+
graph = defaultdict(list)
|
|
168
|
+
dirs, all_local_scripts = get_files_and_dirs(
|
|
169
|
+
main_directory,
|
|
170
|
+
allowed_exts='.py',
|
|
171
|
+
exclude_dirs=['depriciate', 'junk'],
|
|
172
|
+
files_only=True
|
|
173
|
+
)
|
|
174
|
+
for file_path in all_local_scripts:
|
|
175
|
+
deps = get_all_pkg_paths(file_path)
|
|
176
|
+
for dep in deps:
|
|
177
|
+
if dep and os.path.isfile(dep):
|
|
178
|
+
graph[file_path].append(dep)
|
|
179
|
+
return graph
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def find_circular_chains(graph):
|
|
183
|
+
"""Detect circular imports and return their full dependency paths."""
|
|
184
|
+
visited, cycles = set(), []
|
|
185
|
+
|
|
186
|
+
def dfs(node, path):
|
|
187
|
+
visited.add(node)
|
|
188
|
+
path.append(node)
|
|
189
|
+
for dep in graph.get(node, []):
|
|
190
|
+
if dep not in path:
|
|
191
|
+
dfs(dep, path.copy())
|
|
192
|
+
else:
|
|
193
|
+
# Found a circular import
|
|
194
|
+
cycle_start = path.index(dep)
|
|
195
|
+
cycle = path[cycle_start:] + [dep]
|
|
196
|
+
if cycle not in cycles:
|
|
197
|
+
cycles.append(cycle)
|
|
198
|
+
return
|
|
199
|
+
|
|
200
|
+
for start in graph:
|
|
201
|
+
dfs(start, [])
|
|
202
|
+
return cycles
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def explain_circular_imports(cycles):
|
|
206
|
+
"""Pretty-print circular import chains with file names and import lines."""
|
|
207
|
+
for i, cycle in enumerate(cycles, 1):
|
|
208
|
+
print(f"\n🔁 Circular import {i}:")
|
|
209
|
+
for j in range(len(cycle) - 1):
|
|
210
|
+
src, dst = cycle[j], cycle[j + 1]
|
|
211
|
+
print(f" {os.path.basename(src)} → {os.path.basename(dst)}")
|
|
212
|
+
print(f" ^ back to {os.path.basename(cycle[0])}")
|
|
213
|
+
main_directory = "/home/flerb/Documents/pythonTools/modules/src/modules/abstract_utilities/src/abstract_utilities"
|
|
214
|
+
|
|
215
|
+
graph = build_dependency_graph(main_directory)
|
|
216
|
+
cycles = find_circular_chains(graph)
|
|
217
|
+
|
|
218
|
+
if not cycles:
|
|
219
|
+
print("✅ No circular imports found.")
|
|
220
|
+
else:
|
|
221
|
+
print(f"❌ Found {len(cycles)} circular import(s).")
|
|
222
|
+
explain_circular_imports(cycles)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
from abstract_utilities import *
|
|
2
|
+
import os
|
|
3
|
+
from collections import defaultdict
|
|
4
|
+
|
|
5
|
+
def get_path_or_init(pkg_info):
|
|
6
|
+
root_dirname = pkg_info.get("root_dirname")
|
|
7
|
+
pkg = pkg_info.get("pkg")
|
|
8
|
+
rel_path = pkg.replace('.', '/')
|
|
9
|
+
dirname = os.path.dirname(root_dirname)
|
|
10
|
+
pkg_path = os.path.join(dirname, rel_path)
|
|
11
|
+
pkg_py_path = f"{pkg_path}.py"
|
|
12
|
+
if os.path.isfile(pkg_py_path):
|
|
13
|
+
return pkg_py_path
|
|
14
|
+
pkg_init_path = os.path.join(pkg_path, '__init__.py')
|
|
15
|
+
if os.path.isdir(pkg_path) and os.path.isfile(pkg_init_path):
|
|
16
|
+
return pkg_init_path
|
|
17
|
+
# optional: silence instead of blocking input()
|
|
18
|
+
print(f"⚠️ not found == {pkg_info}")
|
|
19
|
+
return None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_dot_fro_line(line, dirname=None, file_path=None, get_info=False):
|
|
23
|
+
info_js = {"nuline": line, "og_line": line, "pkg": line, "dirname": dirname,
|
|
24
|
+
"file_path": file_path, "root_dirname": None, "local": False}
|
|
25
|
+
if dirname and is_file(dirname):
|
|
26
|
+
file_path = dirname
|
|
27
|
+
dirname = os.path.dirname(dirname)
|
|
28
|
+
info_js["file_path"] = file_path
|
|
29
|
+
info_js["dirname"] = dirname
|
|
30
|
+
|
|
31
|
+
from_line = line.split(FROM_TAG)[-1]
|
|
32
|
+
dot_fro = ""
|
|
33
|
+
for char in from_line:
|
|
34
|
+
if char != '.':
|
|
35
|
+
pkg = f"{dot_fro}{eatAll(from_line, '.')}"
|
|
36
|
+
nuline = f"from {pkg}"
|
|
37
|
+
info_js["nuline"] = nuline
|
|
38
|
+
info_js["pkg"] = pkg
|
|
39
|
+
break
|
|
40
|
+
if dirname:
|
|
41
|
+
info_js["root_dirname"] = dirname
|
|
42
|
+
dirbase = os.path.basename(dirname)
|
|
43
|
+
dirname = os.path.dirname(dirname)
|
|
44
|
+
dot_fro = f"{dirbase}.{dot_fro}"
|
|
45
|
+
|
|
46
|
+
if get_info:
|
|
47
|
+
if dot_fro and os.path.isdir(info_js.get("root_dirname") or ""):
|
|
48
|
+
info_js["local"] = True
|
|
49
|
+
info_js["pkg_path"] = get_path_or_init(info_js)
|
|
50
|
+
return info_js
|
|
51
|
+
return line
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def return_local_imps(file_path):
|
|
55
|
+
local_imps = []
|
|
56
|
+
dirname = os.path.dirname(file_path)
|
|
57
|
+
imports_js = get_all_imports(file_path)
|
|
58
|
+
for pkg, imps in imports_js.items():
|
|
59
|
+
if pkg not in ['context', 'nulines']:
|
|
60
|
+
full_imp_info = get_dot_fro_line(pkg, dirname, file_path=file_path, get_info=True)
|
|
61
|
+
if full_imp_info.get("local"):
|
|
62
|
+
local_imps.append(full_imp_info)
|
|
63
|
+
return local_imps
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def get_all_pkg_paths(file_path):
|
|
67
|
+
pkg_paths = []
|
|
68
|
+
local_imps = return_local_imps(file_path)
|
|
69
|
+
for local_imp in local_imps:
|
|
70
|
+
pkg_path = local_imp.get('pkg_path')
|
|
71
|
+
if pkg_path:
|
|
72
|
+
pkg_paths.append(pkg_path)
|
|
73
|
+
return pkg_paths
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# --- NEW: Build dependency graph and detect circular imports ---
|
|
77
|
+
|
|
78
|
+
def build_graph(main_directory):
|
|
79
|
+
dirs, all_local_scripts = get_files_and_dirs(main_directory, allowd_exts='.py', files_only=True)
|
|
80
|
+
graph = defaultdict(set)
|
|
81
|
+
for file_path in all_local_scripts:
|
|
82
|
+
deps = get_all_pkg_paths(file_path)
|
|
83
|
+
for dep in deps:
|
|
84
|
+
if dep: # only valid files
|
|
85
|
+
graph[file_path].add(dep)
|
|
86
|
+
return graph
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def find_cycles(graph):
|
|
90
|
+
visited, stack, cycles = set(), [], []
|
|
91
|
+
|
|
92
|
+
def dfs(node, path):
|
|
93
|
+
visited.add(node)
|
|
94
|
+
path.append(node)
|
|
95
|
+
for dep in graph.get(node, []):
|
|
96
|
+
if dep not in visited:
|
|
97
|
+
dfs(dep, path.copy())
|
|
98
|
+
elif dep in path:
|
|
99
|
+
cycle_start = path.index(dep)
|
|
100
|
+
cycles.append(path[cycle_start:] + [dep])
|
|
101
|
+
|
|
102
|
+
for node in graph:
|
|
103
|
+
if node not in visited:
|
|
104
|
+
dfs(node, [])
|
|
105
|
+
return cycles
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
if __name__ == "__main__":
|
|
109
|
+
main_directory = "/home/flerb/Documents/pythonTools/modules/src/modules/abstract_utilities/src/abstract_utilities"
|
|
110
|
+
graph = build_graph(main_directory)
|
|
111
|
+
cycles = find_cycles(graph)
|
|
112
|
+
|
|
113
|
+
if not cycles:
|
|
114
|
+
print("✅ No circular imports found.")
|
|
115
|
+
else:
|
|
116
|
+
print("❌ Circular imports detected:")
|
|
117
|
+
for cycle in cycles:
|
|
118
|
+
print(" → ".join(cycle))
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
from .imports import *
|
|
2
2
|
class SingletonMeta(type):
|
|
3
3
|
_instances = {}
|
|
4
4
|
def __call__(cls, *args, **kwargs):
|
|
5
5
|
if cls not in cls._instances:
|
|
6
6
|
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
|
|
7
7
|
return cls._instances[cls]
|
|
8
|
+
|
|
8
9
|
def get_inputs(cls, *args, **kwargs):
|
|
9
10
|
"""
|
|
10
11
|
Dynamically construct a dataclass instance from args and kwargs,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from .imports import *
|
|
2
|
+
def get_caller(i: Optional[int] = None) -> str:
|
|
3
|
+
"""
|
|
4
|
+
Return the filename of the calling frame.
|
|
5
|
+
|
|
6
|
+
Args:
|
|
7
|
+
i: Optional stack depth offset.
|
|
8
|
+
None = immediate caller (depth 1).
|
|
9
|
+
|
|
10
|
+
Returns:
|
|
11
|
+
Absolute path of the file for the stack frame.
|
|
12
|
+
"""
|
|
13
|
+
depth = 1 if i is None else int(i)
|
|
14
|
+
stack = inspect.stack()
|
|
15
|
+
if depth >= len(stack):
|
|
16
|
+
depth = len(stack) - 1
|
|
17
|
+
return stack[depth].filename
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_caller_path(i: Optional[int] = None) -> str:
|
|
21
|
+
"""
|
|
22
|
+
Return the absolute path of the caller's file.
|
|
23
|
+
"""
|
|
24
|
+
depth = 1 if i is None else int(i)
|
|
25
|
+
file_path = get_caller(depth + 1)
|
|
26
|
+
return os.path.realpath(file_path)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_caller_dir(i: Optional[int] = None) -> str:
|
|
30
|
+
"""
|
|
31
|
+
Return the absolute directory of the caller's file.
|
|
32
|
+
"""
|
|
33
|
+
depth = 1 if i is None else int(i)
|
|
34
|
+
abspath = get_caller_path(depth + 1)
|
|
35
|
+
return os.path.dirname(abspath)
|
|
@@ -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
|
+
|