osbot-utils 2.30.0__tar.gz → 2.32.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 (374) hide show
  1. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/PKG-INFO +2 -2
  2. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/README.md +1 -1
  3. {osbot_utils-2.30.0/osbot_utils/testing → osbot_utils-2.32.0/osbot_utils/helpers/duration}/Duration.py +14 -26
  4. osbot_utils-2.32.0/osbot_utils/helpers/duration/decorators/duration.py +21 -0
  5. {osbot_utils-2.30.0/osbot_utils/context_managers → osbot_utils-2.32.0/osbot_utils/helpers/duration/decorators}/print_duration.py +1 -1
  6. osbot_utils-2.32.0/osbot_utils/helpers/duration/schemas/Schema__Duration.py +8 -0
  7. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/Flow.py +24 -16
  8. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/Task.py +18 -8
  9. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -1
  10. osbot_utils-2.32.0/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +83 -0
  11. osbot_utils-2.32.0/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +34 -0
  12. osbot_utils-2.32.0/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +16 -0
  13. osbot_utils-2.32.0/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +7 -0
  14. osbot_utils-2.32.0/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +13 -0
  15. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SCP.py +6 -6
  16. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SSH__Execute.py +10 -10
  17. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Hook_Method.py +4 -3
  18. osbot_utils-2.32.0/osbot_utils/type_safe/shared/Type_Safe__Shared__Variables.py +8 -0
  19. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/steps/Type_Safe__Step__From_Json.py +1 -1
  20. osbot_utils-2.32.0/osbot_utils/type_safe/steps/__init__.py +0 -0
  21. osbot_utils-2.32.0/osbot_utils/type_safe/validators/__init__.py +0 -0
  22. osbot_utils-2.32.0/osbot_utils/utils/__init__.py +0 -0
  23. osbot_utils-2.32.0/osbot_utils/version +1 -0
  24. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/pyproject.toml +1 -1
  25. osbot_utils-2.30.0/osbot_utils/type_safe/shared/Type_Safe__Shared__Variables.py +0 -4
  26. osbot_utils-2.30.0/osbot_utils/version +0 -1
  27. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/LICENSE +0 -0
  28. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/__init__.py +0 -0
  29. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  30. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  31. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  32. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/base_classes/__init__.py +0 -0
  33. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/context_managers/__init__.py +0 -0
  34. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  35. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  36. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/__init__.py +0 -0
  37. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  38. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  39. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  40. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  41. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  42. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  43. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  44. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/cache.py +0 -0
  45. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  46. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  47. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  48. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  49. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  50. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/catch.py +0 -0
  51. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/context.py +0 -0
  52. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  53. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  54. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  55. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  56. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  57. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  58. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  59. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/fluent/__init__.py +0 -0
  60. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/CFormat.py +0 -0
  61. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/CPrint.py +0 -0
  62. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  63. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  64. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Guid.py +0 -0
  65. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  66. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  67. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  68. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  69. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Print_Table.py +0 -0
  70. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  71. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  72. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  73. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  74. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Safe_Id.py +0 -0
  75. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  76. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  77. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  78. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  79. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/__init__.py +0 -0
  80. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  81. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  82. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  83. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  84. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  85. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  86. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  87. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  88. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  89. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  90. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  91. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  92. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  93. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  94. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  95. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  96. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  97. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  98. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  99. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  100. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  101. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  102. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  103. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  104. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  105. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  106. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  107. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  108. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  109. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  110. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  111. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  112. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  113. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  114. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  115. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  116. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  117. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  118. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  119. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  120. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  121. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  122. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  123. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  124. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  125. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  126. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  127. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  128. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  129. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  130. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  131. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  132. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  133. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  134. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  135. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  136. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  137. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  138. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  139. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  140. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  141. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  142. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  143. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  144. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  145. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  146. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  147. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  148. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  149. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  150. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  151. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  152. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  153. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  154. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  155. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  156. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  157. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  158. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  159. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  160. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  161. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  162. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  163. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  164. {osbot_utils-2.30.0/osbot_utils/helpers/flows → osbot_utils-2.32.0/osbot_utils/helpers/duration}/__init__.py +0 -0
  165. {osbot_utils-2.30.0/osbot_utils/helpers/flows/actions → osbot_utils-2.32.0/osbot_utils/helpers/duration/decorators}/__init__.py +0 -0
  166. {osbot_utils-2.30.0/osbot_utils/context_managers → osbot_utils-2.32.0/osbot_utils/helpers/duration/decorators}/capture_duration.py +0 -0
  167. {osbot_utils-2.30.0/osbot_utils/helpers/flows/decorators → osbot_utils-2.32.0/osbot_utils/helpers/duration/schemas}/__init__.py +0 -0
  168. {osbot_utils-2.30.0/osbot_utils/helpers/flows/models → osbot_utils-2.32.0/osbot_utils/helpers/flows}/__init__.py +0 -0
  169. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
  170. {osbot_utils-2.30.0/osbot_utils/helpers/flows/schemas → osbot_utils-2.32.0/osbot_utils/helpers/flows/actions}/__init__.py +0 -0
  171. {osbot_utils-2.30.0/osbot_utils/helpers/generators → osbot_utils-2.32.0/osbot_utils/helpers/flows/decorators}/__init__.py +0 -0
  172. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  173. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  174. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  175. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  176. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  177. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  178. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
  179. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
  180. {osbot_utils-2.30.0/osbot_utils/helpers/html → osbot_utils-2.32.0/osbot_utils/helpers/flows/models}/__init__.py +0 -0
  181. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
  182. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
  183. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
  184. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
  185. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
  186. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
  187. {osbot_utils-2.30.0/osbot_utils/helpers/pubsub → osbot_utils-2.32.0/osbot_utils/helpers/flows/schemas}/__init__.py +0 -0
  188. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  189. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  190. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  191. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  192. {osbot_utils-2.30.0/osbot_utils/helpers/pubsub/schemas → osbot_utils-2.32.0/osbot_utils/helpers/generators}/__init__.py +0 -0
  193. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  194. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  195. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  196. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  197. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  198. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  199. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  200. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  201. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  202. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  203. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  204. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  205. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  206. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  207. {osbot_utils-2.30.0/osbot_utils/helpers/python_compatibility → osbot_utils-2.32.0/osbot_utils/helpers/html}/__init__.py +0 -0
  208. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  209. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  210. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  211. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  212. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  213. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite → osbot_utils-2.32.0/osbot_utils/helpers/pubsub}/__init__.py +0 -0
  214. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  215. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  216. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  217. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  218. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  219. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  220. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  221. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  222. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite/cache → osbot_utils-2.32.0/osbot_utils/helpers/pubsub/schemas}/__init__.py +0 -0
  223. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite/domains → osbot_utils-2.32.0/osbot_utils/helpers/python_compatibility}/__init__.py +0 -0
  224. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  225. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  226. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  227. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  228. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  229. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  230. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  231. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  232. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  233. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  234. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite/domains/schemas → osbot_utils-2.32.0/osbot_utils/helpers/sqlite}/__init__.py +0 -0
  235. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  236. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  237. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  238. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  239. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  240. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  241. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  242. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite/models → osbot_utils-2.32.0/osbot_utils/helpers/sqlite/cache}/__init__.py +0 -0
  243. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  244. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  245. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  246. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  247. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  248. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite/sample_data → osbot_utils-2.32.0/osbot_utils/helpers/sqlite/domains}/__init__.py +0 -0
  249. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite/sql_builder → osbot_utils-2.32.0/osbot_utils/helpers/sqlite/domains/schemas}/__init__.py +0 -0
  250. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  251. {osbot_utils-2.30.0/osbot_utils/helpers/sqlite/tables → osbot_utils-2.32.0/osbot_utils/helpers/sqlite/models}/__init__.py +0 -0
  252. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  253. {osbot_utils-2.30.0/osbot_utils/helpers/ssh → osbot_utils-2.32.0/osbot_utils/helpers/sqlite/sample_data}/__init__.py +0 -0
  254. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  255. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  256. {osbot_utils-2.30.0/osbot_utils/helpers/trace → osbot_utils-2.32.0/osbot_utils/helpers/sqlite/sql_builder}/__init__.py +0 -0
  257. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  258. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  259. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  260. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  261. {osbot_utils-2.30.0/osbot_utils/helpers/xml → osbot_utils-2.32.0/osbot_utils/helpers/sqlite/tables}/__init__.py +0 -0
  262. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  263. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  264. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  265. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  266. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  267. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  268. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  269. {osbot_utils-2.30.0/osbot_utils/testing → osbot_utils-2.32.0/osbot_utils/helpers/ssh}/__init__.py +0 -0
  270. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  271. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  272. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  273. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  274. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  275. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  276. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  277. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  278. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  279. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  280. {osbot_utils-2.30.0/osbot_utils/testing/performance → osbot_utils-2.32.0/osbot_utils/helpers/trace}/__init__.py +0 -0
  281. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  282. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  283. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  284. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  285. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  286. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  287. {osbot_utils-2.30.0/osbot_utils/testing/performance/models → osbot_utils-2.32.0/osbot_utils/helpers/xml}/__init__.py +0 -0
  288. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  289. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  290. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  291. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  292. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  293. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  294. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Catch.py +0 -0
  295. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  296. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  297. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Log_To_String.py +0 -0
  298. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Logging.py +0 -0
  299. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Patch_Print.py +0 -0
  300. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Profiler.py +0 -0
  301. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Pytest.py +0 -0
  302. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Stderr.py +0 -0
  303. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Stdout.py +0 -0
  304. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  305. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Temp_File.py +0 -0
  306. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  307. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  308. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  309. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  310. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  311. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Unit_Test.py +0 -0
  312. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/Unzip_File.py +0 -0
  313. {osbot_utils-2.30.0/osbot_utils/type_safe → osbot_utils-2.32.0/osbot_utils/testing}/__init__.py +0 -0
  314. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  315. {osbot_utils-2.30.0/osbot_utils/type_safe/decorators → osbot_utils-2.32.0/osbot_utils/testing/performance}/__init__.py +0 -0
  316. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  317. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  318. {osbot_utils-2.30.0/osbot_utils/type_safe/methods → osbot_utils-2.32.0/osbot_utils/testing/performance/models}/__init__.py +0 -0
  319. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/Type_Safe.py +0 -0
  320. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  321. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/Type_Safe__Dict.py +0 -0
  322. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/Type_Safe__List.py +0 -0
  323. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/Type_Safe__Method.py +0 -0
  324. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/Type_Safe__Set.py +0 -0
  325. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/Type_Safe__Tuple.py +0 -0
  326. {osbot_utils-2.30.0/osbot_utils/type_safe/shared → osbot_utils-2.32.0/osbot_utils/type_safe}/__init__.py +0 -0
  327. {osbot_utils-2.30.0/osbot_utils/type_safe/steps → osbot_utils-2.32.0/osbot_utils/type_safe/decorators}/__init__.py +0 -0
  328. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/decorators/type_safe.py +0 -0
  329. {osbot_utils-2.30.0/osbot_utils/type_safe/validators → osbot_utils-2.32.0/osbot_utils/type_safe/methods}/__init__.py +0 -0
  330. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/methods/type_safe_property.py +0 -0
  331. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Annotations.py +0 -0
  332. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Cache.py +0 -0
  333. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Convert.py +0 -0
  334. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Json_Compressor.py +0 -0
  335. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
  336. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Not_Cached.py +0 -0
  337. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Raise_Exception.py +0 -0
  338. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/shared/Type_Safe__Validation.py +0 -0
  339. {osbot_utils-2.30.0/osbot_utils/utils → osbot_utils-2.32.0/osbot_utils/type_safe/shared}/__init__.py +0 -0
  340. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
  341. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  342. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Value.py +0 -0
  343. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Init.py +0 -0
  344. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Set_Attr.py +0 -0
  345. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  346. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  347. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  348. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  349. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  350. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Assert.py +0 -0
  351. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Call_Stack.py +0 -0
  352. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Csv.py +0 -0
  353. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Dev.py +0 -0
  354. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Env.py +0 -0
  355. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Exceptions.py +0 -0
  356. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Files.py +0 -0
  357. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Functions.py +0 -0
  358. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Http.py +0 -0
  359. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Int.py +0 -0
  360. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Json.py +0 -0
  361. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Json_Cache.py +0 -0
  362. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Lists.py +0 -0
  363. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Misc.py +0 -0
  364. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Objects.py +0 -0
  365. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Png.py +0 -0
  366. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Process.py +0 -0
  367. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Python_Logger.py +0 -0
  368. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Regex.py +0 -0
  369. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Status.py +0 -0
  370. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Str.py +0 -0
  371. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Threads.py +0 -0
  372. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Toml.py +0 -0
  373. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Version.py +0 -0
  374. {osbot_utils-2.30.0 → osbot_utils-2.32.0}/osbot_utils/utils/Zip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: osbot_utils
