osbot-utils 1.60.0__tar.gz → 1.62.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 (314) hide show
  1. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/PKG-INFO +3 -2
  2. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/README.md +1 -1
  3. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/base_classes/Type_Safe.py +7 -2
  4. osbot_utils-1.62.0/osbot_utils/helpers/Timestamp_Now.py +13 -0
  5. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/flows/Flow.py +43 -34
  6. osbot_utils-1.62.0/osbot_utils/helpers/flows/Flow__Events.py +52 -0
  7. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/flows/Task.py +10 -2
  8. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/flows/decorators/flow.py +1 -3
  9. osbot_utils-1.60.0/osbot_utils/helpers/flows/models/Flow__Config.py → osbot_utils-1.62.0/osbot_utils/helpers/flows/models/Flow_Run__Config.py +1 -1
  10. osbot_utils-1.62.0/osbot_utils/helpers/flows/models/Flow_Run__Event.py +15 -0
  11. osbot_utils-1.62.0/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +14 -0
  12. osbot_utils-1.60.0/osbot_utils/helpers/flows/models/Flow__Event_Type.py → osbot_utils-1.62.0/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +3 -1
  13. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call.py +2 -2
  14. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Json.py +2 -2
  15. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Misc.py +1 -0
  16. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Objects.py +6 -0
  17. osbot_utils-1.62.0/osbot_utils/version +1 -0
  18. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/pyproject.toml +1 -1
  19. osbot_utils-1.60.0/osbot_utils/helpers/flows/Flow__Events.py +0 -53
  20. osbot_utils-1.60.0/osbot_utils/helpers/flows/models/Flow__Event.py +0 -6
  21. osbot_utils-1.60.0/osbot_utils/version +0 -1
  22. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/LICENSE +0 -0
  23. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/__init__.py +0 -0
  24. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  25. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  26. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  27. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
  28. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/base_classes/__init__.py +0 -0
  29. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/context_managers/__init__.py +0 -0
  30. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  31. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  32. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  33. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/context_managers/print_duration.py +0 -0
  34. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/__init__.py +0 -0
  35. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  36. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  37. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  38. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  39. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  40. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  41. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  42. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/cache.py +0 -0
  43. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  44. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  45. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  46. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  47. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  48. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/catch.py +0 -0
  49. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/context.py +0 -0
  50. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  51. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  52. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  53. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  54. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  55. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  56. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  57. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/fluent/__init__.py +0 -0
  58. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/__init__.py +0 -0
  59. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  60. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  61. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  62. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  63. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  64. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  65. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  66. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  67. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  68. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  69. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  70. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  71. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  72. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  73. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  74. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  75. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  76. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  77. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  78. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  79. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  80. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/CFormat.py +0 -0
  81. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/CPrint.py +0 -0
  82. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  83. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  84. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  85. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  86. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  87. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Print_Table.py +0 -0
  88. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  89. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  90. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  91. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  92. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  93. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/__init__.py +0 -0
  94. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  95. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  96. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  97. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  98. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  99. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  100. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  101. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  102. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  103. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  104. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  105. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  106. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  107. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  108. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  109. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  110. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  111. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  112. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  113. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  114. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  115. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  116. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  117. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  118. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  119. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  120. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  121. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  122. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  123. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  124. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  125. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  126. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  127. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  128. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  129. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  130. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  131. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  132. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  133. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  134. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  135. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  136. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  137. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  138. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  139. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  140. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  141. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  142. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  143. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  144. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  145. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  146. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  147. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  148. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  149. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  150. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  151. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  152. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  153. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  154. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  155. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  156. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  157. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  158. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  159. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  160. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  161. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  162. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  163. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  164. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  165. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  166. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  167. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  168. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  169. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  170. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  171. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  172. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  173. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  174. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  175. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  176. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  177. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  178. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  179. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  180. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  181. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  182. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  183. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  184. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  185. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  186. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  187. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  188. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  189. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  190. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  191. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  192. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  193. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  194. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  195. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  196. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/html/__init__.py +0 -0
  197. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  198. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  199. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  200. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  201. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  202. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  203. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  204. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  205. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  206. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  207. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  208. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  209. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  210. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  211. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  212. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  213. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  214. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  215. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  216. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  217. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  218. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  219. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  220. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  221. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  222. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  223. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  224. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  225. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  226. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  227. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  228. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  229. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  230. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  231. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  232. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  233. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  234. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  235. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  236. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  237. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  238. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  239. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  240. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  241. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  242. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  243. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  244. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  245. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  246. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  247. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  248. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  249. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  250. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  251. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  252. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  253. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  254. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  255. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  256. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  257. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  258. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  259. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  260. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  261. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  262. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  263. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  264. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  265. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  266. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  267. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  268. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  269. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  270. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Catch.py +0 -0
  271. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  272. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Duration.py +0 -0
  273. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Hook_Method.py +0 -0
  274. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  275. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Log_To_String.py +0 -0
  276. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Logging.py +0 -0
  277. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Patch_Print.py +0 -0
  278. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Profiler.py +0 -0
  279. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Pytest.py +0 -0
  280. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Stderr.py +0 -0
  281. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Stdout.py +0 -0
  282. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  283. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Temp_File.py +0 -0
  284. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  285. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  286. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  287. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  288. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  289. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Unit_Test.py +0 -0
  290. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/Unzip_File.py +0 -0
  291. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/testing/__init__.py +0 -0
  292. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Assert.py +0 -0
  293. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Call_Stack.py +0 -0
  294. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Csv.py +0 -0
  295. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Dev.py +0 -0
  296. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Env.py +0 -0
  297. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Exceptions.py +0 -0
  298. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Files.py +0 -0
  299. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Functions.py +0 -0
  300. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Http.py +0 -0
  301. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Int.py +0 -0
  302. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Json_Cache.py +0 -0
  303. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Lists.py +0 -0
  304. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Png.py +0 -0
  305. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Process.py +0 -0
  306. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Python_Logger.py +0 -0
  307. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Regex.py +0 -0
  308. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Status.py +0 -0
  309. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Str.py +0 -0
  310. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Threads.py +0 -0
  311. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Toml.py +0 -0
  312. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Version.py +0 -0
  313. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/Zip.py +0 -0
  314. {osbot_utils-1.60.0 → osbot_utils-1.62.0}/osbot_utils/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.60.0
