osbot-utils 1.35.0__tar.gz → 1.37.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 (296) hide show
  1. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/README.md +1 -1
  3. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/context_managers/capture_duration.py +11 -7
  4. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call.py +44 -0
  5. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +1 -0
  6. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +18 -5
  7. osbot_utils-1.37.0/osbot_utils/testing/Stderr.py +25 -0
  8. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Stdout.py +9 -3
  9. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Env.py +6 -1
  10. osbot_utils-1.37.0/osbot_utils/version +1 -0
  11. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/pyproject.toml +1 -1
  12. osbot_utils-1.35.0/osbot_utils/testing/Stderr.py +0 -19
  13. osbot_utils-1.35.0/osbot_utils/version +0 -1
  14. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/LICENSE +0 -0
  15. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/__init__.py +0 -0
  16. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  17. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  18. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  19. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/base_classes/Type_Safe.py +0 -0
  20. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
  21. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/base_classes/__init__.py +0 -0
  22. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/context_managers/__init__.py +0 -0
  23. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  24. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/__init__.py +0 -0
  25. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  26. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  27. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  28. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  29. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  30. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  31. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  32. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/cache.py +0 -0
  33. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  34. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  35. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  36. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  37. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  38. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/catch.py +0 -0
  39. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/context.py +0 -0
  40. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  41. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  42. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  43. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  44. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  45. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  46. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  47. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/fluent/__init__.py +0 -0
  48. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/__init__.py +0 -0
  49. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  50. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  51. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  52. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  53. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  54. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  55. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  56. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  57. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  58. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  59. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  60. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  61. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  62. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  63. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  64. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  65. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  66. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  67. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  68. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  69. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  70. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/CFormat.py +0 -0
  71. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/CPrint.py +0 -0
  72. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  73. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  74. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  75. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  76. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Print_Table.py +0 -0
  77. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  78. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  79. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  80. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  81. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/__init__.py +0 -0
  82. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  83. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  84. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  85. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  86. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  87. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  88. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  89. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  90. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  91. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  92. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  93. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  94. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  95. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  96. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  97. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  98. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  99. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  100. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  101. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  102. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  103. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  104. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  105. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  106. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  107. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  108. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  109. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  110. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  111. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  112. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  113. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  114. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  115. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  116. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  117. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  118. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  119. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  120. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  121. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  122. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  123. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  124. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  125. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  126. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  127. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  128. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  129. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  130. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  131. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  132. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  133. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  134. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  135. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  136. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  137. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  138. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  139. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  140. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  141. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  142. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  143. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  144. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  145. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  146. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  147. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  148. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  149. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  150. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  151. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  152. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  153. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  154. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  155. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  156. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  157. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  158. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  159. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  160. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  161. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  162. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  163. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  164. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  165. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  166. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  167. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/flows/Task.py +0 -0
  168. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  169. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  170. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  171. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  172. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  173. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  174. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  175. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  176. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  177. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  178. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  179. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  180. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  181. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  182. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  183. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/html/__init__.py +0 -0
  184. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  185. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  186. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  187. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  188. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  189. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  190. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  191. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  192. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  193. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  194. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  195. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  196. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  197. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  198. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  199. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  200. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  201. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  202. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  203. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  204. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  205. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  206. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  207. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  208. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  209. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  210. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  211. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  212. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  213. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  214. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  215. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  216. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  217. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  218. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  219. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  220. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  221. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  222. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  223. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  224. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  225. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  226. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  227. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  228. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  229. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  230. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  231. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  232. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  233. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  234. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  235. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  236. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  237. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  238. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  239. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  240. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  241. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  242. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  243. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  244. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  245. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  246. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  247. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  248. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  249. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  250. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  251. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  252. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  253. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  254. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Catch.py +0 -0
  255. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Duration.py +0 -0
  256. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Hook_Method.py +0 -0
  257. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  258. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Log_To_String.py +0 -0
  259. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Logging.py +0 -0
  260. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Patch_Print.py +0 -0
  261. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Profiler.py +0 -0
  262. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Pytest.py +0 -0
  263. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  264. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Temp_File.py +0 -0
  265. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  266. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  267. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  268. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  269. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  270. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Unit_Test.py +0 -0
  271. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/Unzip_File.py +0 -0
  272. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/testing/__init__.py +0 -0
  273. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Assert.py +0 -0
  274. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Call_Stack.py +0 -0
  275. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Csv.py +0 -0
  276. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Dev.py +0 -0
  277. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Exceptions.py +0 -0
  278. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Files.py +0 -0
  279. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Functions.py +0 -0
  280. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Http.py +0 -0
  281. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Int.py +0 -0
  282. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Json.py +0 -0
  283. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Json_Cache.py +0 -0
  284. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Lists.py +0 -0
  285. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Misc.py +0 -0
  286. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Objects.py +0 -0
  287. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Png.py +0 -0
  288. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Process.py +0 -0
  289. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Python_Logger.py +0 -0
  290. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Regex.py +0 -0
  291. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Status.py +0 -0
  292. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Str.py +0 -0
  293. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Toml.py +0 -0
  294. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Version.py +0 -0
  295. {osbot_utils-1.35.0 → osbot_utils-1.37.0}/osbot_utils/utils/Zip.py +0 -0
  296. {osbot_utils-1.35.0 → osbot_utils-1.37.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.35.0
3
+ Version: 1.37.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.35.0-blue)
25
+ ![Current Release](https://img.shields.io/badge/release-v1.37.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.35.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.37.0-blue)
6
6
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
7
7
 
8
8
 
@@ -1,12 +1,13 @@
1
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
1
2
  from osbot_utils.utils.Misc import timestamp_utc_now
2
3
 
3
4
 
4
- class capture_duration():
5
- def __init__(self):
6
- self.duration = None
7
- self.start_timestamp = None
8
- self.end_timestamp = None
9
- self.seconds = None
5
+ class capture_duration(Type_Safe):
6
+ action_name : str
7
+ duration : float
8
+ start_timestamp : int
9
+ end_timestamp : int
10
+ seconds : float
10
11
 
11
12
  def __enter__(self):
12
13
  self.start_timestamp = timestamp_utc_now()
@@ -23,7 +24,10 @@ class capture_duration():
23
24
 
24
25
  def print(self):
25
26
  print()
26
- print(f'action took: {self.seconds} seconds')
27
+ if self.action_name:
28
+ print(f'action "{self.action_name}" took: {self.seconds} seconds')
29
+ else:
30
+ print(f'action took: {self.seconds} seconds')
27
31
 
28
32
  class print_duration(capture_duration):
29
33
 
@@ -1,5 +1,6 @@
1
1
  import linecache
2
2
  import sys
3
+ import threading
3
4
  from functools import wraps
4
5
 
5
6
  from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
@@ -8,6 +9,8 @@ from osbot_utils.helpers.trace.Trace_Call__Handler import Trace_Call__H
8
9
  from osbot_utils.helpers.trace.Trace_Call__Print_Lines import Trace_Call__Print_Lines
9
10
  from osbot_utils.helpers.trace.Trace_Call__Print_Traces import Trace_Call__Print_Traces
10
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
11
14
 
12
15
 
13
16
  def trace_calls(title = None , print_traces = True , show_locals = False, source_code = False ,
@@ -59,6 +62,7 @@ class Trace_Call(Kwargs_To_Self):
59
62
  self.config.trace_capture_contains = self.config.trace_capture_contains or [] # and None will be quite common since we can use [] on method's params
60
63
  self.config.print_max_string_length = self.config.print_max_string_length or PRINT_MAX_STRING_LENGTH
61
64
  self.stack = self.trace_call_handler.stack
65
+ self.trace_on_thread__data = {}
62
66
  #self.prev_trace_function = None # Stores the previous trace function
63
67
 
64
68
 
@@ -94,6 +98,13 @@ class Trace_Call(Kwargs_To_Self):
94
98
  #self.print_lines()
95
99
  return view_model
96
100
 
101
+ def print_to_str(self):
102
+ with Stdout() as stdout:
103
+ self.print()
104
+ trace_data = ansi_to_text(stdout.value())
105
+ return trace_data
106
+
107
+
97
108
  def print_lines(self):
98
109
  print()
99
110
  view_model = self.view_data()
@@ -106,6 +117,27 @@ class Trace_Call(Kwargs_To_Self):
106
117
  self.started = True # set this here so that it does show in the trace
107
118
  sys.settrace(self.trace_call_handler.trace_calls) # Set the new trace function
108
119
 
120
+ def start__on_thread(self, root_node=None):
121
+ if sys.gettrace() is None:
122
+ current_thread = threading.current_thread()
123
+ thread_sys_trace = sys.gettrace()
124
+ thread_name = current_thread.name
125
+ thread_id = current_thread.native_id
126
+ thread_nodes = []
127
+ thread_data = dict(thread_name = thread_name ,
128
+ thread_id = thread_id ,
129
+ thread_nodes = thread_nodes ,
130
+ thread_sys_trace = thread_sys_trace)
131
+ title = f"Thread: {thread_name} ({thread_id})"
132
+ thread_node__for_title = self.trace_call_handler.stack.add_node(title=title) # Add node with name of Thread
133
+
134
+ if root_node: # Add node with name of node
135
+ thread_node__for_root = self.trace_call_handler.stack.add_node(root_node)
136
+ thread_nodes.append(thread_node__for_root)
137
+ thread_nodes.append(thread_node__for_title)
138
+ sys.settrace(self.trace_call_handler.trace_calls)
139
+ self.trace_on_thread__data[thread_id] = thread_data
140
+
109
141
 
110
142
  def stop(self):
111
143
  if self.started:
@@ -113,6 +145,18 @@ class Trace_Call(Kwargs_To_Self):
113
145
  self.stack.empty_stack()
114
146
  self.started = False
115
147
 
148
+ def stop__on_thread(self):
149
+ current_thread = threading.current_thread()
150
+ thread_id = current_thread.native_id
151
+ thread_data = self.trace_on_thread__data.get(thread_id)
152
+ if thread_data: # if there trace_call set up in the current thread
153
+ thread_sys_trace = thread_data.get('thread_sys_trace')
154
+ thread_nodes = thread_data.get('thread_nodes')
155
+ for thread_node in thread_nodes: # remove extra nodes added during start__on_thread
156
+ self.trace_call_handler.stack.pop(thread_node)
157
+ sys.settrace(thread_sys_trace) # restore previous sys.trace value
158
+ del self.trace_on_thread__data[thread_id]
159
+
116
160
  def stats(self):
117
161
  return self.trace_call_handler.stats
118
162
 
@@ -33,6 +33,7 @@ class Trace_Call__Config(Kwargs_To_Self):
33
33
  trace_capture_contains : list
34
34
  trace_enabled : bool = True
35
35
  trace_ignore_start_with : list
36
+ trace_ignore_contains : list
36
37
  trace_show_internals : bool
37
38
  trace_up_to_depth : int
38
39
  with_duration_bigger_than : float
@@ -20,11 +20,19 @@ GLOBAL_FUNCTIONS_TO_IGNORE = ['value_type_matches_obj_annotation_for_attr'
20
20
  '__default__value__' ,
21
21
  '__setattr__' ,
22
22
  '<module>']
23
- GLOBAL_MODULES_TO_IGNORE = ['osbot_utils.helpers.trace.Trace_Call' , # todo: map out and document why exactly these modules are ignore (and what is the side effect)
24
- 'osbot_utils.helpers.CPrint' , # also see if this should be done here or at the print/view stage
25
- 'osbot_utils.helpers.Print_Table' ,
26
- 'osbot_utils.decorators.methods.cache_on_self' ,
27
- 'codecs']
23
+ GLOBAL_MODULES_TO_IGNORE = ['osbot_utils.helpers.trace.Trace_Call' , # todo: map out and document why exactly these modules are ignore (and what is the side effect)
24
+ 'osbot_utils.helpers.trace.Trace_Call__Config' ,
25
+ 'osbot_utils.helpers.trace.Trace_Call__View_Model' ,
26
+ 'osbot_utils.helpers.trace.Trace_Call__Print_Traces' ,
27
+ 'osbot_utils.helpers.trace.Trace_Call__Stack' ,
28
+ 'osbot_utils.base_classes.Type_Safe' ,
29
+ 'osbot_utils.helpers.CPrint' , # also see if this should be done here or at the print/view stage
30
+ 'osbot_utils.helpers.Print_Table' ,
31
+ 'osbot_utils.decorators.methods.cache_on_self' ,
32
+ 'codecs' ]
33
+
34
+ #GLOBAL_MODULES_TO_IGNORE = []
35
+ #GLOBAL_FUNCTIONS_TO_IGNORE = []
28
36
 
29
37
  class Trace_Call__Handler(Kwargs_To_Self):
30
38
  config : Trace_Call__Config
@@ -171,6 +179,11 @@ class Trace_Call__Handler(Kwargs_To_Self):
171
179
  if module.startswith(item) or func_name.startswith(item):
172
180
  capture = False
173
181
  break
182
+
183
+ for item in self.config.trace_ignore_contains: # Check if the module should be ignored
184
+ if item in module or item in func_name:
185
+ capture = False
186
+ break
174
187
  return capture
175
188
 
176
189
  def stack_json__parse_node(self, stack_node: Trace_Call__Stack_Node):
@@ -0,0 +1,25 @@
1
+ import io
2
+ from contextlib import redirect_stderr
3
+
4
+
5
+ class Stderr: # todo: refactor with Stdout whose code is 90% the same as this one. Add class to capture both at the same time
6
+ def __init__(self):
7
+ self.output = io.StringIO()
8
+ self.redirect_stderr = redirect_stderr(self.output)
9
+
10
+ def __enter__(self):
11
+ self.start()
12
+ return self
13
+
14
+ def __exit__(self, *args, **kwargs):
15
+ self.stop(*args, **kwargs)
16
+
17
+ def start(self):
18
+ self.redirect_stderr.__enter__()
19
+
20
+ def stop(self, exc_type=None, exc_inst=None, exc_tb=None):
21
+ self.redirect_stderr.__exit__(exc_type, exc_inst, exc_tb)
22
+
23
+ def value(self):
24
+ return self.output.getvalue()
25
+
@@ -8,11 +8,17 @@ class Stdout:
8
8
  self.redirect_stdout = redirect_stdout(self.output)
9
9
 
10
10
  def __enter__(self):
11
- self.redirect_stdout.__enter__()
11
+ self.start()
12
12
  return self
13
13
 
14
- def __exit__(self, exc_type, exc_val, exc_tb):
15
- self.redirect_stdout.__exit__(exc_type, exc_val, exc_tb)
14
+ def __exit__(self, *args, **kwargs):
15
+ self.stop(*args, **kwargs)
16
+
17
+ def start(self):
18
+ self.redirect_stdout.__enter__()
19
+
20
+ def stop(self, exc_type=None, exc_inst=None, exc_tb=None):
21
+ self.redirect_stdout.__exit__(exc_type, exc_inst, exc_tb)
16
22
 
17
23
  def value(self):
18
24
  return self.output.getvalue()
@@ -20,7 +20,9 @@ def env__pwd():
20
20
  return get_env('PWD', '')
21
21
 
22
22
  def env__old_pwd__remove(value):
23
- return value.replace(env__old_pwd(), '')
23
+ if env__old_pwd() != '/': # can't replace with old pwd is just /
24
+ return value.replace(env__old_pwd(), '')
25
+ return value
24
26
 
25
27
  def env__terminal__is__xterm():
26
28
  return os.getenv('TERM') == 'xterm'
@@ -91,6 +93,9 @@ def find_dotenv_file(start_path=None, env_file_to_find='.env'):
91
93
  def in_github_action():
92
94
  return os.getenv('GITHUB_ACTIONS') == 'true'
93
95
 
96
+ def in_pytest_with_coverage():
97
+ return os.getenv('COVERAGE_RUN') == 'true'
98
+
94
99
  def in_python_debugger():
95
100
  if sys.gettrace() is not None: # Check for a trace function
96
101
  return True
@@ -0,0 +1 @@
1
+ v1.37.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.35.0"
3
+ version = "v1.37.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,19 +0,0 @@
1
- import io
2
- from contextlib import redirect_stderr
3
-
4
-
5
- class Stderr:
6
- def __init__(self):
7
- self.output = io.StringIO()
8
- self.redirect_stderr = redirect_stderr(self.output)
9
-
10
- def __enter__(self):
11
- self.redirect_stderr.__enter__()
12
- return self
13
-
14
- def __exit__(self, exc_type, exc_val, exc_tb):
15
- self.redirect_stderr.__exit__(exc_type, exc_val, exc_tb)
16
-
17
- def value(self):
18
- return self.output.getvalue()
19
-
@@ -1 +0,0 @@
1
- v1.35.0
File without changes