abstract-utilities 0.2.2.632__tar.gz → 0.2.2.691__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.
Potentially problematic release.
This version of abstract-utilities might be problematic. Click here for more details.
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/PKG-INFO +1 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/setup.py +1 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/__init__.py +7 -3
- abstract_utilities-0.2.2.691/src/abstract_utilities/class_utils/abstract_classes.py +144 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/caller_utils.py +38 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/imports/imports.py +1 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/imports/classes.py +59 -55
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/imports/module_imports.py +1 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/file_filters/ensure_utils.py +57 -27
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/find_collect.py +10 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/import_utils/imports/__init__.py +4 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/import_utils/imports/init_imports.py +3 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/imports/module_imports.py +1 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/imports/utils.py +1 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/__init__.py +1 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/import_utils.py +61 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/import_utils/src/layze_import_utils/__init__.py +2 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/import_utils/src/layze_import_utils/lazy_utils.py +41 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/import_utils/src/layze_import_utils/nullProxy.py +37 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/imports.py +5 -2
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/json_utils/json_utils.py +37 -3
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/list_utils/list_utils.py +3 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/log_file.py +82 -27
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/path_utils/imports/module_imports.py +1 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/path_utils/path_utils.py +7 -12
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/read_write_utils/read_write_utils.py +63 -30
- abstract_utilities-0.2.2.691/src/abstract_utilities/safe_utils/imports/imports.py +2 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/__init__.py +7 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/get_type.py +120 -0
- {abstract_utilities-0.2.2.632/src/abstract_utilities/import_utils → abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils}/imports/__init__.py +0 -1
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/imports/constants.py +134 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/imports/module_imports.py +25 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/is_type.py +455 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/make_type.py +126 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/mime_types.py +68 -0
- abstract_utilities-0.2.2.691/src/abstract_utilities/type_utils/type_utils.py +104 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities.egg-info/SOURCES.txt +9 -1
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/tests/test.py +2 -1
- abstract_utilities-0.2.2.632/src/abstract_utilities/class_utils/abstract_classes.py +0 -74
- abstract_utilities-0.2.2.632/src/abstract_utilities/import_utils/imports/imports.py +0 -4
- abstract_utilities-0.2.2.632/src/abstract_utilities/json_utils/imports/imports.py +0 -2
- abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/__init__.py +0 -3
- abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/imports/__init__.py +0 -2
- abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/imports/module_imports.py +0 -1
- abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/type_utils.py +0 -981
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/README.md +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/pyproject.toml +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/setup.cfg +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/class_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/function_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/global_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/imports/utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/class_utils/module_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/compare_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/compare_utils/best_match.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/compare_utils/find_value.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/src/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/src/directory_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/src/name_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/src/size_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/directory_utils/src/utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/env_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/env_utils/envy_it.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/env_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/env_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/error_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/error_utils/error_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/error_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/error_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/error_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/imports/clean_imps.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/imports/constants.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/file_filters/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/file_filters/filter_params.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/file_filters/filter_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/file_filters/predicate_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/find_content.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/initFunctionsGen.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/initFunctionsGens.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/map_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/reader_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/reader_utils/directory_reader.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/reader_utils/file_reader.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/reader_utils/file_readers.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/reader_utils/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils/src/reader_utils/pdf_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/constants.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/imports/constants.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/utils/classes.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/utils/clean_imps.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/imports/utils/filter_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/src/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/src/file_filters.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/src/file_reader.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/src/find_collect.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/src/map_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/file_utils (2)/src/pdf_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/hash_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/hash_utils/hash_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/hash_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/hash_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/hash_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/history_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/history_utils/history_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/history_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/history_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/history_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/circular_import_finder.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/circular_import_finder2.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/imports/constants.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/clean_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/dot_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/extract_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/import_functions.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/package_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/package_utils/context_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/package_utils/import_collectors.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/package_utils/path_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/package_utils/safe_import.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/pkg_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/import_utils/src/sysroot_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/json_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/json_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632/src/abstract_utilities/safe_utils → abstract_utilities-0.2.2.691/src/abstract_utilities/json_utils}/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/json_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/list_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/list_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/list_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/list_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/abstractLogManager.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/call_response.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/log_utils/logger_callable.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/math_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/math_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/math_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/math_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/math_utils/math_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/parse_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/parse_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/parse_utils/imports/constants.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/parse_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/parse_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/parse_utils/parse_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/path_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/path_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/path_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/read_write_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/read_write_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/read_write_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/read_write_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/safe_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/safe_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/safe_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/safe_utils/safe_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/classes.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/cmd_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/imports/utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/ssh_utils/type_checks.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/clean_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/eat_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/imports/utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/string_utils/replace_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/thread_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/thread_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/thread_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/thread_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/thread_utils/thread_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/time_utils/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/time_utils/imports/__init__.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/time_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/time_utils/imports/module_imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/time_utils/time_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/type_utils/alpha_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/type_utils/imports/imports.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/type_utils/num_utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/utils.py +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities.egg-info/requires.txt +0 -0
- {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.691}/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.691
|
|
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.691',
|
|
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.632 → abstract_utilities-0.2.2.691}/src/abstract_utilities/__init__.py
RENAMED
|
@@ -32,7 +32,8 @@ from .json_utils import (unified_json_loader,
|
|
|
32
32
|
safe_write_to_file,
|
|
33
33
|
safe_save_updated_json_data,
|
|
34
34
|
get_result_from_data,
|
|
35
|
-
flatten_json
|
|
35
|
+
flatten_json,
|
|
36
|
+
to_json_safe
|
|
36
37
|
)
|
|
37
38
|
|
|
38
39
|
from .directory_utils import *
|
|
@@ -45,7 +46,9 @@ from .list_utils import (get_highest_value_obj,
|
|
|
45
46
|
compare_lists,
|
|
46
47
|
get_symetric_difference,
|
|
47
48
|
list_set,
|
|
48
|
-
make_list_it
|
|
49
|
+
make_list_it,
|
|
50
|
+
get_single_from_list
|
|
51
|
+
)
|
|
49
52
|
from .time_utils import (get_time_stamp,
|
|
50
53
|
get_sleep,
|
|
51
54
|
sleep_count_down,
|
|
@@ -83,7 +86,8 @@ from .type_utils import (make_bool,
|
|
|
83
86
|
get_numbers_comp,
|
|
84
87
|
is_any_instance,
|
|
85
88
|
break_string,
|
|
86
|
-
MIME_TYPES
|
|
89
|
+
MIME_TYPES,
|
|
90
|
+
get_if_None
|
|
87
91
|
)
|
|
88
92
|
get_media_types = get_all_types = get_all_file_types
|
|
89
93
|
from .math_utils import (convert_to_percentage,
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from .imports import *
|
|
2
|
+
class SingletonMeta(type):
|
|
3
|
+
_instances = {}
|
|
4
|
+
def __call__(cls, *args, **kwargs):
|
|
5
|
+
if cls not in cls._instances:
|
|
6
|
+
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
|
|
7
|
+
return cls._instances[cls]
|
|
8
|
+
|
|
9
|
+
def get_inputs(cls, *args, **kwargs):
|
|
10
|
+
"""
|
|
11
|
+
Dynamically construct a dataclass instance from args and kwargs,
|
|
12
|
+
filling missing values from defaults in the dataclass.
|
|
13
|
+
"""
|
|
14
|
+
fields = list(cls.__annotations__.keys())
|
|
15
|
+
values = {}
|
|
16
|
+
|
|
17
|
+
args = list(args)
|
|
18
|
+
for field in fields:
|
|
19
|
+
if field in kwargs:
|
|
20
|
+
values[field] = kwargs[field]
|
|
21
|
+
elif args:
|
|
22
|
+
values[field] = args.pop(0)
|
|
23
|
+
else:
|
|
24
|
+
values[field] = getattr(cls(), field) # default from dataclass
|
|
25
|
+
|
|
26
|
+
return cls(**values)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
from abstract_utilities import *
|
|
30
|
+
class SingletonMeta(type):
|
|
31
|
+
_instances = {}
|
|
32
|
+
def __call__(cls, *args, **kwargs):
|
|
33
|
+
if cls not in cls._instances:
|
|
34
|
+
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
|
|
35
|
+
return cls._instances[cls]
|
|
36
|
+
|
|
37
|
+
def get_inputs(cls, *args, **kwargs):
|
|
38
|
+
"""
|
|
39
|
+
Dynamically construct a dataclass instance from args and kwargs,
|
|
40
|
+
filling missing values from defaults in the dataclass.
|
|
41
|
+
"""
|
|
42
|
+
fields = list(cls.__annotations__.keys())
|
|
43
|
+
values = {}
|
|
44
|
+
|
|
45
|
+
args = list(args)
|
|
46
|
+
for field in fields:
|
|
47
|
+
if field in kwargs:
|
|
48
|
+
values[field] = kwargs[field]
|
|
49
|
+
elif args:
|
|
50
|
+
values[field] = args.pop(0)
|
|
51
|
+
else:
|
|
52
|
+
values[field] = getattr(cls(), field) # default from dataclass
|
|
53
|
+
|
|
54
|
+
return cls(*args,**values)
|
|
55
|
+
def get_input_params(func):
|
|
56
|
+
sig = inspect.signature(func)
|
|
57
|
+
return sig.parameters
|
|
58
|
+
def get_args(func, *args,**kwargs):
|
|
59
|
+
parameters = get_input_params(func)
|
|
60
|
+
parameters = dict(parameters)
|
|
61
|
+
for key,value in parameters.items():
|
|
62
|
+
value = str(value)
|
|
63
|
+
if value.startswith('**'):
|
|
64
|
+
kwargs_key = key
|
|
65
|
+
elif value.startswith('*'):
|
|
66
|
+
args_key = key
|
|
67
|
+
kwargs_copy = kwargs.copy()
|
|
68
|
+
for k_key,k_value in kwargs.items():
|
|
69
|
+
if args_key == k_key and isinstance(k_value,list or tuple or set):
|
|
70
|
+
args = args | tuple(k_value)
|
|
71
|
+
del kwargs[k_key]
|
|
72
|
+
return args,kwargs
|
|
73
|
+
|
|
74
|
+
def prune_inputs(func, *args, **kwargs):
|
|
75
|
+
"""
|
|
76
|
+
Smart argument adapter:
|
|
77
|
+
- Detects if func accepts *args or **kwargs
|
|
78
|
+
- Builds new positional arguments from kwargs when appropriate
|
|
79
|
+
- Handles explicit {"args": [...]} convention
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
sig = inspect.signature(func)
|
|
83
|
+
params = sig.parameters
|
|
84
|
+
|
|
85
|
+
has_varargs = any(p.kind == inspect.Parameter.VAR_POSITIONAL for p in params.values())
|
|
86
|
+
has_varkw = any(p.kind == inspect.Parameter.VAR_KEYWORD for p in params.values())
|
|
87
|
+
|
|
88
|
+
new_args = list(args)
|
|
89
|
+
new_kwargs = dict(kwargs)
|
|
90
|
+
|
|
91
|
+
# -----------------------------------------------------------
|
|
92
|
+
# 1. If user provided explicit args: {"args": [...]}
|
|
93
|
+
# -----------------------------------------------------------
|
|
94
|
+
if "args" in new_kwargs:
|
|
95
|
+
explicit_args = new_kwargs.pop("args")
|
|
96
|
+
if isinstance(explicit_args, (list, tuple)):
|
|
97
|
+
new_args.extend(explicit_args)
|
|
98
|
+
else:
|
|
99
|
+
new_args.append(explicit_args)
|
|
100
|
+
|
|
101
|
+
# -----------------------------------------------------------
|
|
102
|
+
# 2. If function has *args, infer which kwargs belong there
|
|
103
|
+
# -----------------------------------------------------------
|
|
104
|
+
if has_varargs:
|
|
105
|
+
|
|
106
|
+
# Heuristic rules for upgrading kwargs to args:
|
|
107
|
+
# - if the function has NO named params, treat all scalar kwargs as positional
|
|
108
|
+
# - common param names like "file_path" also qualify
|
|
109
|
+
preferred_as_args = {"path", "file", "file_path", "filename", "value"}
|
|
110
|
+
|
|
111
|
+
positional_candidates = []
|
|
112
|
+
|
|
113
|
+
for k in list(new_kwargs.keys()):
|
|
114
|
+
v = new_kwargs[k]
|
|
115
|
+
|
|
116
|
+
# candidate rules:
|
|
117
|
+
if k in preferred_as_args:
|
|
118
|
+
positional_candidates.append(v)
|
|
119
|
+
del new_kwargs[k]
|
|
120
|
+
|
|
121
|
+
# scalars but not mappings/lists (optional)
|
|
122
|
+
elif isinstance(v, (str, int, float)) and len(positional_candidates) == 0:
|
|
123
|
+
positional_candidates.append(v)
|
|
124
|
+
del new_kwargs[k]
|
|
125
|
+
|
|
126
|
+
new_args.extend(positional_candidates)
|
|
127
|
+
|
|
128
|
+
# -----------------------------------------------------------
|
|
129
|
+
# 3. If function does NOT accept **kwargs → strip extras
|
|
130
|
+
# -----------------------------------------------------------
|
|
131
|
+
if not has_varkw:
|
|
132
|
+
allowed = {
|
|
133
|
+
name for name, p in params.items()
|
|
134
|
+
if p.kind in (
|
|
135
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
|
136
|
+
inspect.Parameter.KEYWORD_ONLY
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
new_kwargs = {k: v for k, v in new_kwargs.items() if k in allowed}
|
|
140
|
+
|
|
141
|
+
return tuple(new_args), new_kwargs
|
|
142
|
+
def run_pruned_func(func, *args, **kwargs):
|
|
143
|
+
args,kwargs = prune_inputs(func, *args, **kwargs)
|
|
144
|
+
return func(*args, **kwargs)
|
|
@@ -52,3 +52,41 @@ def get_caller_dir(i: Optional[int] = None) -> str:
|
|
|
52
52
|
depth = 1 if i is None else int(i)
|
|
53
53
|
abspath = get_caller_path(depth + 1)
|
|
54
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
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
from ...imports import inspect,os,json,functools,inspect,glob,sys
|
|
1
|
+
from ...imports import inspect,os,json,functools,inspect,glob,sys,Path
|
|
2
2
|
from typing import *
|
|
@@ -50,19 +50,20 @@ def is_file(
|
|
|
50
50
|
env_path=None,
|
|
51
51
|
**kwargs
|
|
52
52
|
):
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
53
|
+
if path:
|
|
54
|
+
contingencies = list(set([user_at_host,password,key,env_path]))
|
|
55
|
+
len_contingencies = len(contingencies)
|
|
56
|
+
is_potential = (len_contingencies >1 or (None not in contingencies))
|
|
57
|
+
if not is_potential:
|
|
58
|
+
return os.path.isfile(path)
|
|
59
|
+
cmd = get_item_check_cmd(path,file=True)
|
|
60
|
+
return run_cmd(cmd=cmd,
|
|
61
|
+
user_at_host=user_at_host,
|
|
62
|
+
password=password,
|
|
63
|
+
key=key,
|
|
64
|
+
env_path=env_path,
|
|
65
|
+
**kwargs
|
|
66
|
+
)
|
|
66
67
|
def is_dir(
|
|
67
68
|
path,
|
|
68
69
|
user_at_host=None,
|
|
@@ -71,34 +72,13 @@ def is_dir(
|
|
|
71
72
|
env_path=None,
|
|
72
73
|
**kwargs
|
|
73
74
|
):
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
user_at_host=user_at_host,
|
|
82
|
-
password=password,
|
|
83
|
-
key=key,
|
|
84
|
-
env_path=env_path,
|
|
85
|
-
**kwargs
|
|
86
|
-
)
|
|
87
|
-
def is_exists(
|
|
88
|
-
path,
|
|
89
|
-
user_at_host=None,
|
|
90
|
-
password=None,
|
|
91
|
-
key=None,
|
|
92
|
-
env_path=None,
|
|
93
|
-
**kwargs
|
|
94
|
-
):
|
|
95
|
-
contingencies = list(set([user_at_host,password,key,env_path]))
|
|
96
|
-
len_contingencies = len(contingencies)
|
|
97
|
-
is_potential = (len_contingencies >1 or (None not in contingencies))
|
|
98
|
-
if not is_potential:
|
|
99
|
-
return os.path.exists(path)
|
|
100
|
-
if is_potential == True:
|
|
101
|
-
cmd = get_item_check_cmd(path,exists=True)
|
|
75
|
+
if path:
|
|
76
|
+
contingencies = list(set([user_at_host,password,key,env_path]))
|
|
77
|
+
len_contingencies = len(contingencies)
|
|
78
|
+
is_potential = (len_contingencies >1 or (None not in contingencies))
|
|
79
|
+
if not is_potential:
|
|
80
|
+
return os.path.isdir(path)
|
|
81
|
+
cmd = get_item_check_cmd(path,file=False,directory=True)
|
|
102
82
|
return run_cmd(cmd=cmd,
|
|
103
83
|
user_at_host=user_at_host,
|
|
104
84
|
password=password,
|
|
@@ -106,7 +86,7 @@ def is_exists(
|
|
|
106
86
|
env_path=env_path,
|
|
107
87
|
**kwargs
|
|
108
88
|
)
|
|
109
|
-
def
|
|
89
|
+
def is_exists(
|
|
110
90
|
path,
|
|
111
91
|
user_at_host=None,
|
|
112
92
|
password=None,
|
|
@@ -114,25 +94,49 @@ def is_any(
|
|
|
114
94
|
env_path=None,
|
|
115
95
|
**kwargs
|
|
116
96
|
):
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
97
|
+
if path:
|
|
98
|
+
contingencies = list(set([user_at_host,password,key,env_path]))
|
|
99
|
+
len_contingencies = len(contingencies)
|
|
100
|
+
is_potential = (len_contingencies >1 or (None not in contingencies))
|
|
101
|
+
if not is_potential:
|
|
102
|
+
return os.path.exists(path)
|
|
103
|
+
if is_potential == True:
|
|
104
|
+
cmd = get_item_check_cmd(path,exists=True)
|
|
105
|
+
return run_cmd(cmd=cmd,
|
|
126
106
|
user_at_host=user_at_host,
|
|
127
107
|
password=password,
|
|
128
108
|
key=key,
|
|
129
109
|
env_path=env_path,
|
|
130
110
|
**kwargs
|
|
131
111
|
)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
112
|
+
def is_any(
|
|
113
|
+
path,
|
|
114
|
+
user_at_host=None,
|
|
115
|
+
password=None,
|
|
116
|
+
key=None,
|
|
117
|
+
env_path=None,
|
|
118
|
+
**kwargs
|
|
119
|
+
):
|
|
120
|
+
if path:
|
|
121
|
+
contingencies = list(set([user_at_host,password,key,env_path]))
|
|
122
|
+
len_contingencies = len(contingencies)
|
|
123
|
+
is_potential = (len_contingencies >1 or (None not in contingencies))
|
|
124
|
+
if not is_potential:
|
|
125
|
+
return os.path.exists(path)
|
|
126
|
+
if is_potential == True:
|
|
127
|
+
out_js = get_all_item_check_cmd(path,file=True,directory=True,exists=True)
|
|
128
|
+
for typ,cmd in out_js.items():
|
|
129
|
+
response = run_cmd(cmd=cmd,
|
|
130
|
+
user_at_host=user_at_host,
|
|
131
|
+
password=password,
|
|
132
|
+
key=key,
|
|
133
|
+
env_path=env_path,
|
|
134
|
+
**kwargs
|
|
135
|
+
)
|
|
136
|
+
result = "__OK__" in (response or "")
|
|
137
|
+
if result:
|
|
138
|
+
return typ
|
|
139
|
+
|
|
136
140
|
class PathBackend(Protocol):
|
|
137
141
|
def join(self, *parts: str) -> str: ...
|
|
138
142
|
def isfile(self, path: str) -> bool: ...
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from ...list_utils import make_list
|
|
2
|
-
from ...type_utils import get_media_exts, is_media_type, MIME_TYPES, is_str
|
|
2
|
+
from ...type_utils import get_media_exts, is_media_type, MIME_TYPES, is_str,if_not_bool_default
|
|
3
3
|
from ...ssh_utils import *
|
|
4
4
|
from ...env_utils import *
|
|
5
5
|
from ...read_write_utils import read_from_file,write_to_file
|
|
@@ -119,14 +119,17 @@ def ensure_directories(*args,**kwargs):
|
|
|
119
119
|
|
|
120
120
|
if run_pruned_func(is_dir,arg_str,**kwargs):
|
|
121
121
|
directories.append(arg_str)
|
|
122
|
+
|
|
122
123
|
elif run_pruned_func(is_file,arg_str,**kwargs):
|
|
123
124
|
dirname = os.path.dirname(arg_str)
|
|
124
125
|
directories.append(dirname)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
if not directories:
|
|
127
|
+
safe_directories = get_dir_filter_kwargs(**kwargs)
|
|
128
|
+
safe_dirs = safe_directories.get('directories')
|
|
129
|
+
safe_dirs = if_none_change(safe_dirs or None,get_initial_caller_dir())
|
|
130
|
+
directories+= make_list(safe_dirs)
|
|
129
131
|
return list(set([r for r in directories if r]))
|
|
132
|
+
|
|
130
133
|
def get_proper_type_str(string):
|
|
131
134
|
if not string:
|
|
132
135
|
return None
|
|
@@ -337,32 +340,35 @@ def _get_default_modular(value, default, add=None, typ=set):
|
|
|
337
340
|
if add:
|
|
338
341
|
return combine_params(value,default,typ=None)
|
|
339
342
|
return typ(value)
|
|
340
|
-
def make_allowed_predicate(cfg: ScanConfig=None
|
|
343
|
+
def make_allowed_predicate(cfg: ScanConfig = None, **kwargs) -> Callable[[str], bool]:
|
|
341
344
|
"""
|
|
342
|
-
Build a
|
|
343
|
-
|
|
345
|
+
Build and return a function `allowed(path)` that evaluates the given ScanConfig.
|
|
346
|
+
Unlike substring-based matching, this version avoids accidental matches inside
|
|
347
|
+
unrelated names (e.g., 'abstract' matching 'archive').
|
|
344
348
|
"""
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
349
|
+
|
|
350
|
+
cfg = cfg or define_defaults(**kwargs)
|
|
351
|
+
|
|
352
|
+
def allowed(path: str) -> bool:
|
|
353
|
+
p = Path(path)
|
|
348
354
|
name = p.name.lower()
|
|
349
355
|
path_str = str(p).lower()
|
|
350
356
|
|
|
351
357
|
# --------------------
|
|
352
358
|
# A) directory filters
|
|
353
359
|
# --------------------
|
|
360
|
+
# Excluded dirs: reject if any directory in the path matches exactly
|
|
354
361
|
if cfg.exclude_dirs:
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
return False
|
|
362
|
+
parts = path_str.split("/")
|
|
363
|
+
if any(d.lower() in parts for d in cfg.exclude_dirs):
|
|
364
|
+
print(f"[exclude_dirs] → {path}")
|
|
365
|
+
return False
|
|
360
366
|
|
|
367
|
+
# Allowed dirs: require at least one match (unless "*")
|
|
361
368
|
if cfg.allowed_dirs and cfg.allowed_dirs != ["*"]:
|
|
362
|
-
|
|
363
|
-
if not any(
|
|
364
|
-
|
|
365
|
-
):
|
|
369
|
+
parts = path_str.split("/")
|
|
370
|
+
if not any(d.lower() in parts for d in cfg.allowed_dirs):
|
|
371
|
+
print(f"[allowed_dirs] → {path}")
|
|
366
372
|
return False
|
|
367
373
|
|
|
368
374
|
# --------------------
|
|
@@ -370,37 +376,61 @@ def make_allowed_predicate(cfg: ScanConfig=None,**kwargs) -> Callable[[str], boo
|
|
|
370
376
|
# --------------------
|
|
371
377
|
if cfg.allowed_patterns and cfg.allowed_patterns != ["*"]:
|
|
372
378
|
if not any(fnmatch.fnmatch(name, pat.lower()) for pat in cfg.allowed_patterns):
|
|
379
|
+
print(f"[allowed_patterns] → {path}")
|
|
373
380
|
return False
|
|
374
381
|
|
|
375
382
|
if cfg.exclude_patterns:
|
|
376
|
-
for pat in cfg.exclude_patterns:
|
|
377
|
-
|
|
378
|
-
|
|
383
|
+
if any(fnmatch.fnmatch(name, pat.lower()) for pat in cfg.exclude_patterns):
|
|
384
|
+
print(f"[exclude_patterns] → {path}")
|
|
385
|
+
return False
|
|
379
386
|
|
|
380
387
|
# --------------------
|
|
381
388
|
# C) extension filters
|
|
382
389
|
# --------------------
|
|
383
390
|
if p.is_file():
|
|
384
391
|
ext = p.suffix.lower()
|
|
392
|
+
|
|
385
393
|
if cfg.allowed_exts and ext not in cfg.allowed_exts:
|
|
394
|
+
print(f"[allowed_exts] → {path}")
|
|
386
395
|
return False
|
|
396
|
+
|
|
387
397
|
if cfg.exclude_exts and ext in cfg.exclude_exts:
|
|
398
|
+
print(f"[exclude_exts] → {path}")
|
|
388
399
|
return False
|
|
389
400
|
|
|
390
401
|
# --------------------
|
|
391
|
-
# D) type filters (
|
|
402
|
+
# D) type filters (SAFE SEMANTIC MATCHING)
|
|
392
403
|
# --------------------
|
|
393
|
-
if cfg.allowed_types and cfg.allowed_types
|
|
394
|
-
if not any(t in path_str for t in cfg.allowed_types):
|
|
404
|
+
if cfg.allowed_types and "*" not in cfg.allowed_types:
|
|
405
|
+
if not any(t.lower() in path_str.split("/") for t in cfg.allowed_types):
|
|
406
|
+
print(f"[allowed_types] → {path}")
|
|
395
407
|
return False
|
|
396
|
-
|
|
397
|
-
|
|
408
|
+
|
|
409
|
+
if cfg.exclude_types:
|
|
410
|
+
if any(t.lower() in path_str.split("/") for t in cfg.exclude_types):
|
|
411
|
+
print(f"[exclude_types] → {path}")
|
|
398
412
|
return False
|
|
399
413
|
|
|
400
414
|
return True
|
|
401
415
|
|
|
416
|
+
# Preserve real name for debugging and repr
|
|
417
|
+
allowed.__name__ = "allowed"
|
|
402
418
|
return allowed
|
|
403
419
|
|
|
420
|
+
def filter_allowed_items(items, cfg=None, **kwargs):
|
|
421
|
+
"""
|
|
422
|
+
Apply ScanConfig allow/exclude rules to a flat list of file or directory paths.
|
|
423
|
+
No recursion. No globs. No shell calls.
|
|
424
|
+
Just pure deterministic filtering.
|
|
425
|
+
"""
|
|
426
|
+
allowed_items = []
|
|
427
|
+
allowed = make_allowed_predicate(cfg=cfg, **kwargs)
|
|
428
|
+
for item in items:
|
|
429
|
+
if allowed(item):
|
|
430
|
+
allowed_items.append(item)
|
|
431
|
+
|
|
432
|
+
return allowed_items
|
|
433
|
+
|
|
404
434
|
def derive_all_defaults(**kwargs):
|
|
405
435
|
kwargs = get_safe_canonical_kwargs(**kwargs)
|
|
406
436
|
add = kwargs.get("add",False)
|
|
@@ -188,3 +188,13 @@ def collect_filepaths(
|
|
|
188
188
|
) -> List[str]:
|
|
189
189
|
kwargs['file_type']='f'
|
|
190
190
|
return collect_globs(*args,**kwargs)
|
|
191
|
+
|
|
192
|
+
def get_filename(path):
|
|
193
|
+
basename = os.path.basename(path)
|
|
194
|
+
filename,ext = os.path.splitext(basename)
|
|
195
|
+
return filename
|
|
196
|
+
def find_files(filename,directory=None,add=None):
|
|
197
|
+
add = if_not_bool_default(add,default=True)
|
|
198
|
+
directory = directory or os.getcwd()
|
|
199
|
+
dirs,files = get_files_and_dirs(directory,add=add)
|
|
200
|
+
return [file for file in files if get_filename(file) == filename]
|
|
@@ -297,3 +297,64 @@ def attach_self_functions(
|
|
|
297
297
|
attached[out_name] = bound
|
|
298
298
|
|
|
299
299
|
return attached
|
|
300
|
+
def initFuncs(self, mode=None):
|
|
301
|
+
"""
|
|
302
|
+
Load functions in either dev (dynamic) or prod (static) mode.
|
|
303
|
+
Absence of functions folder is a NO-OP.
|
|
304
|
+
"""
|
|
305
|
+
mode = mode or "dev"
|
|
306
|
+
logger = get_logFile(__name__)
|
|
307
|
+
|
|
308
|
+
base_pkg = self.__class__.__module__.rsplit(".", 1)[0]
|
|
309
|
+
|
|
310
|
+
# ------------------
|
|
311
|
+
# PROD MODE (STATIC)
|
|
312
|
+
# ------------------
|
|
313
|
+
if mode == "prod":
|
|
314
|
+
try:
|
|
315
|
+
imports_mod = importlib.import_module(f"{base_pkg}.imports.funcs_imports")
|
|
316
|
+
for name in getattr(imports_mod, "__all__", []):
|
|
317
|
+
try:
|
|
318
|
+
func = getattr(imports_mod, name)
|
|
319
|
+
setattr(self, name, func.__get__(self))
|
|
320
|
+
except Exception as e:
|
|
321
|
+
logger.info(f"initFuncs(prod) attach error: {e}")
|
|
322
|
+
except Exception as e:
|
|
323
|
+
logger.info(f"initFuncs(prod) skipped: {e}")
|
|
324
|
+
return self # 🔒 HARD STOP
|
|
325
|
+
|
|
326
|
+
# ------------------
|
|
327
|
+
# DEV MODE (DYNAMIC)
|
|
328
|
+
# ------------------
|
|
329
|
+
import inspect
|
|
330
|
+
import pkgutil
|
|
331
|
+
|
|
332
|
+
try:
|
|
333
|
+
# resolve filesystem path FIRST
|
|
334
|
+
pkg_root = Path(importlib.import_module(base_pkg).__file__).parent
|
|
335
|
+
functions_dir = pkg_root / "functions"
|
|
336
|
+
|
|
337
|
+
# 🚫 no functions folder → silent no-op
|
|
338
|
+
if not functions_dir.exists() or not functions_dir.is_dir():
|
|
339
|
+
return self
|
|
340
|
+
|
|
341
|
+
# 🚫 not a package → no-op
|
|
342
|
+
if not (functions_dir / "__init__.py").exists():
|
|
343
|
+
return self
|
|
344
|
+
|
|
345
|
+
pkg = importlib.import_module(f"{base_pkg}.functions")
|
|
346
|
+
existing = set(dir(self))
|
|
347
|
+
|
|
348
|
+
for _, module_name, _ in pkgutil.iter_modules(pkg.__path__):
|
|
349
|
+
try:
|
|
350
|
+
mod = importlib.import_module(f"{pkg.__name__}.{module_name}")
|
|
351
|
+
for name, obj in inspect.getmembers(mod, inspect.isfunction):
|
|
352
|
+
if name not in existing:
|
|
353
|
+
setattr(self, name, obj.__get__(self))
|
|
354
|
+
except Exception as e:
|
|
355
|
+
logger.info(f"initFuncs(dev) module skipped: {e}")
|
|
356
|
+
|
|
357
|
+
except Exception as e:
|
|
358
|
+
logger.info(f"initFuncs(dev) skipped entirely: {e}")
|
|
359
|
+
|
|
360
|
+
return self
|