abstract-utilities 0.2.2.639__tar.gz → 0.2.2.679__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.
Files changed (209) hide show
  1. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/PKG-INFO +1 -1
  2. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/setup.py +1 -1
  3. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/__init__.py +5 -2
  4. abstract_utilities-0.2.2.679/src/abstract_utilities/class_utils/abstract_classes.py +144 -0
  5. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/caller_utils.py +38 -0
  6. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/imports/imports.py +1 -1
  7. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/imports/classes.py +59 -55
  8. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/imports/module_imports.py +1 -1
  9. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/file_filters/ensure_utils.py +7 -4
  10. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/find_collect.py +10 -0
  11. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/imports/__init__.py +1 -1
  12. abstract_utilities-0.2.2.679/src/abstract_utilities/import_utils/imports/init_imports.py +3 -0
  13. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/imports/module_imports.py +1 -0
  14. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/imports/utils.py +1 -1
  15. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/__init__.py +1 -0
  16. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/import_utils.py +41 -0
  17. abstract_utilities-0.2.2.679/src/abstract_utilities/import_utils/src/layze_import_utils/__init__.py +2 -0
  18. abstract_utilities-0.2.2.679/src/abstract_utilities/import_utils/src/layze_import_utils/lazy_utils.py +41 -0
  19. abstract_utilities-0.2.2.679/src/abstract_utilities/import_utils/src/layze_import_utils/nullProxy.py +37 -0
  20. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/imports.py +5 -2
  21. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/json_utils/json_utils.py +29 -3
  22. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/list_utils/list_utils.py +3 -0
  23. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/log_file.py +82 -27
  24. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/path_utils/imports/module_imports.py +1 -1
  25. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/path_utils/path_utils.py +7 -12
  26. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/read_write_utils/read_write_utils.py +63 -30
  27. abstract_utilities-0.2.2.679/src/abstract_utilities/safe_utils/imports/imports.py +2 -0
  28. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/get_type.py +4 -0
  29. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities.egg-info/PKG-INFO +1 -1
  30. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities.egg-info/SOURCES.txt +4 -1
  31. abstract_utilities-0.2.2.639/src/abstract_utilities/class_utils/abstract_classes.py +0 -74
  32. abstract_utilities-0.2.2.639/src/abstract_utilities/import_utils/imports/imports.py +0 -4
  33. abstract_utilities-0.2.2.639/src/abstract_utilities/json_utils/imports/imports.py +0 -2
  34. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/README.md +0 -0
  35. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/pyproject.toml +0 -0
  36. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/setup.cfg +0 -0
  37. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/__init__.py +0 -0
  38. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/class_utils.py +0 -0
  39. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/function_utils.py +0 -0
  40. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/global_utils.py +0 -0
  41. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/imports/__init__.py +0 -0
  42. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/imports/utils.py +0 -0
  43. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/class_utils/module_utils.py +0 -0
  44. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/compare_utils/__init__.py +0 -0
  45. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/compare_utils/best_match.py +0 -0
  46. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/compare_utils/compare_utils.py +0 -0
  47. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/compare_utils/find_value.py +0 -0
  48. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/__init__.py +0 -0
  49. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/imports/__init__.py +0 -0
  50. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/imports/imports.py +0 -0
  51. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/imports/module_imports.py +0 -0
  52. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/src/__init__.py +0 -0
  53. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/src/directory_utils.py +0 -0
  54. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/src/name_utils.py +0 -0
  55. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/src/size_utils.py +0 -0
  56. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/directory_utils/src/utils.py +0 -0
  57. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/env_utils/__init__.py +0 -0
  58. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/env_utils/abstractEnv.py +0 -0
  59. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/env_utils/envy_it.py +0 -0
  60. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/env_utils/imports/__init__.py +0 -0
  61. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/env_utils/imports/imports.py +0 -0
  62. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/env_utils/imports/utils.py +0 -0
  63. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/error_utils/__init__.py +0 -0
  64. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/error_utils/error_utils.py +0 -0
  65. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/error_utils/imports/__init__.py +0 -0
  66. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/error_utils/imports/imports.py +0 -0
  67. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/error_utils/imports/module_imports.py +0 -0
  68. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/__init__.py +0 -0
  69. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/imports/__init__.py +0 -0
  70. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/imports/clean_imps.py +0 -0
  71. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/imports/constants.py +0 -0
  72. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/imports/imports.py +0 -0
  73. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/__init__.py +0 -0
  74. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/file_filters/__init__.py +0 -0
  75. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/file_filters/filter_params.py +0 -0
  76. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/file_filters/filter_utils.py +0 -0
  77. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/file_filters/predicate_utils.py +0 -0
  78. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/find_content.py +0 -0
  79. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/initFunctionsGen.py +0 -0
  80. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/initFunctionsGens.py +0 -0
  81. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/map_utils.py +0 -0
  82. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/reader_utils/__init__.py +0 -0
  83. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/reader_utils/directory_reader.py +0 -0
  84. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/reader_utils/file_reader.py +0 -0
  85. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/reader_utils/file_readers.py +0 -0
  86. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/reader_utils/imports.py +0 -0
  87. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils/src/reader_utils/pdf_utils.py +0 -0
  88. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/__init__.py +0 -0
  89. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/__init__.py +0 -0
  90. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/constants.py +0 -0
  91. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/imports/__init__.py +0 -0
  92. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/imports/constants.py +0 -0
  93. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/imports/imports.py +0 -0
  94. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/imports/module_imports.py +0 -0
  95. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/utils/__init__.py +0 -0
  96. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/utils/classes.py +0 -0
  97. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/utils/clean_imps.py +0 -0
  98. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/imports/utils/filter_utils.py +0 -0
  99. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/src/__init__.py +0 -0
  100. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/src/file_filters.py +0 -0
  101. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/src/file_reader.py +0 -0
  102. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/src/find_collect.py +0 -0
  103. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/src/map_utils.py +0 -0
  104. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/file_utils (2)/src/pdf_utils.py +0 -0
  105. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/hash_utils/__init__.py +0 -0
  106. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/hash_utils/hash_utils.py +0 -0
  107. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/hash_utils/imports/__init__.py +0 -0
  108. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/hash_utils/imports/imports.py +0 -0
  109. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/hash_utils/imports/module_imports.py +0 -0
  110. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/history_utils/__init__.py +0 -0
  111. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/history_utils/history_utils.py +0 -0
  112. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/history_utils/imports/__init__.py +0 -0
  113. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/history_utils/imports/imports.py +0 -0
  114. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/history_utils/imports/module_imports.py +0 -0
  115. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/__init__.py +0 -0
  116. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/circular_import_finder.py +0 -0
  117. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/circular_import_finder2.py +0 -0
  118. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/imports/constants.py +0 -0
  119. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/clean_imports.py +0 -0
  120. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/dot_utils.py +0 -0
  121. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/extract_utils.py +0 -0
  122. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/import_functions.py +0 -0
  123. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/package_utils/__init__.py +0 -0
  124. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/package_utils/context_utils.py +0 -0
  125. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/package_utils/import_collectors.py +0 -0
  126. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/package_utils/path_utils.py +0 -0
  127. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/package_utils/safe_import.py +0 -0
  128. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/pkg_utils.py +0 -0
  129. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/import_utils/src/sysroot_utils.py +0 -0
  130. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/json_utils/__init__.py +0 -0
  131. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/json_utils/imports/__init__.py +0 -0
  132. {abstract_utilities-0.2.2.639/src/abstract_utilities/safe_utils → abstract_utilities-0.2.2.679/src/abstract_utilities/json_utils}/imports/imports.py +0 -0
  133. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/json_utils/imports/module_imports.py +0 -0
  134. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/list_utils/__init__.py +0 -0
  135. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/list_utils/imports/__init__.py +0 -0
  136. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/list_utils/imports/imports.py +0 -0
  137. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/list_utils/imports/module_imports.py +0 -0
  138. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/__init__.py +0 -0
  139. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/abstractLogManager.py +0 -0
  140. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/call_response.py +0 -0
  141. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/imports/__init__.py +0 -0
  142. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/imports/imports.py +0 -0
  143. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/imports/module_imports.py +0 -0
  144. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/log_utils/logger_callable.py +0 -0
  145. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/math_utils/__init__.py +0 -0
  146. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/math_utils/imports/__init__.py +0 -0
  147. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/math_utils/imports/imports.py +0 -0
  148. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/math_utils/imports/module_imports.py +0 -0
  149. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/math_utils/math_utils.py +0 -0
  150. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/parse_utils/__init__.py +0 -0
  151. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/parse_utils/imports/__init__.py +0 -0
  152. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/parse_utils/imports/constants.py +0 -0
  153. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/parse_utils/imports/imports.py +0 -0
  154. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/parse_utils/imports/module_imports.py +0 -0
  155. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/parse_utils/parse_utils.py +0 -0
  156. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/path_utils/__init__.py +0 -0
  157. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/path_utils/imports/__init__.py +0 -0
  158. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/path_utils/imports/imports.py +0 -0
  159. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/read_write_utils/__init__.py +0 -0
  160. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/read_write_utils/imports/__init__.py +0 -0
  161. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/read_write_utils/imports/imports.py +0 -0
  162. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/read_write_utils/imports/module_imports.py +0 -0
  163. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/safe_utils/__init__.py +0 -0
  164. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/safe_utils/imports/__init__.py +0 -0
  165. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/safe_utils/imports/module_imports.py +0 -0
  166. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/safe_utils/safe_utils.py +0 -0
  167. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/__init__.py +0 -0
  168. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/classes.py +0 -0
  169. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/cmd_utils.py +0 -0
  170. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/imports/__init__.py +0 -0
  171. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/imports/imports.py +0 -0
  172. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/imports/module_imports.py +0 -0
  173. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/imports/utils.py +0 -0
  174. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/pexpect_utils.py +0 -0
  175. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/ssh_utils/type_checks.py +0 -0
  176. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/__init__.py +0 -0
  177. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/clean_utils.py +0 -0
  178. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/eat_utils.py +0 -0
  179. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/imports/__init__.py +0 -0
  180. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/imports/imports.py +0 -0
  181. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/imports/module_imports.py +0 -0
  182. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/imports/utils.py +0 -0
  183. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/string_utils/replace_utils.py +0 -0
  184. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/thread_utils/__init__.py +0 -0
  185. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/thread_utils/imports/__init__.py +0 -0
  186. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/thread_utils/imports/imports.py +0 -0
  187. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/thread_utils/imports/module_imports.py +0 -0
  188. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/thread_utils/thread_utils.py +0 -0
  189. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/time_utils/__init__.py +0 -0
  190. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/time_utils/imports/__init__.py +0 -0
  191. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/time_utils/imports/imports.py +0 -0
  192. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/time_utils/imports/module_imports.py +0 -0
  193. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/time_utils/time_utils.py +0 -0
  194. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/__init__.py +0 -0
  195. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/alpha_utils.py +0 -0
  196. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/imports/__init__.py +0 -0
  197. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/imports/constants.py +0 -0
  198. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/imports/imports.py +0 -0
  199. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/imports/module_imports.py +0 -0
  200. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/is_type.py +0 -0
  201. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/make_type.py +0 -0
  202. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/mime_types.py +0 -0
  203. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/num_utils.py +0 -0
  204. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/type_utils/type_utils.py +0 -0
  205. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities/utils.py +0 -0
  206. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities.egg-info/dependency_links.txt +0 -0
  207. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities.egg-info/requires.txt +0 -0
  208. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/src/abstract_utilities.egg-info/top_level.txt +0 -0
  209. {abstract_utilities-0.2.2.639 → abstract_utilities-0.2.2.679}/tests/test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstract_utilities