3
+ Version: 1.62.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.9
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
18
19
  Project-URL: Repository, https://github.com/owasp-sbot/OSBot-Utils
19
20
  Description-Content-Type: text/markdown
20
21
 
@@ -22,7 +23,7 @@ Description-Content-Type: text/markdown
22
23
 
23
24
  Powerful Python util methods and classes that simplify common apis and tasks.
24
25
 
25
- ![Current Release](https://img.shields.io/badge/release-v1.60.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v1.62.0-blue)
26
27
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
27
28
 
28
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-v1.60.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.62.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
 
@@ -11,10 +11,11 @@ from enum import Enum, EnumMeta
11
11
  from typing import List
12
12
  from osbot_utils.base_classes.Type_Safe__List import Type_Safe__List
13
13
  from osbot_utils.helpers.Random_Guid import Random_Guid
14
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
14
15
  from osbot_utils.utils.Dev import pprint
15
16
  from osbot_utils.utils.Json import json_parse
16
17
  from osbot_utils.utils.Misc import list_set
17
- from osbot_utils.utils.Objects import default_value, value_type_matches_obj_annotation_for_attr, \
18
+ from osbot_utils.utils.Objects import default_value, value_type_matches_obj_annotation_for_attr, \
18
19
  raise_exception_on_obj_type_annotation_mismatch, obj_is_attribute_annotation_of_type, enum_from_value, \
19
20
  obj_is_type_union_compatible, value_type_matches_obj_annotation_for_union_attr, \
20
21
  convert_dict_to_value_from_obj_annotation, dict_to_obj
@@ -264,10 +265,14 @@ class Type_Safe:
264
265
  enum_type = getattr(self, '__annotations__').get(key)
265
266
  if type(value) is not enum_type: # If the value is not already of the target type
266
267
  value = enum_from_value(enum_type, value) # Try to resolve the value into the enum
267
- elif obj_is_attribute_annotation_of_type(self, key, Decimal): # handle Decimals # todo: refactor these special cases into a separate method to class
268
+
269
+ # todo: refactor these special cases into a separate method to class
270
+ elif obj_is_attribute_annotation_of_type(self, key, Decimal): # handle Decimals
268
271
  value = Decimal(value)
269
272
  elif obj_is_attribute_annotation_of_type(self, key, Random_Guid): # handle Random_Guid objects
270
273
  value = Random_Guid(value)
274
+ elif obj_is_attribute_annotation_of_type(self, key, Timestamp_Now):
275
+ value = Timestamp_Now(value)
271
276
  setattr(self, key, value) # Direct assignment for primitive types and other structures
272
277
 
273
278
  return self
@@ -0,0 +1,13 @@
1
+ from osbot_utils.utils.Misc import timestamp_now
2
+
3
+ class Timestamp_Now(int):
4
+ def __new__(cls, value=None):
5
+ if value is None:
6
+ value = timestamp_now()
7
+ return int.__new__(cls, value)
8
+
9
+ def __init__(self, value=None):
10
+ self.value = value if value is not None else timestamp_now()
11
+
12
+ def __str__(self):
13
+ return str(self.value)
@@ -2,17 +2,17 @@ import asyncio
2
2
  import logging
3
3
  import typing
4
4
 
5
- from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
6
-
7
- from osbot_utils.base_classes.Type_Safe import Type_Safe
8
- from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
9
- from osbot_utils.helpers.flows.models.Flow__Config import Flow__Config
10
- from osbot_utils.helpers.flows.Flow__Events import flow_events
11
- from osbot_utils.testing.Stdout import Stdout
12
- from osbot_utils.utils.Misc import random_id, lower
13
- from osbot_utils.utils.Python_Logger import Python_Logger
14
- from osbot_utils.utils.Str import ansis_to_texts
15
- from osbot_utils.utils.Threads import invoke_in_new_event_loop
5
+ from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
6
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
7
+ from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
8
+ from osbot_utils.helpers.flows.models.Flow_Run__Config import Flow_Run__Config
9
+ from osbot_utils.helpers.flows.Flow__Events import flow_events
10
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
11
+ from osbot_utils.testing.Stdout import Stdout
12
+ from osbot_utils.utils.Misc import random_id, lower, time_now
13
+ from osbot_utils.utils.Python_Logger import Python_Logger
14
+ from osbot_utils.utils.Str import ansis_to_texts
15
+ from osbot_utils.utils.Threads import invoke_in_new_event_loop
16
16
 
17
17
  FLOW__RANDOM_ID__PREFIX = 'flow_id__'
18
18
  FLOW__RANDOM_NAME__PREFIX = 'flow_name__'
@@ -24,9 +24,9 @@ FLOW__LOGGING__DATE_FORMAT = '%H:%M:%S'
24
24
  class Flow(Type_Safe):
25
25
  captured_exec_logs : list
26
26
  data : dict # dict available to the tasks to add and collect data
27
- flow_id : str
27
+ flow_id : str # rename to flow_run_id (or also capture the flow_run_id)
28
28
  flow_name : str
29
- flow_config : Flow__Config
29
+ flow_config : Flow_Run__Config
30
30
  flow_error : Exception = None
31
31
  flow_target : callable
32
32
  flow_args : tuple
@@ -39,20 +39,22 @@ class Flow(Type_Safe):
39
39
  resolved_args : tuple
40
40
  resolved_kwargs : dict
41
41
 
42
- def add_flow_artifact(self, description=None, key=None, data=None, artifact_type=None): # todo: figure out how to make this work since at the moment most are showing an unknown type
43
- result_data = dict(flow_run_id = self.flow_id,
44
- description = description or 'description' ,
45
- key = key or 'an-artifact-key' ,
46
- data = data or {"link": "https://www.google.com", "link_text": "link to Google"}, # test data to see if it worksw
47
- type = artifact_type or "link" ) # type clashed with built-in type
42
+ def add_flow_artifact(self, description=None, key=None, data=None, artifact_type=None): # todo: figure out how to make this work since at the moment most are showing an unknown type
43
+ event_data = Flow_Run__Event_Data()
44
+ event_data.data= dict(artifact_data = dict(description = description or 'description',
45
+ key = key or 'an-artifact-key',
46
+ data = data or {"link": "https://www.google.com", "link_text": "link to Google"}, # test data to see if it worksw
47
+ type = artifact_type or "link")) # type clashed with built-in type
48
+ event_data.flow_run_id = self.flow_id
49
+ flow_events.on__new_artifact(event_data)
48
50
 
49
- flow_events.on__new_artifact(self, result_data )
50
51
 
51
52
  def add_flow_result(self, key, description):
52
- result_data = dict(flow_run_id = self.flow_id,
53
- key = key ,
54
- description = description )
55
- flow_events.on__new_result(self, result_data )
53
+ event_data = Flow_Run__Event_Data()
54
+ event_data.flow_run_id = self.flow_id
55
+ event_data.data = dict(result_data = dict(key = key ,
56
+ description = description ))
57
+ flow_events.on__new_result(event_data)
56
58
 
57
59
  def config_logger(self):
58
60
  with self.logger as _:
@@ -61,15 +63,12 @@ class Flow(Type_Safe):
61
63
  if self.flow_config.log_to_console:
62
64
  _.add_console_logger()
63
65
 
64
- def create_flow(self):
65
- self.set_flow_name()
66
- self.log_debug(f"Created flow run '{self.f__flow_id()}' for flow '{self.f__flow_name()}'")
67
-
68
66
  def execute(self):
69
67
  return self.execute_flow()
70
68
 
71
69
  def execute_flow(self, flow_run_params=None): # todo: see if it makes more sense to call this start_flow_run
72
- flow_events.on__flow__start(self)
70
+ flow_events.on__flow__start(self.flow_event_data())
71
+ self.log_debug(f"Created flow run '{self.f__flow_id()}' for flow '{self.f__flow_name()}'")
73
72
  self.set_flow_run_params(flow_run_params)
74
73
 
75
74
  if self.flow_config.log_to_memory:
@@ -93,7 +92,7 @@ class Flow(Type_Safe):
93
92
  self.logger.remove_memory_logger() # todo: move to method that does post-execute tasks
94
93
  if self.flow_return_value:
95
94
  self.add_flow_result(key = 'flow-return-value', description=f'{self.flow_return_value}')
96
- flow_events.on__flow__stop(self)
95
+ flow_events.on__flow__stop(self.flow_event_data())
97
96
  return self
98
97
 
99
98
  def captured_logs(self):
@@ -116,6 +115,11 @@ class Flow(Type_Safe):
116
115
  def f__flow_name(self):
117
116
  return self.cformat.blue(self.flow_name)
118
117
 
118
+ def flow_event_data(self):
119
+ kwargs = dict(flow_name = self.flow_name ,
120
+ #flow_id = self.flow_id , # todo: add support for actually sending the flow_id value (not the flow_run_id)
121
+ flow_run_id = self.flow_id )
122
+ return Flow_Run__Event_Data(**kwargs)
119
123
 
120
124
  def log_captured_stdout(self, stdout):
121
125
  for line in stdout.value().splitlines():
@@ -142,7 +146,7 @@ class Flow(Type_Safe):
142
146
  message = message ,
143
147
  flow_run_id = self.flow_id,
144
148
  task_run_id = task_run_id )
