osbot-utils 1.36.0__tar.gz → 1.38.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 (297) hide show
  1. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/README.md +1 -1
  3. osbot_utils-1.38.0/osbot_utils/helpers/Random_Guid.py +14 -0
  4. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call.py +44 -0
  5. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +1 -0
  6. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +18 -5
  7. osbot_utils-1.38.0/osbot_utils/testing/Stderr.py +25 -0
  8. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Stdout.py +9 -3
  9. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Env.py +6 -1
  10. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Files.py +16 -0
  11. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Lists.py +3 -0
  12. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Misc.py +8 -0
  13. osbot_utils-1.38.0/osbot_utils/version +1 -0
  14. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/pyproject.toml +1 -1
  15. osbot_utils-1.36.0/osbot_utils/testing/Stderr.py +0 -19
  16. osbot_utils-1.36.0/osbot_utils/version +0 -1
  17. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/LICENSE +0 -0
  18. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/__init__.py +0 -0
  19. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  20. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  21. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  22. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/base_classes/Type_Safe.py +0 -0
  23. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
  24. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/base_classes/__init__.py +0 -0
  25. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/context_managers/__init__.py +0 -0
  26. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  27. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  28. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/__init__.py +0 -0
  29. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  30. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  31. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  32. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  33. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  34. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  35. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  36. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/cache.py +0 -0
  37. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  38. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  39. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  40. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  41. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  42. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/catch.py +0 -0
  43. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/context.py +0 -0
  44. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  45. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  46. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  47. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  48. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  49. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  50. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  51. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/fluent/__init__.py +0 -0
  52. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/__init__.py +0 -0
  53. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  54. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  55. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  56. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  57. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  58. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  59. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  60. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  61. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  62. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  63. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  64. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  65. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  66. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  67. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  68. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  69. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  70. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  71. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  72. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  73. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  74. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/CFormat.py +0 -0
  75. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/CPrint.py +0 -0
  76. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  77. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  78. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  79. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  80. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Print_Table.py +0 -0
  81. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  82. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  83. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  84. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  85. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/__init__.py +0 -0
  86. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  87. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  88. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  89. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  90. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  91. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  92. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  93. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  94. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  95. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  96. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  97. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  98. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  99. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  100. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  101. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  102. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  103. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  104. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  105. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  106. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  107. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  108. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  109. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  110. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  111. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  112. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  113. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  114. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  115. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  116. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  117. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  118. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  119. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  120. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  121. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  122. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  123. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  124. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  125. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  126. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  127. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  128. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  129. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  130. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  131. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  132. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  133. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  134. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  135. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  136. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  137. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  138. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  139. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  140. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  141. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  142. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  143. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  144. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  145. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  146. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  147. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  148. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  149. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  150. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  151. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  152. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  153. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  154. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  155. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  156. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  157. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  158. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  159. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  160. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  161. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  162. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  163. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  164. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  165. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  166. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  167. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  168. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  169. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  170. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  171. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/flows/Task.py +0 -0
  172. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  173. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  174. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  175. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  176. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  177. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  178. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  179. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  180. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  181. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  182. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  183. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  184. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  185. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  186. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  187. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/html/__init__.py +0 -0
  188. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  189. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  190. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  191. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  192. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  193. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  194. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  195. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  196. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  197. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  198. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  199. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  200. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  201. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  202. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  203. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  204. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  205. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  206. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  207. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  208. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  209. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  210. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  211. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  212. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  213. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  214. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  215. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  216. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  217. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  218. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  219. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  220. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  221. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  222. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  223. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  224. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  225. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  226. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  227. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  228. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  229. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  230. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  231. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  232. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  233. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  234. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  235. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  236. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  237. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  238. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  239. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  240. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  241. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  242. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  243. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  244. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  245. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  246. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  247. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  248. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  249. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  250. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  251. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  252. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  253. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  254. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  255. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  256. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  257. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  258. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Catch.py +0 -0
  259. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Duration.py +0 -0
  260. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Hook_Method.py +0 -0
  261. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  262. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Log_To_String.py +0 -0
  263. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Logging.py +0 -0
  264. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Patch_Print.py +0 -0
  265. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Profiler.py +0 -0
  266. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Pytest.py +0 -0
  267. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  268. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Temp_File.py +0 -0
  269. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  270. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  271. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  272. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  273. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  274. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Unit_Test.py +0 -0
  275. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/Unzip_File.py +0 -0
  276. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/testing/__init__.py +0 -0
  277. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Assert.py +0 -0
  278. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Call_Stack.py +0 -0
  279. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Csv.py +0 -0
  280. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Dev.py +0 -0
  281. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Exceptions.py +0 -0
  282. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Functions.py +0 -0
  283. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Http.py +0 -0
  284. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Int.py +0 -0
  285. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Json.py +0 -0
  286. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Json_Cache.py +0 -0
  287. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Objects.py +0 -0
  288. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Png.py +0 -0
  289. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Process.py +0 -0
  290. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Python_Logger.py +0 -0
  291. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Regex.py +0 -0
  292. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Status.py +0 -0
  293. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Str.py +0 -0
  294. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Toml.py +0 -0
  295. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Version.py +0 -0
  296. {osbot_utils-1.36.0 → osbot_utils-1.38.0}/osbot_utils/utils/Zip.py +0 -0
  297. {osbot_utils-1.36.0 → osbot_utils-1.38.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.36.0
3
+ Version: 1.38.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.36.0-blue)
25
+ ![Current Release](https://img.shields.io/badge/release-v1.38.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.36.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.38.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
 
@@ -0,0 +1,14 @@
1
+ # todo add to osbot utils
2
+ from osbot_utils.utils.Misc import random_guid
3
+
4
+ class Random_Guid(str):
5
+ def __new__(cls, value=None):
6
+ if value is None:
7
+ value = random_guid()
8
+ return str.__new__(cls, value)
9
+
10
+ def __init__(self, value=None):
11
+ self.value = value if value is not None else random_guid()
12
+
13
+ def __str__(self):
14
+ return self
@@ -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
@@ -489,6 +489,22 @@ def file_move_to_folder(source_file, target_folder):
489
489
  if file_move(source_file, target_file):
490
490
  return target_file
491
491
 
492
+ def files_names_without_extension(files):
493
+ return [file_name_without_extension(file) for file in files]
494
+
495
+ def files_names_in_folder(target, with_extension=False):
496
+ if with_extension:
497
+ return files_names(files_in_folder(target))
498
+ else:
499
+ return files_names_without_extension(files_in_folder(target))
500
+
501
+ def files_in_folder(path,pattern='*', only_files=True):
502
+ result = []
503
+ for file in Path(path).glob(pattern):
504
+ if only_files and is_not_file(file):
505
+ continue
506
+ result.append(str(file)) # todo: see if there is a better way to do this conversion to string
507
+ return sorted(result)
492
508
 
493
509
  def folders_names_in_folder(target):
494
510
  folders = folders_in_folder(target)
@@ -93,6 +93,9 @@ def list_index_by(values, index_by):
93
93
  def list_lower(input_list):
94
94
  return [item.lower() for item in input_list]
95
95
 
96
+ def list_minus_list(list_a, list_b):
97
+ return [item for item in list_a if item not in list_b]
98
+
96
99
  def list_not_empty(list):
97
100
  if list and type(list).__name__ == 'list' and len(list) >0:
98
101
  return True
@@ -8,6 +8,7 @@ import string
8
8
  import sys
9
9
  import textwrap
10
10
  import re
11
+ import threading
11
12
  import uuid
12
13
  import warnings
13
14
  from datetime import datetime, timedelta
@@ -67,6 +68,10 @@ def convert_to_number(value):
67
68
  else:
68
69
  return 0
69
70
 
71
+ def current_thread_id():
72
+ return threading.current_thread().native_id
73
+
74
+
70
75
  def date_time_from_to_str(date_time_str, format_from, format_to, print_conversion_error=False):
71
76
  try:
72
77
  date_time = datetime.strptime(date_time_str, format_from)
@@ -119,6 +124,9 @@ def date_time_now_less_time_delta(days=0,hours=0, minutes=0, seconds=0, date_tim
119
124
  def date_to_str(date, date_format='%Y-%m-%d'):
120
125
  return date.strftime(date_format)
121
126
 
127
+ def date_today():
128
+ return date_time_now(date_time_format='%Y-%m-%d')
129
+
122
130
  #note: this is here at the moment due to a circular dependency with lists and objects
123
131
  def list_set(target: object) -> object:
124
132
  if hasattr(target, '__iter__'):
@@ -0,0 +1 @@
1
+ v1.38.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.36.0"
3
+ version = "v1.38.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.36.0
File without changes