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.
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/PKG-INFO +2 -2
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/README.md +1 -1
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Type_Safe.py +4 -4
- osbot_utils-1.45.0/osbot_utils/context_managers/async_invoke.py +27 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/context_managers/capture_duration.py +1 -8
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -4
- osbot_utils-1.45.0/osbot_utils/context_managers/print_duration.py +9 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/filter_list.py +3 -3
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/capture_exception.py +2 -2
- osbot_utils-1.45.0/osbot_utils/helpers/Dependency_Manager.py +26 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/flows/Flow.py +51 -33
- osbot_utils-1.45.0/osbot_utils/helpers/flows/Flow__Config.py +11 -0
- osbot_utils-1.45.0/osbot_utils/helpers/flows/Task.py +83 -0
- osbot_utils-1.45.0/osbot_utils/helpers/flows/decorators/flow.py +18 -0
- osbot_utils-1.45.0/osbot_utils/helpers/flows/decorators/task.py +11 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Dict_To_Tags.py +5 -6
- osbot_utils-1.45.0/osbot_utils/helpers/pubsub/Event__Queue.py +127 -0
- osbot_utils-1.45.0/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +4 -0
- osbot_utils-1.45.0/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +14 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +3 -4
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Call_Stack.py +3 -0
- osbot_utils-1.45.0/osbot_utils/utils/Threads.py +27 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Zip.py +5 -0
- osbot_utils-1.45.0/osbot_utils/utils/__init__.py +0 -0
- osbot_utils-1.45.0/osbot_utils/version +1 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/pyproject.toml +1 -1
- osbot_utils-1.43.0/osbot_utils/helpers/flows/Task.py +0 -18
- osbot_utils-1.43.0/osbot_utils/helpers/pubsub/Event__Queue.py +0 -95
- osbot_utils-1.43.0/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -7
- osbot_utils-1.43.0/osbot_utils/version +0 -1
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/LICENSE +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/base_classes/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/context_managers/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/classes/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/classes/singleton.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/group_by.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/lists/index_by.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/catch.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/context.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/fluent/Fluent_List.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/fluent/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/CFormat.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/CPrint.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Local_Cache.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Local_Caches.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Print_Table.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Python_Audit.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Random_Guid.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Random_Seed.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Type_Registry.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/flows/__init__.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/html → osbot_utils-1.45.0/osbot_utils/helpers/flows/decorators}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/pubsub → osbot_utils-1.45.0/osbot_utils/helpers/html}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/pubsub/schemas → osbot_utils-1.45.0/osbot_utils/helpers/pubsub}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/sqlite → osbot_utils-1.45.0/osbot_utils/helpers/pubsub/schemas}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/cache → osbot_utils-1.45.0/osbot_utils/helpers/sqlite}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/sqlite/domains → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/cache}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
- {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
- {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
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
- {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
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
- {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
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
- {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
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/ssh → osbot_utils-1.45.0/osbot_utils/helpers/sqlite/tables}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/helpers/trace → osbot_utils-1.45.0/osbot_utils/helpers/ssh}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/testing → osbot_utils-1.45.0/osbot_utils/helpers/trace}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Catch.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Duration.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Hook_Method.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Log_To_String.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Logging.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Patch_Print.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Profiler.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Pytest.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Stderr.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Stdout.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_File.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Folder.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Zip.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Unit_Test.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/testing/Unzip_File.py +0 -0
- {osbot_utils-1.43.0/osbot_utils/utils → osbot_utils-1.45.0/osbot_utils/testing}/__init__.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Assert.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Csv.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Dev.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Env.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Exceptions.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Files.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Functions.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Http.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Int.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Json.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Json_Cache.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Lists.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Misc.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Objects.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Png.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Process.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Python_Logger.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Regex.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Status.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Str.py +0 -0
- {osbot_utils-1.43.0 → osbot_utils-1.45.0}/osbot_utils/utils/Toml.py +0 -0
- {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.
|
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
|
-

|
26
26
|
[](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
|
-

|
6
6
|
[](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
|
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
|
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')
|
@@ -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)
|
7
|
-
values = function(*args, **kwargs)
|
8
|
-
if only_show:
|
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
|
|
@@ -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
|
-
|
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
|
62
|
-
|
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.
|
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
|
-
|
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()
|
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
|
-
|
107
|
-
|
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
|
3
|
-
from osbot_utils.helpers.html.Tag__Body
|
4
|
-
from osbot_utils.helpers.html.Tag__Head
|
5
|
-
from osbot_utils.helpers.html.Tag__Html
|
6
|
-
from osbot_utils.helpers.html.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,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
|
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
|