osbot-utils 1.43.0__tar.gz → 1.45.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 (308) hide show
  1. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/README.md +1 -1
  3. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Type_Safe.py +4 -4
  4. osbot_utils-1.45.0/osbot_utils/context_managers/async_invoke.py +27 -0
  5. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/context_managers/capture_duration.py +1 -8
  6. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -4
  7. osbot_utils-1.45.0/osbot_utils/context_managers/print_duration.py +9 -0
  8. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/filter_list.py +3 -3
  9. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/capture_exception.py +2 -2
  10. osbot_utils-1.45.0/osbot_utils/helpers/Dependency_Manager.py +26 -0
  11. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/flows/Flow.py +51 -33
  12. osbot_utils-1.45.0/osbot_utils/helpers/flows/Flow__Config.py +11 -0
  13. osbot_utils-1.45.0/osbot_utils/helpers/flows/Task.py +83 -0
  14. osbot_utils-1.45.0/osbot_utils/helpers/flows/decorators/flow.py +18 -0
  15. osbot_utils-1.45.0/osbot_utils/helpers/flows/decorators/task.py +11 -0
  16. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Dict_To_Tags.py +5 -6
  17. osbot_utils-1.45.0/osbot_utils/helpers/pubsub/Event__Queue.py +127 -0
  18. osbot_utils-1.45.0/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +4 -0
  19. osbot_utils-1.45.0/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +14 -0
  20. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +3 -4
  21. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Call_Stack.py +3 -0
  22. osbot_utils-1.45.0/osbot_utils/utils/Threads.py +27 -0
  23. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Zip.py +5 -0
  24. osbot_utils-1.45.0/osbot_utils/utils/__init__.py +0 -0
  25. osbot_utils-1.45.0/osbot_utils/version +1 -0
  26. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/pyproject.toml +1 -1
  27. osbot_utils-1.43.0/osbot_utils/helpers/flows/Task.py +0 -18
  28. osbot_utils-1.43.0/osbot_utils/helpers/pubsub/Event__Queue.py +0 -95
  29. osbot_utils-1.43.0/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -7
  30. osbot_utils-1.43.0/osbot_utils/version +0 -1
  31. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/LICENSE +0 -0
  32. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/__init__.py +0 -0
  33. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  34. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  35. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  36. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
  37. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/__init__.py +0 -0
  38. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/context_managers/__init__.py +0 -0
  39. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/__init__.py +0 -0
  40. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  41. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  42. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  43. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  44. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  45. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  46. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache.py +0 -0
  47. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  48. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  49. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  50. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  51. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/catch.py +0 -0
  52. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/context.py +0 -0
  53. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  54. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  55. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  56. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  57. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  58. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  59. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  60. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/fluent/__init__.py +0 -0
  61. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/__init__.py +0 -0
  62. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  63. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  64. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  65. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  66. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  67. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  68. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  69. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  70. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  71. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  72. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  73. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  74. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  75. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  76. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  77. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  78. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  79. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  80. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  81. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  82. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  83. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/CFormat.py +0 -0
  84. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/CPrint.py +0 -0
  85. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  86. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  87. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  88. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  89. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Print_Table.py +0 -0
  90. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  91. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  92. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  93. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  94. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  95. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/__init__.py +0 -0
  96. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  97. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  98. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  99. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  100. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  101. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  102. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  103. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  104. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  105. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  106. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  107. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  108. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  109. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  110. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  111. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  112. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  113. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  114. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  115. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  116. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  117. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  118. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  119. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  120. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  121. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  122. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  123. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  124. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  125. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  126. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  127. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  128. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  129. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  130. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  131. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  132. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  133. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  134. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  135. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  136. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  137. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  138. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  139. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  140. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  141. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  142. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  143. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  144. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  145. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  146. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  147. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  148. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  149. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  150. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  151. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  152. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  153. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  154. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  155. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  156. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  157. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  158. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  159. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  160. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  161. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  162. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  163. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  164. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  165. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  166. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  167. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  168. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  169. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  170. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  171. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  172. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  173. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  174. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  175. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  176. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  177. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  178. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  179. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  180. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  181. {osbot_utils-1.43.0/osbot_utils/helpers/html → osbot_utils-1.45.0/osbot_utils/helpers/flows/decorators}/__init__.py +0 -0
  182. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  183. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  184. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  185. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  186. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  187. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  188. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  189. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  190. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  191. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  192. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  193. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  194. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  195. {osbot_utils-1.43.0/osbot_utils/helpers/pubsub → osbot_utils-1.45.0/osbot_utils/helpers/html}/__init__.py +0 -0
  196. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  197. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  198. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  199. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  200. {osbot_utils-1.43.0/osbot_utils/helpers/pubsub/schemas → osbot_utils-1.45.0/osbot_utils/helpers/pubsub}/__init__.py +0 -0
  201. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  202. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  203. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  204. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  205. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  206. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  207. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite → osbot_utils-1.45.0/osbot_utils/helpers/pubsub/schemas}/__init__.py +0 -0
  208. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  209. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  210. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  211. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  212. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  213. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  214. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  215. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  216. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  217. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/cache → osbot_utils-1.45.0/osbot_utils/helpers/sqlite}/__init__.py +0 -0
  218. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  219. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  220. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  221. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  222. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  223. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  224. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  225. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/domains → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/cache}/__init__.py +0 -0
  226. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  227. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  228. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  229. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  230. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  231. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/domains/schemas → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/domains}/__init__.py +0 -0
  232. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/models → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/domains/schemas}/__init__.py +0 -0
  233. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  234. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/sample_data → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/models}/__init__.py +0 -0
  235. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  236. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/sql_builder → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/sample_data}/__init__.py +0 -0
  237. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  238. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  239. {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/tables → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/sql_builder}/__init__.py +0 -0
  240. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  241. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  242. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  243. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  244. {osbot_utils-1.43.0/osbot_utils/helpers/ssh → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/tables}/__init__.py +0 -0
  245. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  246. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  247. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  248. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  249. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  250. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  251. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  252. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  253. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  254. {osbot_utils-1.43.0/osbot_utils/helpers/trace → osbot_utils-1.45.0/osbot_utils/helpers/ssh}/__init__.py +0 -0
  255. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  256. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  257. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  258. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  259. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  260. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  261. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  262. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  263. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  264. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  265. {osbot_utils-1.43.0/osbot_utils/testing → osbot_utils-1.45.0/osbot_utils/helpers/trace}/__init__.py +0 -0
  266. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Catch.py +0 -0
  267. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Duration.py +0 -0
  268. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Hook_Method.py +0 -0
  269. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  270. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Log_To_String.py +0 -0
  271. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Logging.py +0 -0
  272. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Patch_Print.py +0 -0
  273. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Profiler.py +0 -0
  274. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Pytest.py +0 -0
  275. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Stderr.py +0 -0
  276. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Stdout.py +0 -0
  277. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  278. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_File.py +0 -0
  279. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  280. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  281. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  282. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  283. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  284. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Unit_Test.py +0 -0
  285. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Unzip_File.py +0 -0
  286. {osbot_utils-1.43.0/osbot_utils/utils → osbot_utils-1.45.0/osbot_utils/testing}/__init__.py +0 -0
  287. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Assert.py +0 -0
  288. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Csv.py +0 -0
  289. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Dev.py +0 -0
  290. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Env.py +0 -0
  291. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Exceptions.py +0 -0
  292. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Files.py +0 -0
  293. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Functions.py +0 -0
  294. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Http.py +0 -0
  295. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Int.py +0 -0
  296. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Json.py +0 -0
  297. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Json_Cache.py +0 -0
  298. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Lists.py +0 -0
  299. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Misc.py +0 -0
  300. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Objects.py +0 -0
  301. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Png.py +0 -0
  302. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Process.py +0 -0
  303. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Python_Logger.py +0 -0
  304. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Regex.py +0 -0
  305. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Status.py +0 -0
  306. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Str.py +0 -0
  307. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Toml.py +0 -0
  308. {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.43.0
3
+ Version: 1.45.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -22,7 +22,7 @@ Description-Content-Type: text/markdown
22
22
 
23
23
  Powerful Python util methods and classes that simplify common apis and tasks.
24
24
 
25
- ![Current Release](https://img.shields.io/badge/release-v1.43.0-blue)
25
+ ![Current Release](https://img.shields.io/badge/release-v1.45.0-blue)
26
26
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
27
27
 
28
28
 
@@ -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.43.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.45.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
 
@@ -10,17 +10,17 @@ from decimal import Decimal
10
10
  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
- from osbot_utils.helpers.Random_Guid import Random_Guid
13
+ from osbot_utils.helpers.Random_Guid import Random_Guid
14
14
  from osbot_utils.utils.Dev import pprint
15
15
  from osbot_utils.utils.Json import json_parse
16
16
  from osbot_utils.utils.Misc import list_set
17
- from osbot_utils.utils.Objects import default_value, value_type_matches_obj_annotation_for_attr, \
17
+ from osbot_utils.utils.Objects import default_value, value_type_matches_obj_annotation_for_attr, \
18
18
  raise_exception_on_obj_type_annotation_mismatch, obj_is_attribute_annotation_of_type, enum_from_value, \
19
19
  obj_is_type_union_compatible, value_type_matches_obj_annotation_for_union_attr, \
20
20
  convert_dict_to_value_from_obj_annotation
21
21
 
22
22
  # Backport implementations of get_origin and get_args for Python 3.7
23
- if sys.version_info < (3, 8):
23
+ if sys.version_info < (3, 8): # pragma: no cover
24
24
  def get_origin(tp):
25
25
  if isinstance(tp, typing._GenericAlias):
26
26
  return tp.__origin__
@@ -39,7 +39,7 @@ else:
39
39
 
40
40
  if sys.version_info >= (3, 10):
41
41
  NoneType = types.NoneType
42
- else:
42
+ else: # pragma: no cover
43
43
  NoneType = type(None)
44
44
 
45
45
  immutable_types = (bool, int, float, complex, str, tuple, frozenset, bytes, NoneType, EnumMeta)
@@ -0,0 +1,27 @@
1
+ import logging
2
+ from contextlib import contextmanager
3
+ import asyncio
4
+
5
+ @contextmanager
6
+ def async_invoke():
7
+ logger = logging.getLogger('asyncio')
8
+ level_original = logger.level
9
+ logger.level = logging.INFO # this will suppress the asyncio debug messages which where showing in tests
10
+ try:
11
+ original_loop = asyncio.get_event_loop()
12
+ except RuntimeError:
13
+ original_loop = None
14
+
15
+ loop = asyncio.new_event_loop()
16
+ asyncio.set_event_loop(loop)
17
+
18
+ try:
19
+ yield loop.run_until_complete
20
+ finally:
21
+ loop.close()
22
+ if original_loop is not None:
23
+ asyncio.set_event_loop(original_loop)
24
+ else:
25
+ asyncio.set_event_loop(None)
26
+
27
+ logger.level = level_original # restore the original log level
@@ -27,11 +27,4 @@ class capture_duration(Type_Safe):
27
27
  if self.action_name:
28
28
  print(f'action "{self.action_name}" took: {self.seconds} seconds')
29
29
  else:
30
- print(f'action took: {self.seconds} seconds')
31
-
32
- class print_duration(capture_duration):
33
-
34
- def __exit__(self, exc_type, exc_val, exc_tb):
35
- result = super().__exit__(exc_type, exc_val, exc_tb)
36
- self.print()
37
- return result
30
+ print(f'action took: {self.seconds} seconds')
@@ -1,9 +1,5 @@
1
1
  import logging
2
2
 
3
- from osbot_utils.utils.Dev import pprint
4
- from osbot_utils.utils.Misc import timestamp_utc_now
5
-
6
-
7
3
  class disable_root_loggers():
8
4
  def __init__(self):
9
5
  self.original_root_loggers = []
@@ -0,0 +1,9 @@
1
+ from osbot_utils.context_managers.capture_duration import capture_duration
2
+
3
+
4
+ class print_duration(capture_duration):
5
+
6
+ def __exit__(self, exc_type, exc_val, exc_tb):
7
+ result = super().__exit__(exc_type, exc_val, exc_tb)
8
+ self.print()
9
+ return result
@@ -3,9 +3,9 @@ from functools import wraps
3
3
  def filter_list(function):
4
4
  @wraps(function)
5
5
  def wrapper(*args, **kwargs):
6
- only_show = kwargs.pop('only_show', None) # Directly extract and remove 'only_show' from kwargs if present
7
- values = function(*args, **kwargs) # Call the decorated function
8
- if only_show: # Filter the list of dictionaries to only include specified keys
6
+ only_show = kwargs.pop('only_show', None) # Directly extract and remove 'only_show' from kwargs if present
7
+ values = function(*args, **kwargs) # Call the decorated function
8
+ if only_show: # Filter the list of dictionaries to only include specified keys
9
9
  return [{key: item[key] for key in only_show if key in item} for item in values]
10
10
  return values
11
11
 
@@ -1,6 +1,6 @@
1
1
  import traceback
2
- from functools import wraps
3
- from osbot_utils.utils.Dev import pprint
2
+ from functools import wraps
3
+ from osbot_utils.utils.Dev import pprint
4
4
 
5
5
  def capture_exception(func):
6
6
  @wraps(func)
@@ -0,0 +1,26 @@
1
+ import inspect
2
+
3
+
4
+ class Dependency_Manager:
5
+ def __init__(self):
6
+ self._dependencies = {}
7
+
8
+ def add_dependency(self, name: str, instance): # Register a dependency by name.
9
+ self._dependencies[name] = instance
10
+
11
+ def get_dependency(self, name: str): # Retrieve a dependency by name.
12
+ return self._dependencies.get(name, None)
13
+
14
+ def resolve_dependencies(self, func, *args, **kwargs): # Automatically inject dependencies based on function's parameters.
15
+ sig = inspect.signature(func) # Get the function's signature and parameters
16
+ bound_arguments = sig.bind_partial(*args, **kwargs)
17
+
18
+
19
+ for param_name, param in sig.parameters.items(): # Check parameters to see if we need to inject a dependency
20
+ if param_name not in bound_arguments.arguments:
21
+ if param_name in self._dependencies: # Inject dependency if available
22
+ bound_arguments.arguments[param_name] = self._dependencies[param_name]
23
+
24
+ return bound_arguments.args, bound_arguments.kwargs
25
+
26
+ dependency_manager = Dependency_Manager()
@@ -1,9 +1,9 @@
1
1
  import logging
2
2
  import typing
3
- from functools import wraps
4
3
 
5
4
  from osbot_utils.base_classes.Type_Safe import Type_Safe
6
- from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta
5
+ from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
6
+ from osbot_utils.helpers.flows.Flow__Config import Flow__Config
7
7
  from osbot_utils.testing.Stdout import Stdout
8
8
  from osbot_utils.utils.Misc import random_id, lower
9
9
  from osbot_utils.utils.Python_Logger import Python_Logger
@@ -14,40 +14,32 @@ FLOW__RANDOM_NAME__PREFIX = 'flow_name__'
14
14
  FLOW__LOGGING__LOG_FORMAT = '%(asctime)s.%(msecs)03d | %(levelname)-8s | %(message)s'
15
15
  FLOW__LOGGING__DATE_FORMAT = '%H:%M:%S'
16
16
 
17
- def flow(**flow_kwargs):
18
-
19
- def decorator(function):
20
- @wraps(function)
21
- def wrapper(*args, **kwargs):
22
- with Flow(**flow_kwargs) as flow:
23
- flow.set_flow_target(function)
24
- flow.setup()
25
- flow.create_flow()
26
- flow.execute_flow(*args, **kwargs)
27
- return flow.return_value
28
-
29
- return wrapper
30
- return decorator
31
17
 
32
18
 
33
19
  class Flow(Type_Safe):
34
20
  captured_exec_logs : list
21
+ data : dict # dict available to the tasks to add and collect data
35
22
  flow_id : str
36
23
  flow_name : str
24
+ flow_config : Flow__Config
37
25
  flow_target : callable
26
+ flow_args : tuple
27
+ flow_kwargs : dict
28
+ flow_return_value : typing.Any
38
29
  logger : Python_Logger
39
30
  cformat : CFormat
40
- log_to_console : bool = False
41
- log_to_memory : bool = True
42
- print_logs : bool = False
43
- return_value : typing.Any
31
+ #log_to_console : bool = False
32
+ #log_to_memory : bool = True
33
+ #print_logs : bool = False
34
+ executed_tasks : typing.List
35
+
44
36
 
45
37
 
46
38
  def config_logger(self):
47
39
  with self.logger as _:
48
40
  _.set_log_level(logging.DEBUG)
49
41
  _.set_log_format(log_format=FLOW__LOGGING__LOG_FORMAT, date_format=FLOW__LOGGING__DATE_FORMAT)
50
- if self.log_to_console:
42
+ if self.flow_config.log_to_console:
51
43
  _.add_console_logger()
52
44
 
53
45
 
@@ -58,23 +50,28 @@ class Flow(Type_Safe):
58
50
  self.set_flow_name()
59
51
  self.debug(f"Created flow run '{self.f__flow_id()}' for flow '{self.f__flow_name()}'")
60
52
 
61
- def execute_flow(self, *args, **kwargs):
62
- if self.log_to_memory:
53
+ def execute(self):
54
+ return self.execute_flow()
55
+
56
+ def execute_flow(self):
57
+ if self.flow_config.log_to_memory:
63
58
  self.logger.add_memory_logger() # todo: move to method that does pre-execute tasks
64
59
 
65
60
  self.debug(f"Executing flow run '{self.f__flow_id()}''")
66
61
  try:
67
62
  with Stdout() as stdout:
68
- self.return_value = self.flow_target(*args, **kwargs) # todo, capture *args, **kwargs in logs
63
+ self.flow_return_value = self.flow_target(*self.flow_args, **self.flow_kwargs) # todo, capture *args, **kwargs in logs
69
64
  except Exception as error:
70
65
  self.logger.error(self.cformat.red(f"Error executing flow: {error}"))
71
- self.log_captured_stdout(stdout)
72
- self.debug(f"{f_dark_grey('return value')}: {self.return_value}")
73
- self.debug(f"Finished flow run '{self.f__flow_id()}''")
74
66
 
75
- if self.log_to_memory:
67
+ self.log_captured_stdout (stdout)
68
+ self.print_flow_return_value ()
69
+ self.print_flow_finished_message()
70
+
71
+ if self.flow_config.log_to_memory:
76
72
  self.captured_exec_logs = self.log_messages_with_colors()
77
- self.logger.remove_memory_logger() # todo: move to method that does post-execute tasks
73
+ self.logger.remove_memory_logger() # todo: move to method that does post-execute tasks
74
+ return self
78
75
 
79
76
  def f__flow_id(self):
80
77
  return self.cformat.green(self.flow_id)
@@ -82,6 +79,9 @@ class Flow(Type_Safe):
82
79
  def f__flow_name(self):
83
80
  return self.cformat.blue(self.flow_name)
84
81
 
82
+ def captured_logs(self):
83
+ return ansis_to_texts(self.captured_exec_logs)
84
+
85
85
  def info(self, message):
86
86
  self.logger.info(message)
87
87
 
@@ -89,7 +89,7 @@ class Flow(Type_Safe):
89
89
  for line in stdout.value().splitlines():
90
90
  if line:
91
91
  self.info(f_magenta(line))
92
- if self.print_logs:
92
+ if self.flow_config.print_logs:
93
93
  print()
94
94
  print()
95
95
  self.print_log_messages()
@@ -103,12 +103,28 @@ class Flow(Type_Safe):
103
103
 
104
104
  def print_log_messages(self, use_colors=True):
105
105
  if use_colors:
106
- for message in self.logger.memory_handler_messages():
107
- print(message)
106
+ if self.captured_exec_logs:
107
+ for message in self.captured_exec_logs:
108
+ print(message)
109
+ else:
110
+ for message in self.logger.memory_handler_messages():
111
+ print(message)
108
112
  else:
109
113
  for message in self.log_messages():
110
114
  print(message)
111
115
  return self
116
+
117
+ def print_flow_finished_message(self):
118
+ if self.flow_config.print_finished_message:
119
+ self.debug(f"Finished flow run '{self.f__flow_id()}''")
120
+
121
+ def print_flow_return_value(self):
122
+ if self.flow_config.print_none_return_value is False and self.flow_return_value is None:
123
+ return
124
+ self.debug(f"{f_dark_grey('Flow return value')}: {f_bold(self.flow_return_value)}")
125
+
126
+
127
+
112
128
  def random_flow_id(self):
113
129
  return lower(random_id(prefix=FLOW__RANDOM_ID__PREFIX))
114
130
 
@@ -116,8 +132,10 @@ class Flow(Type_Safe):
116
132
  return lower(random_id(prefix=FLOW__RANDOM_NAME__PREFIX))
117
133
 
118
134
 
119
- def set_flow_target(self, target):
135
+ def set_flow_target(self, target, *args, **kwargs):
120
136
  self.flow_target = target
137
+ self.flow_args = args
138
+ self.flow_kwargs = kwargs
121
139
  return self
122
140
 
123
141
  def set_flow_name(self, value=None):
@@ -0,0 +1,11 @@
1
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+
3
+
4
+ class Flow__Config(Type_Safe):
5
+ add_task_to_self : bool = True
6
+ log_to_console : bool = False
7
+ log_to_memory : bool = True
8
+ print_logs : bool = False
9
+ print_none_return_value: bool = False
10
+ print_finished_message : bool = False
11
+
@@ -0,0 +1,83 @@
1
+ import inspect
2
+ import typing
3
+
4
+ from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
5
+ from osbot_utils.utils.Dev import pprint
6
+
7
+ from osbot_utils.testing.Stdout import Stdout
8
+ from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_red, f_blue, f_bold
9
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
10
+ from osbot_utils.helpers.flows.Flow import Flow
11
+
12
+
13
+
14
+ class Task(Type_Safe):
15
+ data : dict # dict available to the task to add and collect data
16
+ task_id : str # todo add a random Id value to this
17
+ task_name : str # make this the function mame
18
+ cformat : CFormat
19
+ task_target : callable # todo refactor this to to Task__Function class
20
+ task_args : tuple
21
+ task_kwargs : dict
22
+ task_flow : Flow
23
+ task_return_value : typing.Any
24
+ task_error : Exception = None
25
+ raise_on_error : bool = True
26
+
27
+ def execute(self):
28
+ self.task_flow = self.find_flow()
29
+ if self.task_flow is None:
30
+ raise Exception("No Flow found for Task")
31
+
32
+ if not self.task_name and self.task_target:
33
+ self.task_name = self.task_target.__name__
34
+
35
+ self.task_flow.executed_tasks.append(self)
36
+ self.task_flow.logger.debug(f"Executing task '{f_blue(self.task_name)}'")
37
+
38
+ try:
39
+ with Stdout() as stdout:
40
+ self.invoke_task_target()
41
+ except Exception as error:
42
+ self.task_error = error
43
+
44
+ self.task_flow.log_captured_stdout(stdout)
45
+ self.print_task_return_value()
46
+
47
+ if self.task_error:
48
+ self.task_flow.logger.error(f_red(f"Error executing '{self.task_name}' task: {self.task_error}"))
49
+ if self.raise_on_error:
50
+ raise Exception(f"'{self.task_name}' failed and task raise_on_error was set to True. Stopping flow execution")
51
+
52
+ self.print_task_finished_message()
53
+ return self.task_return_value
54
+
55
+ def invoke_task_target(self):
56
+ dependency_manager = Dependency_Manager()
57
+ dependency_manager.add_dependency('this_task', self )
58
+ dependency_manager.add_dependency('this_flow', self.task_flow )
59
+ dependency_manager.add_dependency('task_data', self.data )
60
+ dependency_manager.add_dependency('flow_data', self.task_flow.data)
61
+ resolved_args, resolved_kwargs = dependency_manager.resolve_dependencies(self.task_target, *self.task_args, **self.task_kwargs)
62
+ self.task_return_value = self.task_target(*resolved_args, **resolved_kwargs)
63
+
64
+ def find_flow(self):
65
+ stack = inspect.stack()
66
+ for frame_info in stack:
67
+ frame = frame_info.frame
68
+ if 'self' in frame.f_locals:
69
+ instance = frame.f_locals['self']
70
+ if type(instance) is Flow:
71
+ return instance
72
+
73
+ def print_task_finished_message(self):
74
+ if self.task_flow.flow_config.print_finished_message:
75
+ self.task_flow.logger.debug(f"Finished task '{f_blue(self.task_name)}'")
76
+
77
+ def print_task_return_value(self):
78
+ flow_config = self.task_flow.flow_config
79
+ if flow_config.print_none_return_value is False and self.task_return_value is None:
80
+ return
81
+ self.task_flow.logger.debug(f"{f_dark_grey('Task return value')}: {f_bold(self.task_return_value)}")
82
+
83
+
@@ -0,0 +1,18 @@
1
+ from functools import wraps
2
+ from typing import TypeVar, Callable, Any
3
+
4
+ from osbot_utils.helpers.flows.Flow import Flow
5
+
6
+ # todo: find way to make the casting below work for the users of this decorator
7
+
8
+ def flow(**flow_kwargs):
9
+ def decorator(function) -> Flow:
10
+ @wraps(function)
11
+ def wrapper(*args: Any, **kwargs: Any) -> Flow:
12
+ with Flow(**flow_kwargs) as _:
13
+ _.set_flow_target(function, *args, **kwargs)
14
+ _.setup()
15
+ _.create_flow()
16
+ return _
17
+ return wrapper
18
+ return decorator
@@ -0,0 +1,11 @@
1
+ from functools import wraps
2
+ from osbot_utils.helpers.flows.Task import Task
3
+
4
+ def task(**task_kwargs):
5
+ def decorator(function):
6
+ @wraps(function)
7
+ def wrapper(*args, **kwargs):
8
+ with Task(task_target=function, task_args=args, task_kwargs=kwargs, **task_kwargs) as _:
9
+ return _.execute()
10
+ return wrapper
11
+ return decorator
@@ -1,10 +1,9 @@
1
1
  from osbot_utils.helpers.html.Dict_To_Html import HTML_SELF_CLOSING_TAGS
2
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
3
- from osbot_utils.helpers.html.Tag__Body import Tag__Body
4
- from osbot_utils.helpers.html.Tag__Head import Tag__Head
5
- from osbot_utils.helpers.html.Tag__Html import Tag__Html
6
- from osbot_utils.helpers.html.Tag__Link import Tag__Link
7
- from osbot_utils.utils.Dev import pprint
2
+ from osbot_utils.helpers.html.Tag__Base import Tag__Base
3
+ from osbot_utils.helpers.html.Tag__Body import Tag__Body
4
+ from osbot_utils.helpers.html.Tag__Head import Tag__Head
5
+ from osbot_utils.helpers.html.Tag__Html import Tag__Html
6
+ from osbot_utils.helpers.html.Tag__Link import Tag__Link
8
7
 
9
8
 
10
9
  class Dict_To_Tags:
@@ -0,0 +1,127 @@
1
+ import time
2
+ from queue import Queue, Empty
3
+ from threading import Thread
4
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
5
+ from osbot_utils.helpers.pubsub.schemas.Schema__Event import Schema__Event
6
+ from osbot_utils.helpers.pubsub.schemas.Schema__Event__Message import Schema__Event__Message
7
+ from osbot_utils.utils.Misc import random_text, timestamp_utc_now, random_guid
8
+
9
+ TIMEOUT__THREAD_JOIN = 1.0 # todo: see if this value is a good one to use here
10
+ TIMEOUT__QUEUE_GET = 1.0
11
+ TIMEOUT__WAIT_FOR_QUEUE_COMPLETED = 0.05 # todo: see if this value is too aggressive (or if will be better to use a value like 0.1 or 0.5)
12
+
13
+
14
+ class Event__Queue(Type_Safe):
15
+ events : list
16
+ event_class : type
17
+ events_added : int
18
+ events_completed : int
19
+ events_failed : int
20
+ log_events : bool = False
21
+ queue : Queue
22
+ queue_name : str = random_text('event_queue')
23
+ queue_get_timeout : float = TIMEOUT__QUEUE_GET
24
+ running : bool
25
+ thread : Thread = None
26
+
27
+
28
+ def __init__(self, **kwargs):
29
+ self.event_class = Schema__Event
30
+ super().__init__(**kwargs)
31
+
32
+ def __enter__(self):
33
+ self.start()
34
+ return self
35
+
36
+ def __exit__(self, exc_type, exc_val, exc_tb):
37
+ self.stop()
38
+ return False
39
+
40
+ def new_event_obj(self, **kwargs):
41
+ return self.event_class(**kwargs)
42
+
43
+ def handle_event(self, event):
44
+ if self.log_events:
45
+ self.events.append(event)
46
+ return True
47
+
48
+ def send_event(self, event: Schema__Event):
49
+ if isinstance(event, Schema__Event):
50
+ if not event.timestamp:
51
+ event.timestamp = timestamp_utc_now()
52
+ if not event.event_id:
53
+ event.event_id = random_guid()
54
+ self.events_added += 1
55
+ self.queue.put(event)
56
+ return True
57
+ return False
58
+
59
+ def send_data(self, event_data, **kwargs):
60
+ if type(event_data) is not dict:
61
+ event_data = {'data': event_data}
62
+ new_event = Schema__Event__Message(event_data=event_data, **kwargs)
63
+ if self.send_event(new_event):
64
+ return new_event
65
+
66
+ def send_message(self, message, **kwargs):
67
+ new_event = Schema__Event__Message(event_message=str(message), **kwargs)
68
+ if self.send_event(new_event):
69
+ return new_event
70
+
71
+ def start(self):
72
+ self.running = True
73
+ self.thread = Thread(target=self.run_thread, daemon=True)
74
+ self.thread.start()
75
+ return self
76
+
77
+ def stop(self):
78
+ self.running = False # will make the event loop stop at the next self.queue_get_timeout
79
+ return self
80
+
81
+ def queue_size(self):
82
+ return self.queue.qsize()
83
+
84
+ def run_thread(self):
85
+ while self.running:
86
+ try:
87
+ event = self.queue.get(timeout=self.queue_get_timeout)
88
+ if isinstance(event, self.event_class):
89
+ self.handle_event(event)
90
+ self.events_completed += 1
91
+ except Empty:
92
+ continue
93
+ except Exception as e: # todo: add way to handle this (which are errors in the handle_event), may call an on_event_handler_exceptions method
94
+ self.events_failed += 1
95
+ continue
96
+
97
+ def wait_micro_seconds(self, value=10):
98
+ time.sleep(0.000001 * value)
99
+
100
+
101
+ def wait_for_thread_ends(self):
102
+ self.thread.join()
103
+ return self
104
+
105
+ # todo see if there are valid use cases for wait_for_queue_empty , or the wait_for_queue_completed is the one that is always used
106
+ def wait_for_queue_empty(self, thread_join_timeout=TIMEOUT__THREAD_JOIN): # this will start a new thread to wait for the main queue to be empty
107
+ def wait_until_queue_empty():
108
+ while self.running:
109
+ if self.queue.empty():
110
+ break
111
+ time.sleep(0.01)
112
+
113
+ wait_thread = Thread(target=wait_until_queue_empty)
114
+ wait_thread.start()
115
+ wait_thread.join(timeout=thread_join_timeout)
116
+ return self.queue.empty()
117
+
118
+ def wait_for_queue_completed(self, thread_join_timeout=TIMEOUT__THREAD_JOIN): # this will start a new thread to wait for the main queue to be empty
119
+ def wait_until_queue_completed():
120
+ while self.running:
121
+ if self.queue.empty() and self.events_added == self.events_completed :
122
+ break
123
+ time.sleep(TIMEOUT__WAIT_FOR_QUEUE_COMPLETED)
124
+ wait_thread = Thread(target=wait_until_queue_completed)
125
+ wait_thread.start()
126
+ wait_thread.join(timeout=thread_join_timeout)
127
+ return self.queue.empty()
@@ -0,0 +1,4 @@
1
+ from osbot_utils.helpers.pubsub.schemas.Schema__Event import Schema__Event
2
+
3
+ class Schema__Event__Disconnect(Schema__Event):
4
+ event_type : str = 'disconnect'
@@ -0,0 +1,14 @@
1
+ import types
2
+ from osbot_utils.helpers.pubsub.schemas.Schema__Event import Schema__Event
3
+
4
+ class Schema__Event__Execute_Method(Schema__Event):
5
+ event_type : str = 'execute-method'
6
+ execution_result : object = None
7
+ method_target : types.MethodType
8
+ method_args : list
9
+ method_kwargs : dict
10
+
11
+
12
+ def execute(self):
13
+ self.execution_result = self.method_target(*self.method_args, **self.method_kwargs)
14
+ return self.execution_result
@@ -1,5 +1,4 @@
1
- from osbot_utils.utils.Dev import pprint
2
-
1
+ from osbot_utils.utils.Dev import pprint
3
2
  from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
4
3
 
5
4
  PRINT_MAX_STRING_LENGTH = 100
@@ -7,14 +6,12 @@ PRINT_PADDING__DURATION = 100
7
6
  PRINT_PADDING_PARENT_INFO = 60
8
7
 
9
8
  class Trace_Call__Config(Kwargs_To_Self):
10
- title : str
11
9
  capture_locals : bool = False
12
10
  capture_duration : bool
13
11
  capture_extra_data : bool
14
12
  capture_frame : bool = True
15
13
  capture_frame_stats : bool
16
14
  deep_copy_locals : bool
17
- trace_capture_lines : bool
18
15
  ignore_start_with : list
19
16
  print_padding_duration : int = PRINT_PADDING__DURATION
20
17
  print_padding_parent_info : int = PRINT_PADDING_PARENT_INFO
@@ -27,6 +24,7 @@ class Trace_Call__Config(Kwargs_To_Self):
27
24
  show_caller : bool
28
25
  show_method_class : bool = True
29
26
  show_source_code_path : bool
27
+ title : str
30
28
  trace_capture_all : bool
31
29
  trace_capture_source_code : bool
32
30
  trace_capture_start_with : list
@@ -34,6 +32,7 @@ class Trace_Call__Config(Kwargs_To_Self):
34
32
  trace_enabled : bool = True
35
33
  trace_ignore_start_with : list
36
34
  trace_ignore_contains : list
35
+ trace_capture_lines : bool
37
36
  trace_show_internals : bool
38
37
  trace_up_to_depth : int
39
38
  with_duration_bigger_than : float