145
- flow_events.on__flow_run__message(self, **kwargs)
149
+ flow_events.on__flow_run__message(**kwargs)
146
150
  if log_level == logging.DEBUG:
147
151
  self.logger.debug(message)
148
152
  elif log_level == logging.ERROR:
@@ -194,6 +198,9 @@ class Flow(Type_Safe):
194
198
  *self.flow_args,
195
199
  **self.flow_kwargs)
196
200
 
201
+ def set_flow_id__time_now(self):
202
+ self.flow_id = time_now(milliseconds_numbers=1)
203
+
197
204
  def set_flow_target(self, target, *args, **kwargs):
198
205
  self.flow_target = target
199
206
  self.flow_args = args
@@ -216,11 +223,13 @@ class Flow(Type_Safe):
216
223
  self.log_info(f"flow_run_params: {flow_run_params}")
217
224
  self.add_flow_artifact(description="Data received via FastAPI's request.json()", key='post-data', data=flow_run_params)
218
225
 
219
- def setup(self):
226
+ def setup(self, target, *args, **kwargs):
220
227
  with self as _:
221
228
  _.cformat.auto_bold = True
222
- _.config_logger()
223
- _.setup_flow_run()
229
+ _.set_flow_target (target, *args, **kwargs)
230
+ _.config_logger ()
231
+ _.setup_flow_run ()
232
+ _.set_flow_name ()
224
233
  return self