3
- Version: 0.2.2.639
3
+ Version: 0.2.2.679
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.639',
7
+ version='0.2.2.679',
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,
@@ -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
@@ -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]
@@ -1,4 +1,4 @@
1
- from .imports import *
1
+ from .init_imports import *
2
2
  from .module_imports import *
3
3
  from .constants import *
4
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,44 @@ 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
+
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
+ try:
330
+ mod = importlib.import_module(f"{pkg.__name__}.{module_name}")
331
+
332
+ for name, obj in inspect.getmembers(mod, inspect.isfunction):
333
+ if name not in existing:
334
+ setattr(self, name, obj.__get__(self))
335
+ except Exception as e:
336
+ logger.error(f"initFuncs({mode}) pkgutil error: {e}")
337
+ except Exception as e:
338
+ logger.error(f"initFuncs({mode}) error: {e}")
339
+
340
+ return self
@@ -0,0 +1,2 @@
1
+ from .nullProxy import *
2
+ from .lazy_utils import *
@@ -0,0 +1,41 @@
1
+ from ...imports import *
2
+ from .nullProxy import nullProxy,nullProxy_logger
3
+ @lru_cache(maxsize=None)
4
+ def lazy_import_single(name: str,fallback=None):
5
+ """
6
+ Import module safely. If unavailable, return NullProxy.
7
+ """
8
+
9
+ if name in sys.modules:
10
+ return sys.modules[name]
11
+
12
+ try:
13
+ module = importlib.import_module(name)
14
+ return module
15
+ except Exception as e:
16
+ nullProxy_logger.warning(
17
+ "[lazy_import] Failed to import '%s': %s",
18
+ name,
19
+ e,
20
+ )
21
+ return nullProxy(name,fallback=fallback)
22
+
23
+ def get_lazy_attr(module_name: str, *attrs,fallback=None):
24
+ obj = lazy_import(module_name,fallback=fallback)
25
+
26
+ for attr in attrs:
27
+ try:
28
+ obj = getattr(obj, attr)
29
+ except Exception:
30
+ return nullProxy(module_name, attrs,fallback=fallback)
31
+
32
+ return obj
33
+ def lazy_import(name: str, *attrs,fallback=None):
34
+ """
35
+ Import module safely. If unavailable, return NullProxy.
36
+ """
37
+ if attrs:
38
+ obj = get_lazy_attr(name, *attrs,fallback=fallback)
39
+ else:
40
+ obj = lazy_import_single(name,fallback=fallback)
41
+ return obj
@@ -0,0 +1,37 @@
1
+ from ...imports import *
2
+ nullProxy_logger = logging.getLogger("abstract.lazy_import")
3
+
4
+
5
+ class nullProxy:
6
+ """
7
+ Safe, chainable, callable placeholder for missing modules/attributes.
8
+ """
9
+
10
+ def __init__(self, name, path=(),fallback=None):
11
+ self._name = name
12
+ self._path = path
13
+ self.fallback=fallback
14
+ def __getattr__(self, attr):
15
+ return nullProxy(self._name, self._path + (attr,))
16
+
17
+ def __call__(self, *args, **kwargs):
18
+ if self.fallback is not None:
19
+ try:
20
+ return self.fallback(*args, **kwargs)
21
+ except Exception as e:
22
+ logger.info(f"{e}")
23
+ nullProxy_logger.warning(
24
+ "[lazy_import] Call to missing module/attr: %s.%s args=%s kwargs=%s",
25
+ self._name,
26
+ ".".join(self._path),
27
+ args,
28
+ kwargs,
29
+ )
30
+ return None
31
+
32
+ def __repr__(self):
33
+ full = ".".join((self._name, *self._path))
34
+ return f"<nullProxy {full}>"
35
+
36
+ def __bool__(self):
37
+ return False # safe in conditionals
@@ -1,14 +1,14 @@
1
1
  from __future__ import annotations
