osbot-utils 2.71.0__tar.gz → 2.73.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. osbot_utils-2.73.0/PKG-INFO +212 -0
  2. osbot_utils-2.73.0/README.md +190 -0
  3. osbot_utils-2.73.0/osbot_utils/helpers/safe_str/Safe_Str.py +75 -0
  4. osbot_utils-2.73.0/osbot_utils/helpers/safe_str/Safe_Str__Version.py +20 -0
  5. osbot_utils-2.73.0/osbot_utils/helpers/safe_str/http/Safe_Str__IP_Address.py +29 -0
  6. osbot_utils-2.73.0/osbot_utils/helpers/safe_str/schemas/Enum__Safe_Str__Regex_Mode.py +5 -0
  7. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Temp_Web_Server.py +10 -11
  8. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Http.py +7 -12
  9. osbot_utils-2.73.0/osbot_utils/utils/__init__.py +0 -0
  10. osbot_utils-2.73.0/osbot_utils/version +1 -0
  11. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/pyproject.toml +1 -1
  12. osbot_utils-2.71.0/PKG-INFO +0 -44
  13. osbot_utils-2.71.0/README.md +0 -22
  14. osbot_utils-2.71.0/osbot_utils/helpers/safe_str/Safe_Str.py +0 -54
  15. osbot_utils-2.71.0/osbot_utils/version +0 -1
  16. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/LICENSE +0 -0
  17. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/__init__.py +0 -0
  18. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  19. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  20. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  21. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/base_classes/__init__.py +0 -0
  22. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/context_managers/__init__.py +0 -0
  23. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  24. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  25. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/__init__.py +0 -0
  26. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  27. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  28. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  29. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  30. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  31. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  32. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  33. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/cache.py +0 -0
  34. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  35. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  36. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  37. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  38. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  39. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/catch.py +0 -0
  40. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/context.py +0 -0
  41. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  42. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  43. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  44. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  45. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  46. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  47. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  48. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/fluent/__init__.py +0 -0
  49. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/CFormat.py +0 -0
  50. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/CPrint.py +0 -0
  51. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  52. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  53. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Guid.py +0 -0
  54. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  55. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  56. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  57. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  58. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Print_Table.py +0 -0
  59. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  60. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  61. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  62. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  63. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Safe_Id.py +0 -0
  64. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  65. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  66. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  67. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  68. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/__init__.py +0 -0
  69. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  70. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  71. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  72. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  73. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  74. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  75. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  76. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  77. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  78. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  79. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  80. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  81. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  82. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  83. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  84. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  85. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  86. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  87. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  88. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  89. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  90. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  91. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  92. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  93. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  94. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  95. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  96. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  97. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  98. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  99. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  100. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  101. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  102. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  103. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  104. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  105. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  106. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  107. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  108. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  109. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  110. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  111. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  112. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  113. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  114. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  115. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  116. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  117. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  118. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  119. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  120. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  121. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  122. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  123. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  124. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  125. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  126. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  127. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  128. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  129. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  130. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  131. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  132. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  133. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  134. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  135. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  136. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  137. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  138. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  139. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  140. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  141. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  142. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  143. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  144. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  145. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_on_self/Cache_Controller.py +0 -0
  146. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_on_self/Cache_Key_Generator.py +0 -0
  147. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_on_self/Cache_Metrics.py +0 -0
  148. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_on_self/Cache_On_Self.py +0 -0
  149. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_on_self/Cache_Storage.py +0 -0
  150. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_on_self/__init__.py +0 -0
  151. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  152. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  153. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  154. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  155. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  156. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  157. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  158. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/Duration.py +0 -0
  159. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/__init__.py +0 -0
  160. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/decorators/__init__.py +0 -0
  161. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/decorators/capture_duration.py +0 -0
  162. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/decorators/duration.py +0 -0
  163. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/decorators/print_duration.py +0 -0
  164. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/schemas/Schema__Duration.py +0 -0
  165. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/duration/schemas/__init__.py +0 -0
  166. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  167. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/Task.py +0 -0
  168. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  169. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -0
  170. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
  171. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +0 -0
  172. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +0 -0
  173. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/actions/__init__.py +0 -0
  174. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  175. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  176. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  177. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  178. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  179. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  180. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  181. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
  182. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
  183. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  184. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
  185. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
  186. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
  187. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
  188. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
  189. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +0 -0
  190. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +0 -0
  191. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
  192. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +0 -0
  193. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/flows/schemas/__init__.py +0 -0
  194. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  195. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  196. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  197. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  198. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  199. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/CSS_Dict__To__Css.py +0 -0
  200. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Html_Dict__To__Html.py +0 -0
  201. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Html_Dict__To__Html_Document.py +0 -0
  202. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Html_Dict__To__Html_Tags.py +0 -0
  203. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Html_Document__To__Html_Dict.py +0 -0
  204. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Html__To__Html_Dict.py +0 -0
  205. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Html__To__Html_Document.py +0 -0
  206. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Html__To__Html_Tag.py +0 -0
  207. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  208. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  209. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  210. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  211. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  212. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  213. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  214. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  215. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  216. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/Tag__Text.py +0 -0
  217. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/__init__.py +0 -0
  218. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/schemas/Schema__Html_Document.py +0 -0
  219. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node.py +0 -0
  220. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data.py +0 -0
  221. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +0 -0
  222. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/html/schemas/__init__.py +0 -0
  223. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/__init__.py +0 -0
  224. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/actions/LLM_Request__Execute.py +0 -0
  225. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py +0 -0
  226. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/actions/__init__.py +0 -0
  227. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder.py +0 -0
  228. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py +0 -0
  229. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/builders/LLM_Request__Factory.py +0 -0
  230. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/builders/__init__.py +0 -0
  231. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py +0 -0
  232. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache.py +0 -0
  233. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__File_System.py +0 -0
  234. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__Storage.py +0 -0
  235. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Local__Folder.py +0 -0
  236. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Sqlite.py +0 -0
  237. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/cache/__init__.py +0 -0
  238. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/platforms/__init__.py +0 -0
  239. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/platforms/open_ai/API__LLM__Open_AI.py +0 -0
  240. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/platforms/open_ai/__init__.py +0 -0
  241. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Safe_Str__LLM__Model_Name.py +0 -0
  242. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Cache__Index.py +0 -0
  243. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request.py +0 -0
  244. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Data.py +0 -0
  245. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Function_Call.py +0 -0
  246. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Content.py +0 -0
  247. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Role.py +0 -0
  248. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response.py +0 -0
  249. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response__Cache.py +0 -0
  250. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/llms/schemas/__init__.py +0 -0
  251. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  252. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  253. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  254. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  255. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  256. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  257. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  258. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  259. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  260. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  261. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  262. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  263. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  264. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  265. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  266. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/python_compatibility/__init__.py +0 -0
  267. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  268. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_float/Safe_Float.py +0 -0
  269. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_float/Safe_Float__Engineering.py +0 -0
  270. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_float/Safe_Float__Money.py +0 -0
  271. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_float/Safe_Float__Percentage_Exact.py +0 -0
  272. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_float/__init__.py +0 -0
  273. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_int/Safe_Int.py +0 -0
  274. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_int/Safe_UInt.py +0 -0
  275. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_int/Safe_UInt__Byte.py +0 -0
  276. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_int/Safe_UInt__FileSize.py +0 -0
  277. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_int/Safe_UInt__Percentage.py +0 -0
  278. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_int/Safe_UInt__Port.py +0 -0
  279. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_int/__init__.py +0 -0
  280. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/Safe_Str__File__Name.py +0 -0
  281. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/Safe_Str__File__Path.py +0 -0
  282. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/Safe_Str__Hash.py +0 -0
  283. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/Safe_Str__Text.py +0 -0
  284. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/Safe_Str__Text__Dangerous.py +0 -0
  285. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/Safe_Str__Url.py +0 -0
  286. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/__init__.py +0 -0
  287. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/http/Safe_Str__Html.py +0 -0
  288. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/http/Safe_Str__Http__Content_Type.py +0 -0
  289. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/http/Safe_Str__Http__ETag.py +0 -0
  290. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/http/Safe_Str__Http__Last_Modified.py +0 -0
  291. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/http/Safe_Str__Http__Text.py +0 -0
  292. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/safe_str/http/__init__.py +0 -0
  293. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite → osbot_utils-2.73.0/osbot_utils/helpers/safe_str/schemas}/__init__.py +0 -0
  294. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  295. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  296. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  297. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  298. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  299. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  300. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  301. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  302. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  303. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite/cache → osbot_utils-2.73.0/osbot_utils/helpers/sqlite}/__init__.py +0 -0
  304. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  305. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  306. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  307. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  308. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  309. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  310. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  311. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite/domains → osbot_utils-2.73.0/osbot_utils/helpers/sqlite/cache}/__init__.py +0 -0
  312. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  313. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  314. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  315. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  316. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  317. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite/domains/schemas → osbot_utils-2.73.0/osbot_utils/helpers/sqlite/domains}/__init__.py +0 -0
  318. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite/models → osbot_utils-2.73.0/osbot_utils/helpers/sqlite/domains/schemas}/__init__.py +0 -0
  319. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  320. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite/sample_data → osbot_utils-2.73.0/osbot_utils/helpers/sqlite/models}/__init__.py +0 -0
  321. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  322. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite/sql_builder → osbot_utils-2.73.0/osbot_utils/helpers/sqlite/sample_data}/__init__.py +0 -0
  323. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  324. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  325. {osbot_utils-2.71.0/osbot_utils/helpers/sqlite/tables → osbot_utils-2.73.0/osbot_utils/helpers/sqlite/sql_builder}/__init__.py +0 -0
  326. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  327. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  328. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  329. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  330. {osbot_utils-2.71.0/osbot_utils/helpers/ssh → osbot_utils-2.73.0/osbot_utils/helpers/sqlite/tables}/__init__.py +0 -0
  331. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  332. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  333. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  334. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  335. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  336. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  337. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  338. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  339. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  340. {osbot_utils-2.71.0/osbot_utils/helpers/trace → osbot_utils-2.73.0/osbot_utils/helpers/ssh}/__init__.py +0 -0
  341. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  342. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  343. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  344. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  345. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  346. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  347. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  348. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  349. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  350. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  351. {osbot_utils-2.71.0/osbot_utils/helpers/xml → osbot_utils-2.73.0/osbot_utils/helpers/trace}/__init__.py +0 -0
  352. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  353. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  354. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  355. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  356. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  357. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  358. {osbot_utils-2.71.0/osbot_utils/testing → osbot_utils-2.73.0/osbot_utils/helpers/xml}/__init__.py +0 -0
  359. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  360. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  361. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  362. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  363. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  364. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  365. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Catch.py +0 -0
  366. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  367. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Hook_Method.py +0 -0
  368. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  369. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Log_To_String.py +0 -0
  370. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Logging.py +0 -0
  371. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Patch_Print.py +0 -0
  372. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Profiler.py +0 -0
  373. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Pytest.py +0 -0
  374. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Stderr.py +0 -0
  375. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Stdout.py +0 -0
  376. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  377. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Temp_File.py +0 -0
  378. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  379. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  380. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  381. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  382. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Unit_Test.py +0 -0
  383. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/Unzip_File.py +0 -0
  384. {osbot_utils-2.71.0/osbot_utils/testing/performance → osbot_utils-2.73.0/osbot_utils/testing}/__init__.py +0 -0
  385. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  386. {osbot_utils-2.71.0/osbot_utils/testing/performance/models → osbot_utils-2.73.0/osbot_utils/testing/performance}/__init__.py +0 -0
  387. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  388. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  389. {osbot_utils-2.71.0/osbot_utils/type_safe → osbot_utils-2.73.0/osbot_utils/testing/performance/models}/__init__.py +0 -0
  390. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe.py +0 -0
  391. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  392. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe__Dict.py +0 -0
  393. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe__List.py +0 -0
  394. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe__Method.py +0 -0
  395. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe__Primitive.py +0 -0
  396. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe__Set.py +0 -0
  397. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/Type_Safe__Tuple.py +0 -0
  398. {osbot_utils-2.71.0/osbot_utils/type_safe/decorators → osbot_utils-2.73.0/osbot_utils/type_safe}/__init__.py +0 -0
  399. {osbot_utils-2.71.0/osbot_utils/type_safe/methods → osbot_utils-2.73.0/osbot_utils/type_safe/decorators}/__init__.py +0 -0
  400. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/decorators/type_safe.py +0 -0
  401. {osbot_utils-2.71.0/osbot_utils/type_safe/shared → osbot_utils-2.73.0/osbot_utils/type_safe/methods}/__init__.py +0 -0
  402. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/methods/type_safe_property.py +0 -0
  403. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Annotations.py +0 -0
  404. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Cache.py +0 -0
  405. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Convert.py +0 -0
  406. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Json_Compressor.py +0 -0
  407. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
  408. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Not_Cached.py +0 -0
  409. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Raise_Exception.py +0 -0
  410. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Shared__Variables.py +0 -0
  411. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/shared/Type_Safe__Validation.py +0 -0
  412. {osbot_utils-2.71.0/osbot_utils/type_safe/steps → osbot_utils-2.73.0/osbot_utils/type_safe/shared}/__init__.py +0 -0
  413. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
  414. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  415. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Value.py +0 -0
  416. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/steps/Type_Safe__Step__From_Json.py +0 -0
  417. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Init.py +0 -0
  418. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Set_Attr.py +0 -0
  419. {osbot_utils-2.71.0/osbot_utils/type_safe/validators → osbot_utils-2.73.0/osbot_utils/type_safe/steps}/__init__.py +0 -0
  420. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  421. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  422. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  423. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  424. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  425. {osbot_utils-2.71.0/osbot_utils/utils → osbot_utils-2.73.0/osbot_utils/type_safe/validators}/__init__.py +0 -0
  426. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Assert.py +0 -0
  427. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Call_Stack.py +0 -0
  428. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Csv.py +0 -0
  429. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Dev.py +0 -0
  430. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Env.py +0 -0
  431. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Exceptions.py +0 -0
  432. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Files.py +0 -0
  433. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Functions.py +0 -0
  434. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Int.py +0 -0
  435. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Json.py +0 -0
  436. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Json_Cache.py +0 -0
  437. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Lists.py +0 -0
  438. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Misc.py +0 -0
  439. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Objects.py +0 -0
  440. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Png.py +0 -0
  441. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Process.py +0 -0
  442. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Python_Logger.py +0 -0
  443. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Regex.py +0 -0
  444. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Status.py +0 -0
  445. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Str.py +0 -0
  446. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Threads.py +0 -0
  447. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Toml.py +0 -0
  448. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Version.py +0 -0
  449. {osbot_utils-2.71.0 → osbot_utils-2.73.0}/osbot_utils/utils/Zip.py +0 -0