225
234
 
226
235
  def setup_flow_run(self):
@@ -0,0 +1,52 @@
1
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
2
+ from osbot_utils.utils.Str import ansi_to_text
3
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
4
+ from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
5
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Type import Flow_Run__Event_Type
6
+
7
+
8
+ class Flow_Events(Type_Safe):
9
+ event_listeners : list
10
+
11
+ def on__flow__start(self, event_data: Flow_Run__Event_Data):
12
+ flow_event = Flow_Run__Event(event_type=Flow_Run__Event_Type.FLOW_START, event_data=event_data)
13
+ self.raise_event(flow_event)
14
+
15
+ def on__flow__stop(self, event_data: Flow_Run__Event_Data): # todo: see of flow_ended or flow_completed are better names
16
+ flow_event = Flow_Run__Event(event_type=Flow_Run__Event_Type.FLOW_STOP , event_data=event_data)
17
+ self.raise_event(flow_event)
18
+
19
+ def on__flow_run__message(self, log_level, flow_run_id, task_run_id, message):
20
+ event_data = Flow_Run__Event_Data()
21
+ event_data.flow_run_id = flow_run_id
22
+ event_data.task_run_id = task_run_id
23
+ event_data.data = dict(message_data = dict(log_level = log_level ,
24
+ message = message ,
25
+ message_text = ansi_to_text(message) ))
26
+ flow_event = Flow_Run__Event(event_type=Flow_Run__Event_Type.FLOW_MESSAGE, event_data=event_data)
27
+ self.raise_event(flow_event)
28
+
29
+ def on__new_artifact(self, event_data: Flow_Run__Event_Data):
30
+ flow_event = Flow_Run__Event(event_type=Flow_Run__Event_Type.NEW_ARTIFACT, event_data=event_data)
31
+ self.raise_event(flow_event)
32
+
33
+ def on__new_result(self, event_data: Flow_Run__Event_Data):
34
+ flow_event = Flow_Run__Event(event_type=Flow_Run__Event_Type.NEW_RESULT, event_data=event_data)
35
+ self.raise_event(flow_event)
36
+
37
+ def on__task__start(self, event_data: Flow_Run__Event_Data):
38
+ flow_event = Flow_Run__Event(event_type=Flow_Run__Event_Type.TASK_START, event_data=event_data)
39
+ self.raise_event(flow_event)
40
+
41
+ def on__task__stop(self, event_data: Flow_Run__Event_Data): # todo: see of flow_ended or flow_completed are better names
42
+ flow_event = Flow_Run__Event(event_type=Flow_Run__Event_Type.TASK_STOP , event_data=event_data)
43
+ self.raise_event(flow_event)
44
+
45
+ def raise_event(self, flow_event):
46
+ for listener in self.event_listeners:
47
+ try:
48
+ listener(flow_event)
49
+ except Exception as error:
50
+ print(f"Error in listener: {error}")
51
+
52
+ flow_events = Flow_Events()
@@ -2,6 +2,7 @@ import asyncio
2
2
  import inspect