3
- Version: 2.30.0
3
+ Version: 2.32.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  License: MIT
6
6
  Author: Dinis Cruz
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  Powerful Python util methods and classes that simplify common apis and tasks.
25
25
 
26
- ![Current Release](https://img.shields.io/badge/release-v2.30.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v2.32.0-blue)
27
27
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
28
28
 
29
29
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Powerful Python util methods and classes that simplify common apis and tasks.
4
4
 
5
- ![Current Release](https://img.shields.io/badge/release-v2.30.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v2.32.0-blue)
6
6
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
7
7
 
8
8
 
@@ -1,32 +1,11 @@
1
- import inspect
2
- from datetime import timedelta
3
- from functools import wraps
1
+ from datetime import timedelta
4
2
 
5
- from osbot_utils.utils.Call_Stack import Call_Stack
3
+ from osbot_utils.helpers.duration.schemas.Schema__Duration import Schema__Duration
4
+ from osbot_utils.utils.Call_Stack import Call_Stack
5
+ from osbot_utils.utils.Misc import date_time_now, time_delta_to_str
6
6
 
7
- from osbot_utils.utils.Misc import date_time_now, time_delta_to_str
8
7
 
9
-
10
- def duration(func):
11
- if inspect.iscoroutinefunction(func):
12
- # It's an async function
13
- @wraps(func)
14
- async def async_wrapper(*args, **kwargs):
15
- with Duration(prefix=f'.{func.__name__} took'):
16
- return await func(*args, **kwargs)
17
- return async_wrapper
18
- else:
19
- # It's a regular function
20
- @wraps(func)
21
- def sync_wrapper(*args, **kwargs):
22
- with Duration(prefix=f'.{func.__name__} took'):
23
- return func(*args, **kwargs)
24
- return sync_wrapper
25
-
26
- class Duration:
27
- """
28
- Helper class for to capture time duration
29
- """
8
+ class Duration: # Helper class for to capture time duration
30
9
  def __init__(self, prefix="\nDuration:", print_result=True, use_utc=True, print_stack=False):
31
10
  self.use_utc = use_utc
32
11
  self.print_result = print_result
@@ -47,6 +26,15 @@ class Duration:
47
26
  def __exit__(self, exception_type, exception_value, exception_traceback):
48
27
  self.end()
49
28
 
29
+ def data(self) -> Schema__Duration: # Returns the duration data in Schema__Duration format.
30
+ if not self.duration:
31
+ raise ValueError("Duration has not been calculated yet. Call end() first.")
32
+
33
+ return Schema__Duration( utc = self.use_utc ,
34
+ timestamp_start = self.start_time.timestamp(),
35
+ timestamp_end = self.end_time .timestamp(),
36
+ duration_seconds = self.seconds ())
37
+
50
38
  def start(self):
51
39
  self.start_time = date_time_now(use_utc=self.use_utc, return_str=False)
52
40
 
@@ -0,0 +1,21 @@
1
+ import inspect
2
+ from functools import wraps
3
+
4
+ from osbot_utils.helpers.duration.Duration import Duration
5
+
6
+
7
+ def duration(func):
8
+ if inspect.iscoroutinefunction(func):
9
+ # It's an async function
10
+ @wraps(func)
11
+ async def async_wrapper(*args, **kwargs):
12
+ with Duration(prefix=f'.{func.__name__} took'):
13
+ return await func(*args, **kwargs)
14
+ return async_wrapper
15
+ else:
16
+ # It's a regular function
17
+ @wraps(func)
18
+ def sync_wrapper(*args, **kwargs):
19
+ with Duration(prefix=f'.{func.__name__} took'):
20
+ return func(*args, **kwargs)
21
+ return sync_wrapper
@@ -1,4 +1,4 @@
1
- from osbot_utils.context_managers.capture_duration import capture_duration
1
+ from osbot_utils.helpers.duration.decorators.capture_duration import capture_duration
2
2
 
3
3
 
4
4
  class print_duration(capture_duration):
@@ -0,0 +1,8 @@
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
+
3
+
4
+ class Schema__Duration(Type_Safe):
5
+ utc : bool = True
6
+ timestamp_start : float
7
+ timestamp_end : float
8
+ duration_seconds: float
@@ -1,21 +1,21 @@
1
1
  import asyncio
2
2
  import logging
3
3
  import typing
4
-
5
- from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
6
- from osbot_utils.helpers.flows.actions.Flow__Data import Flow__Data
7
- from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
8
- from osbot_utils.type_safe.Type_Safe import Type_Safe
9
- from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
10
- from osbot_utils.helpers.flows.models.Flow_Run__Config import Flow_Run__Config
11
- from osbot_utils.helpers.flows.actions.Flow__Events import flow_events
12
- from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
13
- from osbot_utils.testing.Stdout import Stdout
14
- from osbot_utils.utils.Dev import pprint
15
- from osbot_utils.utils.Misc import random_id, lower, time_now
16
- from osbot_utils.utils.Python_Logger import Python_Logger
17
- from osbot_utils.utils.Str import ansis_to_texts
18
- from osbot_utils.utils.Threads import invoke_in_new_event_loop
4
+ from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
5
+ from osbot_utils.helpers.flows.actions.Flow__Data import Flow__Data
6
+ from osbot_utils.helpers.flows.actions.Flow__Stats__Collector import Flow__Stats__Collector
7
+ from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
8
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
9
+ from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
10
+ from osbot_utils.helpers.flows.models.Flow_Run__Config import Flow_Run__Config
11
+ from osbot_utils.helpers.flows.actions.Flow__Events import flow_events
12
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
13
+ from osbot_utils.testing.Stdout import Stdout
14
+ from osbot_utils.utils.Dev import pprint
15
+ from osbot_utils.utils.Misc import random_id, lower, time_now
16
+ from osbot_utils.utils.Python_Logger import Python_Logger
17
+ from osbot_utils.utils.Str import ansis_to_texts
18
+ from osbot_utils.utils.Threads import invoke_in_new_event_loop
19
19
 
20
20
  FLOW__RANDOM_ID__PREFIX = 'flow_id__'
21
21
  FLOW__RANDOM_NAME__PREFIX = 'flow_name__'
@@ -23,9 +23,10 @@ FLOW__LOGGING__LOG_FORMAT = '%(asctime)s.%(msecs)03d | %(levelname)-8s | %(mess
23
23
  FLOW__LOGGING__DATE_FORMAT = '%H:%M:%S'
24
24
 
25
25
 
26
- # todo: add flow duration
26
+ # todo: replace the flow_id (and task_id) with either Obj_Id or Safe_Id
27
27
  class Flow(Type_Safe):
28
28
  flow_data : Flow__Data
29
+ flow_stats : Flow__Stats__Collector
29
30
  captured_exec_logs : list
30
31
  data : dict # dict available to the tasks to add and collect data
31
32
  flow_id : str # rename to flow_run_id (or also capture the flow_run_id)
@@ -82,6 +83,7 @@ class Flow(Type_Safe):
82
83
 
83
84
  def execute_flow(self, flow_run_params=None): # todo: see if it makes more sense to call this start_flow_run
84
85
  self.check_setup()
86
+ self.flow_stats.start(flow_id=self.flow_id, flow_name=self.flow_name) # start the flow stats collector
85
87
  flow_events.on__flow__start(self.flow_event_data())
86
88
  self.log_debug(f"Created flow run '{self.f__flow_id()}' for flow '{self.f__flow_name()}'")
87
89
  self.set_flow_run_params(flow_run_params)
@@ -101,6 +103,7 @@ class Flow(Type_Safe):
101
103
  self.log_error(self.cformat.red(f"Error executing flow: {error}"))
102
104
  self.flow_data.set_error(error)
103
105
 
106
+ self.flow_stats.end (self.flow_error)
104
107
  self.log_captured_stdout (stdout)
105
108
  self.print_flow_return_value ()
106
109
  self.print_flow_finished_message()
@@ -119,6 +122,11 @@ class Flow(Type_Safe):
119
122
  def captured_logs(self):
120
123
  return ansis_to_texts(self.captured_exec_logs)
121
124
 
125
+ def durations(self):
126
+ return self.flow_stats.durations()
127
+
128
+ def durations__with_tasks_status(self):
129
+ return self.flow_stats.durations__with_tasks_status()
122
130
 
123
131
  async def invoke_flow_target__thread(self, flow): # this is a REALLY important method which is used to pin the flow object to the call stack
124
132
  return await flow.flow_target(*flow.resolved_args, **flow.resolved_kwargs) # which is then used by the Task.find_flow method to find it
@@ -2,14 +2,15 @@ import inspect
2
2
  import traceback
3
3
  import typing
4
4
 
5
- from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
6
- from osbot_utils.utils.Misc import random_id, lower
7
- from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
8
- from osbot_utils.helpers.flows.actions.Flow__Events import flow_events
9
- from osbot_utils.testing.Stdout import Stdout
10
- from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_red, f_blue, f_bold
11
- from osbot_utils.type_safe.Type_Safe import Type_Safe
12
- from osbot_utils.helpers.flows.Flow import Flow
5
+ from osbot_utils.helpers.flows.actions.Task__Stats__Collector import Task__Stats__Collector
6
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
7
+ from osbot_utils.utils.Misc import random_id, lower
8
+ from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
9
+ from osbot_utils.helpers.flows.actions.Flow__Events import flow_events
10
+ from osbot_utils.testing.Stdout import Stdout
11
+ from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_red, f_blue, f_bold
12
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
13
+ from osbot_utils.helpers.flows.Flow import Flow
13
14
 
14
15
  TASK__RANDOM_ID__PREFIX = 'task_id__'
15
16
 
@@ -18,6 +19,7 @@ TASK__RANDOM_ID__PREFIX = 'task_id__'
18
19
  class Task(Type_Safe):
19
20
  data : dict # dict available to the task to add and collect data
20
21
  task_id : str
22
+ task_stats : Task__Stats__Collector
21
23
  task_name : str # make this the function mame
22
24
  cformat : CFormat
23
25
  resolved_args : tuple
@@ -63,6 +65,9 @@ class Task(Type_Safe):
63
65
  if not self.task_id:
64
66
  self.task_id = self.random_task_id()
65
67
 
68
+ execution_order = self.task_flow.flow_stats.get_next_execution_order()
69
+ self.task_stats.start(flow_id=self.task_flow.flow_id, task_id=self.task_id, task_name=self.task_name, execution_order=execution_order)
70
+
66
71
  self.on_task_start()
67
72
  flow_events.on__task__start(self.task_event_data())
68
73
 
@@ -105,6 +110,11 @@ class Task(Type_Safe):
105
110
  self.task_flow.log_captured_stdout(stdout)
106
111
 
107
112
  def execute__after(self):
113
+
114
+ self.task_stats.end(task_error=self.task_error)
115
+ self.task_flow.flow_stats.add_task_stats(self.task_stats.stats)
116
+
117
+
108
118
  self.print_task_return_value()
109
119
 
110
120
  if self.task_error:
@@ -5,7 +5,6 @@ from osbot_utils.helpers.flows.models.Schema__Flow__Artifact import Schema__F
5
5
  from osbot_utils.helpers.flows.models.Schema__Flow__Result import Schema__Flow__Result
6
6
  from osbot_utils.helpers.flows.schemas.Schema__Flow import Schema__Flow
7
7
  from osbot_utils.helpers.flows.schemas.Schema__Flow__Data import Schema__Flow__Data
8
- #from osbot_utils.helpers.flows.schemas.Schema__Flow__Event import Schema__Flow__Event
9
8
  from osbot_utils.helpers.flows.schemas.Schema__Flow__Log import Schema__Flow__Log
10
9
  from osbot_utils.helpers.flows.schemas.Schema__Flow__Task__Data import Schema__Flow__Task__Data
11
10
  from osbot_utils.type_safe.Type_Safe import Type_Safe
@@ -0,0 +1,83 @@
1
+ from typing import Dict
2
+ from osbot_utils.helpers.duration.Duration import Duration
3
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Status import Schema__Flow__Status
4
+ from osbot_utils.helpers.flows.schemas.Schema__Task__Stats import Schema__Task__Stats
5
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Stats import Schema__Flow__Stats
6
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
7
+
8
+ FLOW__ERROR_MESSAGE__TASK_FAILED = 'At least one task failed'
9
+
10
+ class Flow__Stats__Collector(Type_Safe):
11
+ duration : Duration
12
+ stats : Schema__Flow__Stats
13
+ task_execution_counter : int
14
+
15
+ def start(self, flow_id: str, flow_name:str):
16
+ self.duration.print_result = False
17
+ self.duration.start()
18
+ self.task_execution_counter = 0
19
+ with self.stats as _:
20
+ _.flow_id = flow_id
21
+ _.flow_name = flow_name
22
+ _.status = Schema__Flow__Status.RUNNING
23
+ return self
24
+
25
+ def end(self, flow_error:Exception):
26
+ self.duration.end()
27
+ with self.stats as _:
28
+ _.duration = self.duration.data()
29
+ _.total_tasks = len(self.stats.tasks_stats)
30
+ _.failed_tasks = sum(1 for task in self.stats.tasks_stats.values() if task.status == Schema__Flow__Status.FAILED)
31
+
32
+ if flow_error:
33
+ _.status = Schema__Flow__Status.FAILED
34
+ _.error_message = str(flow_error)
35
+ elif _.failed_tasks:
36
+ _.status = Schema__Flow__Status.FAILED
37
+ _.error_message = FLOW__ERROR_MESSAGE__TASK_FAILED
38
+ else:
39
+ _.status = Schema__Flow__Status.COMPLETED
40
+ return self
41
+
42
+ def get_next_execution_order(self): # Get the next execution order number and increment the counter."""
43
+ self.task_execution_counter += 1
44
+ return self.task_execution_counter
45
+
46
+ def add_task_stats(self, task_stats: Schema__Task__Stats): # Add task stats to the collection.
47
+ self.stats.tasks_stats[task_stats.task_id] = task_stats
48
+ return self
49
+
50
+ def json(self): # Return JSON representation of the stats.
51
+ return self.stats.json()
52
+
53
+ def durations__with_tasks_status(self):
54
+ with self.stats as _:
55
+ tasks_durations = dict()
56
+ flow_durations = dict(flow_name = _.flow_name ,
57
+ flow_duration = _.duration.duration_seconds,
58
+ flow_status = _.status.value ,
59
+ flow_tasks = tasks_durations )
60
+
61
+ for task_id, flow_task in self.stats.tasks_stats.items():
62
+ task_duration = dict(task_name = flow_task.task_name ,
63
+ task_duration = flow_task.duration.duration_seconds,
64
+ task_status = flow_task.status.value )
65
+ execution_order = flow_task.execution_order
66
+ tasks_durations[execution_order] = task_duration
67
+ return flow_durations
68
+
69
+ def durations(self):
70
+ with self.stats as _:
71
+ if _.status is None:
72
+ flow_durations = dict()
73
+ else:
74
+ tasks_durations = dict()
75
+ flow_durations = dict(flow_name = _.flow_name ,
76
+ flow_duration = _.duration.duration_seconds,
77
+ flow_status = _.status.value ,
78
+ flow_tasks = tasks_durations )
79
+
80
+ for task_id, flow_task in self.stats.tasks_stats.items():
81
+
82
+ tasks_durations[flow_task.task_name] = flow_task.duration.duration_seconds
83
+ return flow_durations
@@ -0,0 +1,34 @@
1
+ from osbot_utils.helpers.duration.Duration import Duration
2
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Status import Schema__Flow__Status
3
+ from osbot_utils.helpers.flows.schemas.Schema__Task__Stats import Schema__Task__Stats
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
+
6
+ class Task__Stats__Collector(Type_Safe):
7
+ duration : Duration
8
+ stats : Schema__Task__Stats
9
+
10
+ def start(self, flow_id: str, task_id: str, task_name: str , execution_order:int):
11
+ self.duration.print_result = False
12
+ self.duration.start()
13
+ with self.stats as _:
14
+ _.parent_flow_id = flow_id
15
+ _.execution_order = execution_order
16
+ _.status = Schema__Flow__Status.RUNNING
17
+ _.task_id = task_id
18
+ _.task_name = task_name
19
+ return self
20
+
21
+ def end(self, task_error: Exception):
22
+ self.duration.end()
23
+ with self.stats as _:
24
+ _.duration = self.duration.data()
25
+ if task_error:
26
+ _.status = Schema__Flow__Status.FAILED
27
+ _.error_message = str(task_error)
28
+ else:
29
+ _.status = Schema__Flow__Status.COMPLETED
30
+ return self
31
+
32
+
33
+ def json(self): # Return JSON representation of the stats.
34
+ return self.stats.json()
@@ -0,0 +1,16 @@
1
+ from typing import Dict
2
+ from osbot_utils.helpers.duration.schemas.Schema__Duration import Schema__Duration
3
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Status import Schema__Flow__Status
4
+ from osbot_utils.helpers.flows.schemas.Schema__Task__Stats import Schema__Task__Stats
5
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
6
+
7
+
8
+ class Schema__Flow__Stats(Type_Safe):
9
+ duration : Schema__Duration # How long the flow took to execute
10
+ error_message: str = None # Error message if flow failed
11
+ failed_tasks : int # Number of failed tasks
12
+ flow_id : str # Unique identifier for the flow
13
+ flow_name : str # Name of the flow
14
+ status : Schema__Flow__Status # 'completed', 'failed', 'running'
15
+ tasks_stats : Dict[str, Schema__Task__Stats] # Map of task_id to task stats
16
+ total_tasks : int # Total number of tasks executed
@@ -0,0 +1,7 @@
1
+ from enum import Enum
2
+
3
+ class Schema__Flow__Status(Enum):
4
+ COMPLETED: str = 'completed'
5
+ FAILED : str = 'failed'
6
+ STOPPED : str = 'stopped'
7
+ RUNNING : str = 'running'
@@ -0,0 +1,13 @@
1
+ from osbot_utils.helpers.duration.schemas.Schema__Duration import Schema__Duration
2
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Status import Schema__Flow__Status
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
+
5
+
6
+ class Schema__Task__Stats(Type_Safe):
7
+ task_id : str # Unique identifier for the task
8
+ task_name : str # Name of the task
9
+ execution_order: int # Order in which the task was executed
10
+ duration : Schema__Duration # How long the task took to execute
11
+ status : Schema__Flow__Status # 'completed', 'failed', 'running'
12
+ parent_flow_id : str # ID of the flow that contains this task
13
+ error_message : str = None # Error message if task failed
@@ -1,9 +1,9 @@
1
- from osbot_utils.context_managers.capture_duration import capture_duration
2
- from osbot_utils.helpers.ssh.SSH__Execute import SSH__Execute
3
- from osbot_utils.testing.Temp_Zip import Temp_Zip
4
- from osbot_utils.utils.Files import file_not_exists, file_name
5
- from osbot_utils.utils.Process import start_process
6
- from osbot_utils.utils.Status import status_error
1
+ from osbot_utils.helpers.duration.decorators.capture_duration import capture_duration
2
+ from osbot_utils.helpers.ssh.SSH__Execute import SSH__Execute
3
+ from osbot_utils.testing.Temp_Zip import Temp_Zip
4
+ from osbot_utils.utils.Files import file_not_exists, file_name
5
+ from osbot_utils.utils.Process import start_process
6
+ from osbot_utils.utils.Status import status_error
7
7
 
8
8
 
9
9
 
@@ -1,13 +1,13 @@
1
- from osbot_utils.type_safe.Type_Safe import Type_Safe
2
- from osbot_utils.context_managers.capture_duration import capture_duration
3
- from osbot_utils.decorators.lists.group_by import group_by
4
- from osbot_utils.decorators.lists.index_by import index_by
5
- from osbot_utils.utils.Dev import pprint
6
- from osbot_utils.utils.Env import get_env
7
- from osbot_utils.utils.Http import is_port_open
8
- from osbot_utils.utils.Misc import str_to_int, str_to_bool
9
- from osbot_utils.utils.Process import start_process, run_process
10
- from osbot_utils.utils.Status import status_error
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
+ from osbot_utils.helpers.duration.decorators.capture_duration import capture_duration
3
+ from osbot_utils.decorators.lists.group_by import group_by
4
+ from osbot_utils.decorators.lists.index_by import index_by
5
+ from osbot_utils.utils.Dev import pprint
6
+ from osbot_utils.utils.Env import get_env
7
+ from osbot_utils.utils.Http import is_port_open
8
+ from osbot_utils.utils.Misc import str_to_int, str_to_bool
9
+ from osbot_utils.utils.Process import start_process, run_process
10
+ from osbot_utils.utils.Status import status_error
11
11
 
12
12
  ENV_VAR__SSH__HOST = 'SSH__HOST'
13
13
  ENV_VAR__SSH__PORT = 'SSH__PORT'
@@ -1,7 +1,8 @@
1
- from osbot_utils.helpers.Print_Table import Print_Table
2
- from osbot_utils.utils.Call_Stack import Call_Stack
1
+ from osbot_utils.helpers.Print_Table import Print_Table
2
+ from osbot_utils.helpers.duration.Duration import Duration
3
+ from osbot_utils.utils.Call_Stack import Call_Stack
4
+
3
5
 
4
- from osbot_utils.testing.Duration import Duration
5
6
 
6
7
  class Hook_Method:
7
8
 
@@ -0,0 +1,8 @@
1
+ import types
2
+ from enum import EnumMeta
3
+
4
+ from osbot_utils.helpers.Safe_Id import Safe_Id
5
+
6
+ IMMUTABLE_TYPES = (bool, int, float, complex, str, bytes, types.NoneType, EnumMeta, type,
7
+ Safe_Id # ok to add since these classes use str as a base class
8
+ )
@@ -176,7 +176,7 @@ class Type_Safe__Step__From_Json:
176
176
  if type(json_data) is str:
177
177
  json_data = json_parse(json_data)
178
178
  if json_data: # if there is no data or is {} then don't create an object (since this could be caused by bad data being provided)
179
- return self.deserialize_from_dict(_cls(), json_data,raise_on_not_found=raise_on_not_found)
179
+ return self.deserialize_from_dict(_cls(), json_data, raise_on_not_found=raise_on_not_found)
180
180
  return _cls()
181
181
 
182
182
  type_safe_step_from_json = Type_Safe__Step__From_Json()
File without changes
@@ -0,0 +1 @@
1
+ v2.32.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.30.0"
3
+ version = "v2.32.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,4 +0,0 @@
1
- import types
2
- from enum import EnumMeta
3
-
4
- IMMUTABLE_TYPES = (bool, int, float, complex, str, bytes, types.NoneType, EnumMeta, type)
@@ -1 +0,0 @@
1
- v2.30.0
File without changes