@@ -0,0 +1,212 @@
1
+ Metadata-Version: 2.3
2
+ Name: osbot_utils
3
+ Version: 2.73.0
4
+ Summary: OWASP Security Bot - Utils
5
+ License: MIT
6
+ Author: Dinis Cruz
7
+ Author-email: dinis.cruz@owasp.org
8
+ Requires-Python: >=3.7,<4.0
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.7
12
+ Classifier: Programming Language :: Python :: 3.8
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Project-URL: Homepage, https://github.com/owasp-sbot/OSBot-Utils
19
+ Project-URL: Repository, https://github.com/owasp-sbot/OSBot-Utils
20
+ Description-Content-Type: text/markdown
21
+
22
+ # OSBot-Utils
23
+
24
+ ![Current Release](https://img.shields.io/badge/release-v2.73.0-blue)
25
+ ![Python](https://img.shields.io/badge/python-3.8+-green)
26
+ ![Type-Safe](https://img.shields.io/badge/Type--Safe-✓-brightgreen)
27
+ ![Caching](https://img.shields.io/badge/Caching-Built--In-orange)
28
+ [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
29
+
30
+ A comprehensive Python utility toolkit providing **Type-Safe primitives**, decorators, caching layers, HTML/AST helpers, SQLite tooling, SSH execution, LLM request pipelines, tracing, and more — all designed to accelerate building robust, maintainable automation and integration code.
31
+
32
+ ---
33
+
34
+ ## ✨ Key Features
35
+
36
+ * **🛡️ Type-Safe First**: Strongly typed primitives (`Safe_Str`, `Safe_Int`, `Safe_Float`, etc.) with validation and sanitization
37
+ * **⚡ Multi-layer Caching**: In-memory, per-instance, pickle-on-disk, temp-file, and request/response caches
38
+ * **🗂️ Rich Utilities**: Helpers for HTML parsing/rendering, AST inspection, SSH/SCP execution, SQLite schema management, and more
39
+ * **🧠 LLM Support**: Structured request builders, OpenAI API integration, schema enforcement, and persistent cache
40
+ * **🔍 Tracing & Debugging**: Full function call tracing with configurable depth, locals capture, and pretty output
41
+ * **🧪 Testing Utilities**: Temp SQLite DBs, mockable caches, and easy test helpers
42
+
43
+ ---
44
+
45
+ ## 📦 Installation
46
+
47
+ ```bash
48
+ pip install osbot-utils
49
+ ```
50
+
51
+ From source:
52
+
53
+ ```bash
54
+ pip install git+https://github.com/owasp-sbot/OSBot-Utils.git@dev
55
+ ```
56
+
57
+ ---
58
+
59
+ ## 🚀 Quick Start
60
+
61
+ ### Using Type-Safe Primitives
62
+
63
+ ```python
64
+ from osbot_utils.helpers.safe_str.Safe_Str import Safe_Str
65
+
66
+ class Username(Safe_Str):
67
+ max_length = 20
68
+
69
+ print(Username("alice")) # 'alice'
70
+ print(Username("invalid username!")) # 'invalid_username_'
71
+ ```
72
+
73
+ ---
74
+
75
+ ### Simple In-Memory Caching
76
+
77
+ ```python
78
+ from osbot_utils.decorators.methods.cache_on_self import cache_on_self
79
+
80
+ class DataFetcher:
81
+ @cache_on_self
82
+ def fetch(self, x):
83
+ print("Fetching…")
84
+ return x * 2
85
+
86
+ fetcher = DataFetcher()
87
+ fetcher.fetch(10) # Calls method
88
+ fetcher.fetch(10) # Returns cached result
89
+ ```
90
+
91
+ ---
92
+
93
+ ### HTML Parsing
94
+
95
+ ```python
96
+ from osbot_utils.helpers.html.Html__To__Html_Dict import html_to_dict
97
+
98
+ html_code = "<html><body><h1>Hello</h1></body></html>"
99
+ print(html_to_dict(html_code))
100
+ ```
101
+
102
+ ---
103
+
104
+ ### SQLite Dynamic Table
105
+
106
+ ```python
107
+ from osbot_utils.helpers.sqlite.Temp_Sqlite__Table import Temp_Sqlite__Table
108
+
109
+ with Temp_Sqlite__Table() as table:
110
+ table.row_schema = type("Row", (), {"name": str, "age": int})
111
+ table.create()
112
+ table.add_row_and_commit(name="Alice", age=30)
113
+ print(table.rows())
114
+ ```
115
+
116
+ ---
117
+
118
+ ### LLM Request Execution
119
+
120
+ ```python
121
+ from osbot_utils.helpers.llms.builders.LLM_Request__Builder__Open_AI import LLM_Request__Builder__Open_AI
122
+ from osbot_utils.helpers.llms.actions.LLM_Request__Execute import LLM_Request__Execute
123
+
124
+ builder = LLM_Request__Builder__Open_AI()
125
+ builder.set__model__gpt_4o().add_message__user("Say hi in JSON")
126
+
127
+ executor = LLM_Request__Execute(request_builder=builder)
128
+ response = executor.execute(builder.llm_request())
129
+ print(response.response_data)
130
+ ```
131
+
132
+ ---
133
+
134
+ ## 🏗️ Architecture
135
+
136
+ OSBot-Utils is organized into core **Type-Safe foundations** with layered utilities for different domains:
137
+
138
+ ```
139
+ ┌──────────────────────────────────────────────┐
140
+ │ Your Code │
141
+ │ ┌───────────┐ ┌─────────────┐ ┌──────────┐ │
142
+ │ │ Type-Safe │ │ Decorators │ │ Helpers │ │
143
+ │ │ Primitives│ │ & Caching │ │ (HTML, │ │
144
+ │ │ │ │ │ │ AST, │ │
145
+ │ │ │ │ │ │ SQLite)│ │
146
+ │ └───────────┘ └─────────────┘ └──────────┘ │
147
+ └──────────────────────────┬───────────────────┘
148
+
149
+ ┌──────────────────────────▼───────────────────┐
150
+ │ OSBot-Utils │
151
+ │ ┌────────────────────────────────────────┐ │
152
+ │ │ Type-Safe Core Classes │ │
153
+ │ │ Validation / Sanitization / Defaults │ │
154
+ │ └────────────────────────────────────────┘ │
155
+ │ ┌────────────────────────────────────────┐ │
156
+ │ │ Caching Layers & Decorators │ │
157
+ │ │ @cache, @cache_on_self, pickle, tmp │ │
158
+ │ └────────────────────────────────────────┘ │
159
+ │ ┌────────────────────────────────────────┐ │
160
+ │ │ Domain Helpers │ │
161
+ │ │ HTML, AST, SSH, LLMs, SQLite, Tracing │ │
162
+ │ └────────────────────────────────────────┘ │
163
+ └──────────────────────────────────────────────┘
164
+ ```
165
+
166
+ ---
167
+
168
+ ## 📚 Key Modules
169
+
170
+ * **`helpers/safe_*`** — Type-Safe primitives for validated strings, ints, floats
171
+ * **`decorators/methods`** — Caching, exception capture, timing, validation
172
+ * **`helpers/html`** — HTML ↔ dict ↔ tag classes
173
+ * **`helpers/ast`** — Python AST parsing, visiting, merging
174
+ * **`helpers/sqlite`** — High-level SQLite APIs, schema generation, temp DBs
175
+ * **`helpers/ssh`** — SSH/SCP execution with caching
176
+ * **`helpers/llms`** — LLM request/response handling with caching
177
+ * **`helpers/trace`** — Function call tracing with configurable output
178
+
179
+ ---
180
+
181
+ ## 🎯 Benefits
182
+
183
+ ### For Developers
184
+
185
+ * Strong runtime type validation with Type-Safe classes
186
+ * Consistent patterns for caching and decorators
187
+ * Rich helper library to avoid reinventing the wheel
188
+
189
+ ### For Production
190
+
191
+ * Deterministic caching with persistence options
192
+ * Safe, validated data structures at integration boundaries
193
+ * Lightweight, dependency-minimal utilities
194
+
195
+ ### For Teams
196
+
197
+ * Standardized approach to cross-cutting concerns (logging, tracing, caching)
198
+ * Modular helpers to fit many contexts (CLI, web apps, serverless)
199
+
200
+ ---
201
+
202
+ ## 🤝 Contributing
203
+
204
+ Pull requests are welcome!
205
+ Check existing patterns in `/helpers` and `/decorators` for style guidance.
206
+
207
+ ---
208
+
209
+ ## 📄 License
210
+
211
+ Licensed under the Apache 2.0 License.
212
+
@@ -0,0 +1,190 @@
1
+ # OSBot-Utils
2
+
3
+ ![Current Release](https://img.shields.io/badge/release-v2.73.0-blue)
4
+ ![Python](https://img.shields.io/badge/python-3.8+-green)
5
+ ![Type-Safe](https://img.shields.io/badge/Type--Safe-✓-brightgreen)
6
+ ![Caching](https://img.shields.io/badge/Caching-Built--In-orange)
7
+ [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
8
+
9
+ A comprehensive Python utility toolkit providing **Type-Safe primitives**, decorators, caching layers, HTML/AST helpers, SQLite tooling, SSH execution, LLM request pipelines, tracing, and more — all designed to accelerate building robust, maintainable automation and integration code.
10
+
11
+ ---
12
+
13
+ ## ✨ Key Features
14
+
15
+ * **🛡️ Type-Safe First**: Strongly typed primitives (`Safe_Str`, `Safe_Int`, `Safe_Float`, etc.) with validation and sanitization
16
+ * **⚡ Multi-layer Caching**: In-memory, per-instance, pickle-on-disk, temp-file, and request/response caches
17
+ * **🗂️ Rich Utilities**: Helpers for HTML parsing/rendering, AST inspection, SSH/SCP execution, SQLite schema management, and more
18
+ * **🧠 LLM Support**: Structured request builders, OpenAI API integration, schema enforcement, and persistent cache
19
+ * **🔍 Tracing & Debugging**: Full function call tracing with configurable depth, locals capture, and pretty output
20
+ * **🧪 Testing Utilities**: Temp SQLite DBs, mockable caches, and easy test helpers
21
+
22
+ ---
23
+
24
+ ## 📦 Installation
25
+
26
+ ```bash
27
+ pip install osbot-utils
28
+ ```
29
+
30
+ From source:
31
+
32
+ ```bash
33
+ pip install git+https://github.com/owasp-sbot/OSBot-Utils.git@dev
34
+ ```
35
+
36
+ ---
37
+
38
+ ## 🚀 Quick Start
39
+
40
+ ### Using Type-Safe Primitives
41
+
42
+ ```python
43
+ from osbot_utils.helpers.safe_str.Safe_Str import Safe_Str
44
+
45
+ class Username(Safe_Str):
46
+ max_length = 20
47
+
48
+ print(Username("alice")) # 'alice'
49
+ print(Username("invalid username!")) # 'invalid_username_'
50
+ ```
51
+
52
+ ---
53
+
54
+ ### Simple In-Memory Caching
55
+
56
+ ```python
57
+ from osbot_utils.decorators.methods.cache_on_self import cache_on_self
58
+
59
+ class DataFetcher:
60
+ @cache_on_self
61
+ def fetch(self, x):
62
+ print("Fetching…")
63
+ return x * 2
64
+
65
+ fetcher = DataFetcher()
66
+ fetcher.fetch(10) # Calls method
67
+ fetcher.fetch(10) # Returns cached result
68
+ ```
69
+
70
+ ---
71
+
72
+ ### HTML Parsing
73
+
74
+ ```python
75
+ from osbot_utils.helpers.html.Html__To__Html_Dict import html_to_dict
76
+
77
+ html_code = "<html><body><h1>Hello</h1></body></html>"
78
+ print(html_to_dict(html_code))
79
+ ```
80
+
81
+ ---
82
+
83
+ ### SQLite Dynamic Table
84
+
85
+ ```python
86
+ from osbot_utils.helpers.sqlite.Temp_Sqlite__Table import Temp_Sqlite__Table
87
+
88
+ with Temp_Sqlite__Table() as table:
89
+ table.row_schema = type("Row", (), {"name": str, "age": int})
90
+ table.create()
91
+ table.add_row_and_commit(name="Alice", age=30)
92
+ print(table.rows())
93
+ ```
94
+
95
+ ---
96
+
97
+ ### LLM Request Execution
98
+
99
+ ```python
100
+ from osbot_utils.helpers.llms.builders.LLM_Request__Builder__Open_AI import LLM_Request__Builder__Open_AI
101
+ from osbot_utils.helpers.llms.actions.LLM_Request__Execute import LLM_Request__Execute
102
+
103
+ builder = LLM_Request__Builder__Open_AI()
104
+ builder.set__model__gpt_4o().add_message__user("Say hi in JSON")
105
+
106
+ executor = LLM_Request__Execute(request_builder=builder)
107
+ response = executor.execute(builder.llm_request())
108
+ print(response.response_data)
109
+ ```
110
+
111
+ ---
112
+
113
+ ## 🏗️ Architecture
114
+
115
+ OSBot-Utils is organized into core **Type-Safe foundations** with layered utilities for different domains:
116
+
117
+ ```
118
+ ┌──────────────────────────────────────────────┐
119
+ │ Your Code │
120
+ │ ┌───────────┐ ┌─────────────┐ ┌──────────┐ │
121
+ │ │ Type-Safe │ │ Decorators │ │ Helpers │ │
122
+ │ │ Primitives│ │ & Caching │ │ (HTML, │ │
123
+ │ │ │ │ │ │ AST, │ │
124
+ │ │ │ │ │ │ SQLite)│ │
125
+ │ └───────────┘ └─────────────┘ └──────────┘ │
126
+ └──────────────────────────┬───────────────────┘
127
+
128
+ ┌──────────────────────────▼───────────────────┐
129
+ │ OSBot-Utils │
130
+ │ ┌────────────────────────────────────────┐ │
131
+ │ │ Type-Safe Core Classes │ │
132
+ │ │ Validation / Sanitization / Defaults │ │
133
+ │ └────────────────────────────────────────┘ │
134
+ │ ┌────────────────────────────────────────┐ │
135
+ │ │ Caching Layers & Decorators │ │
136
+ │ │ @cache, @cache_on_self, pickle, tmp │ │
137
+ │ └────────────────────────────────────────┘ │
138
+ │ ┌────────────────────────────────────────┐ │
139
+ │ │ Domain Helpers │ │
140
+ │ │ HTML, AST, SSH, LLMs, SQLite, Tracing │ │
141
+ │ └────────────────────────────────────────┘ │
142
+ └──────────────────────────────────────────────┘
143
+ ```
144
+
145
+ ---
146
+
147
+ ## 📚 Key Modules
148
+
149
+ * **`helpers/safe_*`** — Type-Safe primitives for validated strings, ints, floats
150
+ * **`decorators/methods`** — Caching, exception capture, timing, validation
151
+ * **`helpers/html`** — HTML ↔ dict ↔ tag classes
152
+ * **`helpers/ast`** — Python AST parsing, visiting, merging
153
+ * **`helpers/sqlite`** — High-level SQLite APIs, schema generation, temp DBs
154
+ * **`helpers/ssh`** — SSH/SCP execution with caching
155
+ * **`helpers/llms`** — LLM request/response handling with caching
156
+ * **`helpers/trace`** — Function call tracing with configurable output
157
+
158
+ ---
159
+
160
+ ## 🎯 Benefits
161
+
162
+ ### For Developers
163
+
164
+ * Strong runtime type validation with Type-Safe classes
165
+ * Consistent patterns for caching and decorators
166
+ * Rich helper library to avoid reinventing the wheel
167
+
168
+ ### For Production
169
+
170
+ * Deterministic caching with persistence options
171
+ * Safe, validated data structures at integration boundaries
172
+ * Lightweight, dependency-minimal utilities
173
+
174
+ ### For Teams
175
+
176
+ * Standardized approach to cross-cutting concerns (logging, tracing, caching)
177
+ * Modular helpers to fit many contexts (CLI, web apps, serverless)
178
+
179
+ ---
180
+
181
+ ## 🤝 Contributing
182
+
183
+ Pull requests are welcome!
184
+ Check existing patterns in `/helpers` and `/decorators` for style guidance.
185
+
186
+ ---
187
+
188
+ ## 📄 License
189
+
190
+ Licensed under the Apache 2.0 License.
@@ -0,0 +1,75 @@
1
+ import re
2
+ from typing import Optional
3
+ from osbot_utils.helpers.safe_str.schemas.Enum__Safe_Str__Regex_Mode import Enum__Safe_Str__Regex_Mode
4
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
5
+
6
+ TYPE_SAFE__STR__REGEX__SAFE_STR = re.compile(r'[^a-zA-Z0-9]') # Only allow alphanumerics and numbers
7
+ TYPE_SAFE__STR__MAX_LENGTH = 512
8
+
9
+
10
+ class Safe_Str(Type_Safe__Primitive, str):
11
+ max_length : int = TYPE_SAFE__STR__MAX_LENGTH
12
+ regex : re.Pattern = TYPE_SAFE__STR__REGEX__SAFE_STR
13
+ regex_mode : Enum__Safe_Str__Regex_Mode = Enum__Safe_Str__Regex_Mode.REPLACE
14
+ replacement_char : str = '_'
15
+ allow_empty : bool = True
16
+ trim_whitespace : bool = False
17
+ allow_all_replacement_char: bool = True
18
+ strict_validation : bool = False # If True, don't replace invalid chars, raise an error instead
19
+ exact_length : bool = False # If True, require exact length match, not just max length
20
+
21
+
22
+ def __new__(cls, value: Optional[str] = None) -> 'Safe_Str':
23
+
24
+ if value is None: # Validate inputs
25
+ if cls.allow_empty:
26
+ value = ""
27
+ else:
28
+ raise ValueError(f"in {cls.__name__}, value cannot be None when allow_empty is False") from None
29
+
30
+ if not isinstance(value, str): # Convert to string if not already
31
+ value = str(value)
32
+
33
+ if cls.trim_whitespace: # Trim whitespace if requested
34
+ value = value.strip()
35
+
36
+ if not cls.allow_empty and (value is None or value == ""): # Check for empty string if not allowed
37
+ raise ValueError("Value cannot be empty when allow_empty is False")
38
+
39
+ if cls.exact_length and len(value) != cls.max_length:
40
+ raise ValueError(f"Value must be exactly {cls.max_length} characters long (was {len(value)})")
41
+ elif not cls.exact_length and len(value) > cls.max_length: # Check max length
42
+ raise ValueError(f"Value exceeds maximum length of {cls.max_length} characters (was {len(value)})")
43
+
44
+ if cls.allow_empty and value =='':
45
+ return str.__new__(cls, '')
46
+
47
+ sanitized_value = cls.validate_and_sanitize(value)
48
+
49
+
50
+ return str.__new__(cls, sanitized_value)
51
+
52
+ @classmethod
53
+ def validate_and_sanitize(cls, value):
54
+ if cls.strict_validation:
55
+ if cls.regex_mode == Enum__Safe_Str__Regex_Mode.MATCH: # For 'match' mode, regex defines the valid pattern (like version numbers)
56
+ if not cls.regex.match(value):
57
+ raise ValueError(f"Value does not match required pattern: {cls.regex.pattern}")
58
+ return value
59
+ elif cls.regex_mode == Enum__Safe_Str__Regex_Mode.REPLACE: # For 'replace' mode, regex defines invalid characters to replace
60
+ if cls.regex.search(value) is not None:
61
+ raise ValueError(f"Value contains invalid characters (must not match pattern: {cls.regex.pattern})")
62
+ return value
63
+ else:
64
+ raise ValueError(f"in {cls.__name__}, regex_mode value cannot be None when strict_validation is True")
65
+ else:
66
+ if cls.regex_mode == Enum__Safe_Str__Regex_Mode.MATCH: # Cannot do replacement when regex defines valid pattern
67
+ raise ValueError(f"Cannot use regex_mode='match' without strict_validation=True")
68
+ else: # assume the default Enum__Safe_Str__Regex_Mode.MATCH
69
+ sanitized_value = cls.regex.sub(cls.replacement_char, value)
70
+
71
+ if not cls.allow_all_replacement_char and set(sanitized_value) == {
72
+ cls.replacement_char} and sanitized_value:
73
+ raise ValueError(f"Sanitized value consists entirely of '{cls.replacement_char}' characters")
74
+
75
+ return sanitized_value
@@ -0,0 +1,20 @@
1
+ import re
2
+ from osbot_utils.helpers.safe_str.Safe_Str import Safe_Str
3
+ from osbot_utils.helpers.safe_str.schemas.Enum__Safe_Str__Regex_Mode import Enum__Safe_Str__Regex_Mode
4
+
5
+ TYPE_SAFE_STR__VERSION__REGEX = re.compile(r'^v(\d{1,3})\.(\d{1,3})\.(\d{1,3})$') # Regex to match versions like v0.1.1 or v999.999.999
6
+ TYPE_SAFE_STR__VERSION__MAX_LENGTH = 12 # Max length for 'v999.999.999'
7
+
8
+ class Safe_Str__Version(Safe_Str):
9
+ regex = TYPE_SAFE_STR__VERSION__REGEX
10
+ regex_mode = Enum__Safe_Str__Regex_Mode.MATCH # in this case we need an exact match of the version regex
11
+ max_length = TYPE_SAFE_STR__VERSION__MAX_LENGTH
12
+ allow_empty = False
13
+ trim_whitespace = True
14
+ strict_validation = True # Ensure the value exactly matches the regex
15
+
16
+ def __add__(self, other): # Concatenation returns regular str, not Safe_Str__Version
17
+ return str.__add__(self, other)
18
+
19
+ def __radd__(self, other): # Reverse concatenation also returns regular str
20
+ return str.__add__(other, self)
@@ -0,0 +1,29 @@
1
+ import ipaddress
2
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
3
+
4
+
5
+ class Safe_Str__IP_Address(Type_Safe__Primitive, str):
6
+
7
+ def __new__(cls, value: str = None):
8
+ if value is not None: # check that it is not None
9
+ if not isinstance(value, str): # check that it is a string
10
+ raise TypeError(f"Value provided must be a string, and it was {type(value)}")
11
+ else:
12
+ value = value.strip() # trim/strip the value since there could be some leading spaces (which are easy to fix here)
13
+
14
+ if not value: # allow empty or null values
15
+ return str.__new__(cls, "")
16
+
17
+ try:
18
+ ip_obj = ipaddress.ip_address(value) # validate IP address using ipaddress module
19
+ value = str(ip_obj) # Use the canonical representation
20
+ except ValueError as e:
21
+ raise ValueError(f"Invalid IP address: {value}") from e
22
+
23
+ return str.__new__(cls, value)
24
+
25
+ def __add__(self, other): # Concatenation returns regular str, not Safe_Str__IP_Address
26
+ return str.__add__(self, other)
27
+
28
+ def __radd__(self, other): # Reverse concatenation also returns regular str"""
29
+ return str.__add__(other, self)
@@ -0,0 +1,5 @@
1
+ from enum import Enum
2
+
3
+ class Enum__Safe_Str__Regex_Mode(Enum):
4
+ REPLACE : str = 'replace'
5
+ MATCH : str = 'match'
@@ -1,14 +1,11 @@
1
- from contextlib import contextmanager
2
- from functools import partial
3
- from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
4
- from threading import Thread
5
- from urllib.parse import urljoin
6
-
7
- from osbot_utils.utils.Files import file_create, path_combine, temp_filename, file_create_all_parent_folders
8
-
9
- from osbot_utils.utils.Misc import random_port, random_string
10
-
11
- from osbot_utils.utils.Http import port_is_open, GET
1
+ from contextlib import contextmanager
2
+ from functools import partial
3
+ from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
4
+ from threading import Thread
5
+ from urllib.parse import urljoin
6
+ from osbot_utils.utils.Files import file_create, path_combine, temp_filename, file_create_all_parent_folders
7
+ from osbot_utils.utils.Misc import random_port, random_string
8
+ from osbot_utils.utils.Http import port_is_open, GET
12
9
 
13
10
 
14
11
  class Temp_Web_Server:
@@ -67,6 +64,7 @@ class Temp_Web_Server:
67
64
  self.server_thread.join()
68
65
  else:
69
66
  self.server._BaseServer__shutdown_request = True # simulate what happens inside self.server.shutdown()
67
+ return self
70
68
 
71
69
  def start(self):
72
70
  if self.http_handler is SimpleHTTPRequestHandler:
@@ -76,6 +74,7 @@ class Temp_Web_Server:
76
74
  self.server = ThreadingHTTPServer((self.host, self.port), handler_config)
77
75
  self.server_thread = Thread(target=self.server.serve_forever, name=self.server_name)
78
76
  self.server_thread.start()
77
+ return self
79
78
 
80
79
  def url(self,path=''):
81
80
  base_url = f"http://{self.host}:{self.port}"
@@ -1,20 +1,15 @@
1
1
  import json
2
- import os
3
2
  import re
4
3
  import socket
5
4
  import ssl
6
5
  import unicodedata
7
- from http.cookies import SimpleCookie
8
- from time import sleep
9
- from urllib.parse import quote, urljoin, urlparse
10
- from urllib.request import Request, urlopen
11
-
12
- from osbot_utils.utils.Str import html_decode
13
-
14
- from osbot_utils.utils.Misc import url_decode
15
-
16
- from osbot_utils.utils.Files import save_bytes_as_file, file_size, file_bytes, file_open_bytes, file_create
17
- from osbot_utils.utils.Python_Logger import Python_Logger
6
+ from http.cookies import SimpleCookie
7
+ from time import sleep
8
+ from urllib.parse import quote, urljoin, urlparse
9
+ from urllib.request import Request, urlopen
10
+ from osbot_utils.utils.Str import html_decode
11
+ from osbot_utils.utils.Misc import url_decode
12
+ from osbot_utils.utils.Files import save_bytes_as_file, file_create
18
13
 
19
14
  URL_CHECK_HOST_ONLINE = 'https://www.google.com'
20
15
  URL_JOIN_SAFE__MAX_ITERATIONS = 5
File without changes
@@ -0,0 +1 @@
1
+ v2.73.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.71.0"
3
+ version = "v2.73.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,44 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: osbot_utils
3
- Version: 2.71.0
4
- Summary: OWASP Security Bot - Utils
5
- License: MIT
6
- Author: Dinis Cruz
7
- Author-email: dinis.cruz@owasp.org
8
- Requires-Python: >=3.7,<4.0
9
- Classifier: License :: OSI Approved :: MIT License
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.7
12
- Classifier: Programming Language :: Python :: 3.8
13
- Classifier: Programming Language :: Python :: 3.9
14
- Classifier: Programming Language :: Python :: 3.10
15
- Classifier: Programming Language :: Python :: 3.11
16
- Classifier: Programming Language :: Python :: 3.12
17
- Classifier: Programming Language :: Python :: 3.13
18
- Project-URL: Homepage, https://github.com/owasp-sbot/OSBot-Utils
19
- Project-URL: Repository, https://github.com/owasp-sbot/OSBot-Utils
20
- Description-Content-Type: text/markdown
21
-
22
- # OSBot-Utils
23
-
24
- Powerful Python util methods and classes that simplify common apis and tasks.
25
-
26
- ![Current Release](https://img.shields.io/badge/release-v2.71.0-blue)
27
- [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
28
-
29
-
30
-
31
- ## Install - Release 1.x
32
-
33
- **for main branch**: just get it from pypi
34
-
35
- ```
36
- pip install osbot-utils
37
- ```
38
-
39
- **for dev branch**: add to requirements.txt
40
-
41
- ```
42
- git+https://github.com/owasp-sbot/OSBot-Utils.git@dev
43
- ```
44
-