3
3
  import typing
4
4
 
5
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
5
6
  from osbot_utils.utils.Misc import random_id, lower
6
7
  from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
7
8
  from osbot_utils.helpers.flows.Flow__Events import flow_events
@@ -57,12 +58,19 @@ class Task(Type_Safe):
57
58
  if not self.task_id:
58
59
  self.task_id = self.random_task_id()
59
60
 
60
- flow_events.on__task__start(self)
61
+ flow_events.on__task__start(self.task_event_data())
61
62
 
62
63
  self.task_flow.executed_tasks.append(self)
63
64
  self.log_debug(f"Executing task '{f_blue(self.task_name)}'")
64
65
  self.resolve_args_and_kwargs()
65
66
 
67
+ def task_event_data(self):
68
+ kwargs = dict(flow_name = self.task_flow.flow_name,
69
+ flow_run_id = self.task_flow.flow_id ,
70
+ task_name = self.task_name ,
71
+ task_run_id = self.task_id )
72
+ return Flow_Run__Event_Data(**kwargs)
73
+
66
74
  def resolve_args_and_kwargs(self):
67
75
  dependency_manager = Dependency_Manager()
68
76
  dependency_manager.add_dependency('this_task', self )
@@ -97,7 +105,7 @@ class Task(Type_Safe):
97
105
 
