abstract-utilities 0.2.2.632__tar.gz → 0.2.2.698__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.

Files changed (213) hide show
  1. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/PKG-INFO +1 -1
  2. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/setup.py +1 -1
  3. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/__init__.py +7 -3
  4. abstract_utilities-0.2.2.698/src/abstract_utilities/class_utils/abstract_classes.py +144 -0
  5. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/caller_utils.py +38 -0
  6. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/imports/imports.py +1 -1
  7. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/imports/classes.py +59 -55
  8. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/imports/module_imports.py +1 -1
  9. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/file_filters/ensure_utils.py +57 -27
  10. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/find_collect.py +10 -0
  11. abstract_utilities-0.2.2.698/src/abstract_utilities/import_utils/imports/__init__.py +4 -0
  12. abstract_utilities-0.2.2.698/src/abstract_utilities/import_utils/imports/init_imports.py +3 -0
  13. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/imports/module_imports.py +1 -0
  14. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/imports/utils.py +1 -1
  15. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/__init__.py +1 -0
  16. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/import_utils.py +38 -0
  17. abstract_utilities-0.2.2.698/src/abstract_utilities/import_utils/src/layze_import_utils/__init__.py +2 -0
  18. abstract_utilities-0.2.2.698/src/abstract_utilities/import_utils/src/layze_import_utils/lazy_utils.py +41 -0
  19. abstract_utilities-0.2.2.698/src/abstract_utilities/import_utils/src/layze_import_utils/nullProxy.py +37 -0
  20. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/imports.py +5 -2
  21. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/json_utils/json_utils.py +37 -3
  22. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/list_utils/list_utils.py +3 -0
  23. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/log_file.py +82 -27
  24. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/path_utils/imports/module_imports.py +1 -1
  25. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/path_utils/path_utils.py +7 -12
  26. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/read_write_utils/read_write_utils.py +63 -30
  27. abstract_utilities-0.2.2.698/src/abstract_utilities/safe_utils/imports/imports.py +2 -0
  28. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/__init__.py +7 -0
  29. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/get_type.py +120 -0
  30. {abstract_utilities-0.2.2.632/src/abstract_utilities/import_utils → abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils}/imports/__init__.py +0 -1
  31. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/imports/constants.py +134 -0
  32. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/imports/module_imports.py +25 -0
  33. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/is_type.py +455 -0
  34. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/make_type.py +126 -0
  35. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/mime_types.py +68 -0
  36. abstract_utilities-0.2.2.698/src/abstract_utilities/type_utils/type_utils.py +104 -0
  37. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
  38. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities.egg-info/SOURCES.txt +9 -1
  39. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/tests/test.py +4 -4
  40. abstract_utilities-0.2.2.632/src/abstract_utilities/class_utils/abstract_classes.py +0 -74
  41. abstract_utilities-0.2.2.632/src/abstract_utilities/import_utils/imports/imports.py +0 -4
  42. abstract_utilities-0.2.2.632/src/abstract_utilities/json_utils/imports/imports.py +0 -2
  43. abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/__init__.py +0 -3
  44. abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/imports/__init__.py +0 -2
  45. abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/imports/module_imports.py +0 -1
  46. abstract_utilities-0.2.2.632/src/abstract_utilities/type_utils/type_utils.py +0 -981
  47. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/README.md +0 -0
  48. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/pyproject.toml +0 -0
  49. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/setup.cfg +0 -0
  50. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/__init__.py +0 -0
  51. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/class_utils.py +0 -0
  52. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/function_utils.py +0 -0
  53. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/global_utils.py +0 -0
  54. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/imports/__init__.py +0 -0
  55. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/imports/utils.py +0 -0
  56. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/class_utils/module_utils.py +0 -0
  57. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/compare_utils/__init__.py +0 -0
  58. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/compare_utils/best_match.py +0 -0
  59. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
  60. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/compare_utils/find_value.py +0 -0
  61. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/__init__.py +0 -0
  62. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/imports/__init__.py +0 -0
  63. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/imports/imports.py +0 -0
  64. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/imports/module_imports.py +0 -0
  65. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/src/__init__.py +0 -0
  66. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/src/directory_utils.py +0 -0
  67. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/src/name_utils.py +0 -0
  68. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/src/size_utils.py +0 -0
  69. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/directory_utils/src/utils.py +0 -0
  70. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/env_utils/__init__.py +0 -0
  71. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
  72. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/env_utils/envy_it.py +0 -0
  73. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/env_utils/imports/__init__.py +0 -0
  74. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/env_utils/imports/imports.py +0 -0
  75. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
  76. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/error_utils/__init__.py +0 -0
  77. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/error_utils/error_utils.py +0 -0
  78. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/error_utils/imports/__init__.py +0 -0
  79. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/error_utils/imports/imports.py +0 -0
  80. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/error_utils/imports/module_imports.py +0 -0
  81. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/__init__.py +0 -0
  82. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/imports/__init__.py +0 -0
  83. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/imports/clean_imps.py +0 -0
  84. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/imports/constants.py +0 -0
  85. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/imports/imports.py +0 -0
  86. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/__init__.py +0 -0
  87. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/file_filters/__init__.py +0 -0
  88. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/file_filters/filter_params.py +0 -0
  89. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/file_filters/filter_utils.py +0 -0
  90. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/file_filters/predicate_utils.py +0 -0
  91. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/find_content.py +0 -0
  92. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/initFunctionsGen.py +0 -0
  93. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/initFunctionsGens.py +0 -0
  94. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/map_utils.py +0 -0
  95. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/reader_utils/__init__.py +0 -0
  96. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/reader_utils/directory_reader.py +0 -0
  97. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/reader_utils/file_reader.py +0 -0
  98. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/reader_utils/file_readers.py +0 -0
  99. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/reader_utils/imports.py +0 -0
  100. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils/src/reader_utils/pdf_utils.py +0 -0
  101. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/__init__.py +0 -0
  102. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/__init__.py +0 -0
  103. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/constants.py +0 -0
  104. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/imports/__init__.py +0 -0
  105. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/imports/constants.py +0 -0
  106. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/imports/imports.py +0 -0
  107. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/imports/module_imports.py +0 -0
  108. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/utils/__init__.py +0 -0
  109. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/utils/classes.py +0 -0
  110. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/utils/clean_imps.py +0 -0
  111. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/imports/utils/filter_utils.py +0 -0
  112. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/src/__init__.py +0 -0
  113. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/src/file_filters.py +0 -0
  114. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/src/file_reader.py +0 -0
  115. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/src/find_collect.py +0 -0
  116. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/src/map_utils.py +0 -0
  117. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/file_utils (2)/src/pdf_utils.py +0 -0
  118. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/hash_utils/__init__.py +0 -0
  119. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/hash_utils/hash_utils.py +0 -0
  120. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/hash_utils/imports/__init__.py +0 -0
  121. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/hash_utils/imports/imports.py +0 -0
  122. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/hash_utils/imports/module_imports.py +0 -0
  123. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/history_utils/__init__.py +0 -0
  124. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/history_utils/history_utils.py +0 -0
  125. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/history_utils/imports/__init__.py +0 -0
  126. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/history_utils/imports/imports.py +0 -0
  127. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/history_utils/imports/module_imports.py +0 -0
  128. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/__init__.py +0 -0
  129. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/circular_import_finder.py +0 -0
  130. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/circular_import_finder2.py +0 -0
  131. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/imports/constants.py +0 -0
  132. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/clean_imports.py +0 -0
  133. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/dot_utils.py +0 -0
  134. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/extract_utils.py +0 -0
  135. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/import_functions.py +0 -0
  136. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/package_utils/__init__.py +0 -0
  137. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/package_utils/context_utils.py +0 -0
  138. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/package_utils/import_collectors.py +0 -0
  139. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/package_utils/path_utils.py +0 -0
  140. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/package_utils/safe_import.py +0 -0
  141. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/pkg_utils.py +0 -0
  142. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/import_utils/src/sysroot_utils.py +0 -0
  143. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/json_utils/__init__.py +0 -0
  144. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/json_utils/imports/__init__.py +0 -0
  145. {abstract_utilities-0.2.2.632/src/abstract_utilities/safe_utils → abstract_utilities-0.2.2.698/src/abstract_utilities/json_utils}/imports/imports.py +0 -0
  146. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/json_utils/imports/module_imports.py +0 -0
  147. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/list_utils/__init__.py +0 -0
  148. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/list_utils/imports/__init__.py +0 -0
  149. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/list_utils/imports/imports.py +0 -0
  150. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/list_utils/imports/module_imports.py +0 -0
  151. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/__init__.py +0 -0
  152. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/abstractLogManager.py +0 -0
  153. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/call_response.py +0 -0
  154. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/imports/__init__.py +0 -0
  155. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/imports/imports.py +0 -0
  156. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/imports/module_imports.py +0 -0
  157. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/log_utils/logger_callable.py +0 -0
  158. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/math_utils/__init__.py +0 -0
  159. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/math_utils/imports/__init__.py +0 -0
  160. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/math_utils/imports/imports.py +0 -0
  161. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/math_utils/imports/module_imports.py +0 -0
  162. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/math_utils/math_utils.py +0 -0
  163. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/parse_utils/__init__.py +0 -0
  164. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/parse_utils/imports/__init__.py +0 -0
  165. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/parse_utils/imports/constants.py +0 -0
  166. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/parse_utils/imports/imports.py +0 -0
  167. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/parse_utils/imports/module_imports.py +0 -0
  168. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/parse_utils/parse_utils.py +0 -0
  169. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/path_utils/__init__.py +0 -0
  170. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/path_utils/imports/__init__.py +0 -0
  171. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/path_utils/imports/imports.py +0 -0
  172. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/read_write_utils/__init__.py +0 -0
  173. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/read_write_utils/imports/__init__.py +0 -0
  174. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/read_write_utils/imports/imports.py +0 -0
  175. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/read_write_utils/imports/module_imports.py +0 -0
  176. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/safe_utils/__init__.py +0 -0
  177. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/safe_utils/imports/__init__.py +0 -0
  178. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/safe_utils/imports/module_imports.py +0 -0
  179. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/safe_utils/safe_utils.py +0 -0
  180. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/__init__.py +0 -0
  181. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/classes.py +0 -0
  182. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/cmd_utils.py +0 -0
  183. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/imports/__init__.py +0 -0
  184. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/imports/imports.py +0 -0
  185. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/imports/module_imports.py +0 -0
  186. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/imports/utils.py +0 -0
  187. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -0
  188. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/ssh_utils/type_checks.py +0 -0
  189. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/__init__.py +0 -0
  190. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/clean_utils.py +0 -0
  191. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/eat_utils.py +0 -0
  192. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/imports/__init__.py +0 -0
  193. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/imports/imports.py +0 -0
  194. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/imports/module_imports.py +0 -0
  195. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/imports/utils.py +0 -0
  196. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/string_utils/replace_utils.py +0 -0
  197. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/thread_utils/__init__.py +0 -0
  198. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/thread_utils/imports/__init__.py +0 -0
  199. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/thread_utils/imports/imports.py +0 -0
  200. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/thread_utils/imports/module_imports.py +0 -0
  201. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/thread_utils/thread_utils.py +0 -0
  202. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/time_utils/__init__.py +0 -0
  203. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/time_utils/imports/__init__.py +0 -0
  204. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/time_utils/imports/imports.py +0 -0
  205. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/time_utils/imports/module_imports.py +0 -0
  206. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/time_utils/time_utils.py +0 -0
  207. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/type_utils/alpha_utils.py +0 -0
  208. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/type_utils/imports/imports.py +0 -0
  209. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/type_utils/num_utils.py +0 -0
  210. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities/utils.py +0 -0
  211. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
  212. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/src/abstract_utilities.egg-info/requires.txt +0 -0
  213. {abstract_utilities-0.2.2.632 → abstract_utilities-0.2.2.698}/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.632