2
2
  import re,pexpect,shlex,ezodf,tiktoken,geopandas as gpd,os,PyPDF2,json,tempfile,requests
3
3
  import textwrap,pdfplumber,math,hashlib,pandas as pd,platform,textwrap as tw,glob,asyncio
4
- import fnmatch,importlib,shutil,sys,time,threading,posixpath,importlib.util,types
4
+ import fnmatch,importlib,shutil,sys,time,threading,posixpath,importlib.util,types, logging
5
5
  import subprocess,pytesseract,queue,logging,functools,pathlib,pkgutil,inspect
6
6
  from typing import *
7
7
  from datetime import timedelta,datetime
8
8
  from flask import jsonify
9
9
  from logging.handlers import RotatingFileHandler
10
10
  from pathlib import Path
11
- from functools import reduce
11
+ from functools import reduce,lru_cache
12
12
  from types import MethodType,ModuleType
13
13
  from werkzeug.utils import secure_filename
14
14
  from werkzeug.datastructures import FileStorage
@@ -16,3 +16,6 @@ from pdf2image import convert_from_path # only used for OCR fallback
16
16
  from dataclasses import dataclass,field,asdict
17
17
  from pprint import pprint
18
18
  from dotenv import load_dotenv
19
+ from types import MethodType
20
+ from datetime import datetime, date
21
+ from decimal import Decimal
@@ -123,11 +123,11 @@ def safe_dump_to_file(data, file_path=None, ensure_ascii=False, indent=4, *args,
123
123
  else:
124
124
  logger.error("file_path and data must be provided to safe_dump_to_file")
125
125
 
126
- def safe_read_from_json(*args,**kwargs):
126
+ def safe_read_from_json(file_path,*args,**kwargs):
127
127
  is_read=True
128
- file_path,_ = check_read_write_params(*args, **kwargs)
129
128
 
130
- valid_file_path = get_file_path(*args,is_read=is_read,**kwargs)
129
+
130
+ valid_file_path = get_file_path(file_path,*args,is_read=is_read,**kwargs)
131
131
  if valid_file_path:
132
132
  file_path = valid_file_path
133
133
  try:
@@ -749,3 +749,29 @@ def flatten_json(data, parent_key='', sep='_'):
749
749
  items.append((parent_key, data))
750
750
 
751
751
  return dict(items)
752
+
753
+
754
+ def to_json_safe(obj):
755
+ if obj is None:
756
+ return None
757
+
758
+ if isinstance(obj, (str, int, float, bool)):
759
+ return obj
760
+
761
+ if isinstance(obj, (datetime, date)):
762
+ return obj.isoformat()
763
+
764
+ if isinstance(obj, Decimal):
765
+ return float(obj)
766
+
767
+ if isinstance(obj, Path):
768
+ return str(obj)
769
+
770
+ if isinstance(obj, dict):
771
+ return {k: to_json_safe(v) for k, v in obj.items()}
772
+
773
+ if isinstance(obj, (list, tuple, set)):
774
+ return [to_json_safe(v) for v in obj]
775
+
776
+ # Fallback (yt-dlp objects, enums, etc.)
777
+ return str(obj)
@@ -197,3 +197,6 @@ def make_list(obj:any) -> list:
197
197
  def make_list_it(obj=None):
198
198
  obj = make_list(obj or [])
199
199
  return obj
200
+
201
+ def get_single_from_list(list_obj,default=None):
202
+ return make_list(list_obj or default)[0]