98
106
  self.print_task_finished_message()
99
107
 
100
- flow_events.on__task__stop(self)
108
+ flow_events.on__task__stop(self.task_event_data())
101
109
  return self.task_return_value
102
110
 
103
111
 
@@ -10,9 +10,7 @@ def flow(**flow_kwargs):
10
10
  @wraps(function)
11
11
  def wrapper(*args: Any, **kwargs: Any) -> Flow:
12
12
  with Flow(**flow_kwargs) as _:
13
- _.set_flow_target(function, *args, **kwargs)
14
- _.setup()
15
- _.create_flow()
13
+ _.setup(function, *args, **kwargs)
16
14
  return _
17
15
  return wrapper
18
16
  return decorator
@@ -1,7 +1,7 @@
1
1
  from osbot_utils.base_classes.Type_Safe import Type_Safe
2
2
 
3
3
 
4
- class Flow__Config(Type_Safe):
4
+ class Flow_Run__Config(Type_Safe):
5
5
  add_task_to_self : bool = True
6
6
  log_to_console : bool = False
7
7
  log_to_memory : bool = True
@@ -0,0 +1,15 @@
1
+ from osbot_utils.helpers.Random_Guid import Random_Guid
2
+
3
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
4
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
5
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
6
+ from osbot_utils.helpers.flows.models.Flow_Run__Event_Type import Flow_Run__Event_Type
7
+
8
+
9
+
10
+ class Flow_Run__Event(Type_Safe):
11
+ event_id : Random_Guid
12
+ event_type : Flow_Run__Event_Type
13
+ event_data : Flow_Run__Event_Data
14
+ timestamp : Timestamp_Now
15
+
@@ -0,0 +1,14 @@
1
+ import logging
2
+
3
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
4
+
5
+
6
+ class Flow_Run__Event_Data(Type_Safe):
7
+ data : dict
8
+ event_source: str
9
+ #flow_id : str = None # todo: add support for capturing the actual flow_idq
10
+ flow_name : str = None
11
+ flow_run_id : str = None
12
+ log_level : int = logging.INFO
13
+ task_name : str = None
14
+ task_run_id : str = None
@@ -1,6 +1,8 @@
1
+ from enum import Enum
2
+
1
3
  from osbot_utils.base_classes.Type_Safe import Type_Safe
2
4
 
3
- class Flow__Event_Type(Type_Safe):
5
+ class Flow_Run__Event_Type(Enum):
4
6
  FLOW_MESSAGE: str = 'flow_message'
5
7
  FLOW_START : str = 'flow_start'
6
8
  FLOW_STOP : str = 'flow_stop'
@@ -9,8 +9,8 @@ from osbot_utils.helpers.trace.Trace_Call__Handler import Trace_Call__H
9
9
  from osbot_utils.helpers.trace.Trace_Call__Print_Lines import Trace_Call__Print_Lines
10
10
  from osbot_utils.helpers.trace.Trace_Call__Print_Traces import Trace_Call__Print_Traces
11
11
  from osbot_utils.helpers.trace.Trace_Call__View_Model import Trace_Call__View_Model
12
- from osbot_utils.testing.Stdout import Stdout
13
- from osbot_utils.utils.Str import ansi_to_text
12
+ from osbot_utils.testing.Stdout import Stdout
13
+ from osbot_utils.utils.Str import ansi_to_text
14
14
 
15
15
 