3
+ Version: 0.2.2.698
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.632',
7
+ version='0.2.2.698',
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.',
@@ -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
- contingencies = list(set([user_at_host,password,key,env_path]))
54
- len_contingencies = len(contingencies)
55
- is_potential = (len_contingencies >1 or (None not in contingencies))
56
- if not is_potential:
57
- return os.path.isfile(path)
58
- cmd = get_item_check_cmd(path,file=True)
59
- return run_cmd(cmd=cmd,
60
- user_at_host=user_at_host,
61
- password=password,
62
- key=key,
63
- env_path=env_path,
64
- **kwargs
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
- contingencies = list(set([user_at_host,password,key,env_path]))
75
- len_contingencies = len(contingencies)
76
- is_potential = (len_contingencies >1 or (None not in contingencies))
77
- if not is_potential:
78
- return os.path.isdir(path)
79
- cmd = get_item_check_cmd(path,file=False,directory=True)
80
- return run_cmd(cmd=cmd,
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 is_any(
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
- contingencies = list(set([user_at_host,password,key,env_path]))
118
- len_contingencies = len(contingencies)
119
- is_potential = (len_contingencies >1 or (None not in contingencies))
120
- if not is_potential:
121
- return os.path.exists(path)
122
- if is_potential == True:
123
- out_js = get_all_item_check_cmd(path,file=True,directory=True,exists=True)
124
- for typ,cmd in out_js.items():
125
- response = run_cmd(cmd=cmd,
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
- result = "__OK__" in (response or "")
133
- if result:
134
- return typ
135
- return None
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
- safe_directories = get_dir_filter_kwargs(**kwargs)
126
- safe_dirs = safe_directories.get('directories')
127
- safe_dirs = if_none_change(safe_dirs or None,get_initial_caller_dir())
128
- directories+= make_list(safe_dirs)
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,**kwargs) -> Callable[[str], bool]:
343
+ def make_allowed_predicate(cfg: ScanConfig = None, **kwargs) -> Callable[[str], bool]:
341
344
  """
342
- Build a predicate that returns True if a given path is considered allowed
343
- under the given ScanConfig. Applies allowed_* and exclude_* logic symmetrically.
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
- cfg=cfg or define_defaults(**kwargs)
346
- def allowed(path: str=None,p=None) -> bool:
347
- p = p or Path(path)
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
- for dpat in cfg.exclude_dirs:
356
- dpat_l = dpat.lower()
357
- if dpat_l in path_str or fnmatch.fnmatch(name, dpat_l):
358
- if p.is_dir() or dpat_l in path_str:
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
- # must be in at least one allowed dir
363
- if not any(
364
- fnmatch.fnmatch(path_str, f"*{dpat.lower()}*") for dpat in cfg.allowed_dirs
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
- if fnmatch.fnmatch(name, pat.lower()):
378
- return False
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 (optional)
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
- if cfg.exclude_types and cfg.exclude_types != {"*"}:
397
- if any(t in path_str for t in cfg.exclude_types):
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]
@@ -0,0 +1,4 @@
1
+ from .init_imports import *
2
+ from .module_imports import *
3
+ from .constants import *
4
+ from .utils import *
@@ -6,3 +6,4 @@ from ...path_utils import get_file_parts
6
6
  from ...type_utils import is_number,make_list
7
7
  from ...file_utils import collect_filepaths,collect_globs
8
8
  from ...directory_utils import get_shortest_path,get_common_root
9
+ from ...log_utils import get_logFile
@@ -1,4 +1,4 @@
1
- import os
1
+ from .init_imports import *
2
2
  from .constants import *
3
3
 
4
4
  def is_line_import(line):
@@ -5,3 +5,4 @@ from .import_utils import *
5
5
  from .import_functions import *
6
6
  from .pkg_utils import *
7
7
  from .sysroot_utils import *
8
+ from .layze_import_utils import *
@@ -297,3 +297,41 @@ 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
+ """
304
+ mode = mode or "dev"
305
+ from abstract_utilities import get_logFile
306
+ logger = get_logFile(__name__)
307
+
308
+ try:
309
+ base_pkg = self.__class__.__module__.rsplit('.', 1)[0]
310
+
311
+ if mode == "prod":
312
+ # All imports come from the auto-generated import script
313
+ imports_mod = importlib.import_module(f"{base_pkg}.imports.funcs_imports")
314
+
315
+ # Attach all exports
316
+ for name in getattr(imports_mod, "__all__", []):
317
+ func = getattr(imports_mod, name)
318
+ setattr(self, name, func.__get__(self))
319
+
320
+ return self
321
+
322
+ # --- DEV MODE: your existing dynamic loader ---
323
+ import inspect, pkgutil, importlib
324
+ pkg = importlib.import_module(base_pkg + ".functions")
325
+
326
+ existing = set(self.__dict__) | set(dir(self))
327
+
328
+ for _, module_name, _ in pkgutil.iter_modules(pkg.__path__):
329
+ mod = importlib.import_module(f"{pkg.__name__}.{module_name}")
330
+
331
+ for name, obj in inspect.getmembers(mod, inspect.isfunction):
332
+ setattr(self, name, obj.__get__(self)))
333
+
334
+ except Exception as e:
335
+ logger.error(f"initFuncs({mode}) error: {e}")
336
+
337
+ return self
@@ -0,0 +1,2 @@
1
+ from .nullProxy import *
2
+ from .lazy_utils import *