16
16
  def trace_calls(title = None , print_traces = True , show_locals = False, source_code = False ,
@@ -1,9 +1,9 @@
1
1
  import json
2
2
  import os
3
3
 
4
- from osbot_utils.utils.Misc import str_lines, str_md5, str_sha256
4
+ from osbot_utils.utils.Misc import str_lines, str_md5, str_sha256
5
5
  from osbot_utils.utils.Files import file_create_gz, file_create, load_file_gz, file_contents, file_lines, file_lines_gz
6
- from osbot_utils.utils.Zip import str_to_gz, gz_to_str
6
+ from osbot_utils.utils.Zip import str_to_gz, gz_to_str
7
7
 
8
8
 
9
9
  def json_dumps(python_object, indent=4, pretty=True, sort_keys=False, default=str, raise_exception=False):
@@ -513,5 +513,6 @@ random_guid = random_uuid
513
513
  random_value = random_string
514
514
 
515
515
  time_utc = time_now
516
+ timestamp_now = timestamp_utc_now
516
517
  wait_for = wait
517
518
 
@@ -1,5 +1,6 @@
1
1
  # todo add tests
2
2
  import inspect
3
+ import json
3
4
  import pickle
4
5
  import sys
5
6
  import types
@@ -151,6 +152,9 @@ def obj_to_dict(target):
151
152
  return {obj_to_dict(item) for item in target}
152
153
  return target # Return non-object types as is
153
154
 
155
+ def str_to_obj(target):
156
+ return dict_to_obj(json.loads(target))
157
+
154
158
  def enum_from_value(enum_type, value):
155
159
  try:
156
160
  return enum_type[value] # Attempt to convert the value to an Enum member by name
@@ -390,6 +394,8 @@ def value_type_matches_obj_annotation_for_attr(target, attr_name, value):
390
394
  base_types = base_classes
391
395
  bytes_to_obj = pickle_load_from_bytes
392
396
 
397
+ json_to_obj = str_to_obj
398
+
393
399
  full_type_name = class_full_name
394
400
 
395
401
  obj_list_set = obj_keys
@@ -0,0 +1 @@
1
+ v1.62.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.60.0"
3
+ version = "v1.62.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,53 +0,0 @@
1
- from osbot_utils.utils.Str import ansis_to_texts, ansi_to_text
2
-
3
- from osbot_utils.utils.Dev import pprint
4
-
5
- from osbot_utils.base_classes.Type_Safe import Type_Safe
6
- from osbot_utils.helpers.flows.models.Flow__Event import Flow__Event
7
- from osbot_utils.helpers.flows.models.Flow__Event_Type import Flow__Event_Type
8
-
9
-
10
- class Flow_Events(Type_Safe):
11
- event_listeners : list
12
-
13
- def on__flow__start(self, flow):
14
- flow_event = Flow__Event(event_type=Flow__Event_Type.FLOW_START, event_source=flow)
15
- self.raise_event(flow_event)
16
-
17
- def on__flow__stop(self, flow): # todo: see of flow_ended or flow_completed are better names
18
- flow_event = Flow__Event(event_type=Flow__Event_Type.FLOW_STOP , event_source=flow)
19
- self.raise_event(flow_event)
20
-
21
- def on__flow_run__message(self, flow, log_level, flow_run_id, task_run_id, message):
22
- event_data = dict(flow_run_id = flow_run_id ,
23
- log_level = log_level ,
24
- message = message ,
25
- message_text = ansi_to_text(message) ,
26
- task_run_id = task_run_id )
27
- flow_event = Flow__Event(event_type=Flow__Event_Type.FLOW_MESSAGE, event_source=flow, event_data=event_data)
28
- self.raise_event(flow_event)
29
-
30
- def on__new_artifact(self, flow, result_data):
31
- flow_event = Flow__Event(event_type=Flow__Event_Type.NEW_ARTIFACT , event_source=flow, event_data=result_data)
32
- self.raise_event(flow_event)
33
-
34
- def on__new_result(self, flow, result_data):
35
- flow_event = Flow__Event(event_type=Flow__Event_Type.NEW_RESULT , event_source=flow, event_data=result_data)
36
- self.raise_event(flow_event)
37
-
38
- def on__task__start(self, task):
39
- flow_event = Flow__Event(event_type=Flow__Event_Type.TASK_START, event_source=task)
40
- self.raise_event(flow_event)
41
-
42
- def on__task__stop(self, task): # todo: see of flow_ended or flow_completed are better names
43
- flow_event = Flow__Event(event_type=Flow__Event_Type.TASK_STOP , event_source=task)
44
- self.raise_event(flow_event)
45
-
46
- def raise_event(self, flow_event):
47
- for listener in self.event_listeners:
48
- try:
49
- listener(flow_event)
50
- except Exception as error:
51
- print(f"Error in listener: {error}")
52
-
53
- flow_events = Flow_Events()
@@ -1,6 +0,0 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
-
3
- class Flow__Event(Type_Safe):
4
- event_type : str
5
- event_source: object
6
- event_data : dict
@@ -1 +0,0 @@
1
- v1.60.0
File without changes