osbot-utils 2.18.0__tar.gz → 2.20.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 (362) hide show
  1. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/PKG-INFO +2 -2
  2. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/README.md +1 -1
  3. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/Flow.py +32 -1
  4. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/Task.py +20 -8
  5. osbot_utils-2.20.0/osbot_utils/helpers/flows/actions/Flow__Data.py +87 -0
  6. osbot_utils-2.20.0/osbot_utils/helpers/flows/models/Flow_Run__Config.py +14 -0
  7. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +2 -5
  8. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -2
  9. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +1 -0
  10. osbot_utils-2.20.0/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +11 -0
  11. osbot_utils-2.20.0/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +7 -0
  12. osbot_utils-2.20.0/osbot_utils/helpers/flows/schemas/Schema__Flow.py +9 -0
  13. osbot_utils-2.20.0/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +25 -0
  14. osbot_utils-2.20.0/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +13 -0
  15. osbot_utils-2.20.0/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +14 -0
  16. osbot_utils-2.20.0/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +10 -0
  17. osbot_utils-2.20.0/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +15 -0
  18. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +6 -5
  19. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/Type_Safe__Set.py +6 -1
  20. osbot_utils-2.20.0/osbot_utils/type_safe/validators/__init__.py +0 -0
  21. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Json.py +34 -0
  22. osbot_utils-2.20.0/osbot_utils/utils/__init__.py +0 -0
  23. osbot_utils-2.20.0/osbot_utils/version +1 -0
  24. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/pyproject.toml +1 -1
  25. osbot_utils-2.18.0/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -12
  26. osbot_utils-2.18.0/osbot_utils/version +0 -1
  27. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/LICENSE +0 -0
  28. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/__init__.py +0 -0
  29. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  30. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  31. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  32. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/base_classes/__init__.py +0 -0
  33. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/context_managers/__init__.py +0 -0
  34. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  35. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  36. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  37. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/context_managers/print_duration.py +0 -0
  38. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/__init__.py +0 -0
  39. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  40. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  41. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  42. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  43. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  44. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  45. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  46. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/cache.py +0 -0
  47. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  48. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  49. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  50. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  51. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  52. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/catch.py +0 -0
  53. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/context.py +0 -0
  54. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  55. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  56. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  57. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  58. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  59. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  60. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  61. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/fluent/__init__.py +0 -0
  62. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/CFormat.py +0 -0
  63. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/CPrint.py +0 -0
  64. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  65. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  66. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Guid.py +0 -0
  67. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  68. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  69. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  70. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  71. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Print_Table.py +0 -0
  72. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  73. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  74. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  75. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  76. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Safe_Id.py +0 -0
  77. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  78. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  79. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  80. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  81. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/__init__.py +0 -0
  82. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  83. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  84. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  85. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  86. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  87. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  88. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  89. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  90. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  91. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  92. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  93. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  94. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  95. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  96. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  97. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  98. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  99. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  100. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  101. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  102. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  103. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  104. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  105. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  106. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  107. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  108. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  109. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  110. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  111. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  112. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  113. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  114. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  115. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  116. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  117. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  118. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  119. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  120. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  121. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  122. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  123. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  124. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  125. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  126. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  127. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  128. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  129. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  130. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  131. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  132. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  133. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  134. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  135. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  136. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  137. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  138. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  139. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  140. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  141. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  142. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  143. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  144. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  145. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  146. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  147. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  148. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  149. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  150. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  151. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  152. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  153. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  154. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  155. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  156. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  157. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  158. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  159. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  160. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  161. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  162. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  163. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  164. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  165. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  166. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  167. {osbot_utils-2.18.0/osbot_utils/helpers/flows → osbot_utils-2.20.0/osbot_utils/helpers/flows/actions}/Flow__Events.py +0 -0
  168. {osbot_utils-2.18.0/osbot_utils/helpers/flows/decorators → osbot_utils-2.20.0/osbot_utils/helpers/flows/actions}/__init__.py +0 -0
  169. {osbot_utils-2.18.0/osbot_utils/helpers/flows/models → osbot_utils-2.20.0/osbot_utils/helpers/flows/decorators}/__init__.py +0 -0
  170. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  171. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  172. {osbot_utils-2.18.0/osbot_utils/helpers/generators → osbot_utils-2.20.0/osbot_utils/helpers/flows/models}/__init__.py +0 -0
  173. {osbot_utils-2.18.0/osbot_utils/helpers/html → osbot_utils-2.20.0/osbot_utils/helpers/flows/schemas}/__init__.py +0 -0
  174. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  175. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  176. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  177. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  178. {osbot_utils-2.18.0/osbot_utils/helpers/pubsub → osbot_utils-2.20.0/osbot_utils/helpers/generators}/__init__.py +0 -0
  179. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  180. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  181. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  182. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  183. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  184. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  185. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  186. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  187. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  188. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  189. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  190. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  191. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  192. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  193. {osbot_utils-2.18.0/osbot_utils/helpers/pubsub/schemas → osbot_utils-2.20.0/osbot_utils/helpers/html}/__init__.py +0 -0
  194. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  195. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  196. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  197. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  198. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  199. {osbot_utils-2.18.0/osbot_utils/helpers/python_compatibility → osbot_utils-2.20.0/osbot_utils/helpers/pubsub}/__init__.py +0 -0
  200. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  201. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  202. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  203. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  204. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  205. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  206. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  207. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  208. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite → osbot_utils-2.20.0/osbot_utils/helpers/pubsub/schemas}/__init__.py +0 -0
  209. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite/cache → osbot_utils-2.20.0/osbot_utils/helpers/python_compatibility}/__init__.py +0 -0
  210. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  211. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  212. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  213. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  214. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  215. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  216. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  217. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  218. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  219. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  220. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite/domains → osbot_utils-2.20.0/osbot_utils/helpers/sqlite}/__init__.py +0 -0
  221. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  222. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  223. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  224. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  225. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  226. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  227. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  228. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite/domains/schemas → osbot_utils-2.20.0/osbot_utils/helpers/sqlite/cache}/__init__.py +0 -0
  229. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  230. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  231. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  232. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  233. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  234. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite/models → osbot_utils-2.20.0/osbot_utils/helpers/sqlite/domains}/__init__.py +0 -0
  235. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite/sample_data → osbot_utils-2.20.0/osbot_utils/helpers/sqlite/domains/schemas}/__init__.py +0 -0
  236. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  237. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite/sql_builder → osbot_utils-2.20.0/osbot_utils/helpers/sqlite/models}/__init__.py +0 -0
  238. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  239. {osbot_utils-2.18.0/osbot_utils/helpers/sqlite/tables → osbot_utils-2.20.0/osbot_utils/helpers/sqlite/sample_data}/__init__.py +0 -0
  240. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  241. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  242. {osbot_utils-2.18.0/osbot_utils/helpers/ssh → osbot_utils-2.20.0/osbot_utils/helpers/sqlite/sql_builder}/__init__.py +0 -0
  243. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  244. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  245. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  246. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  247. {osbot_utils-2.18.0/osbot_utils/helpers/trace → osbot_utils-2.20.0/osbot_utils/helpers/sqlite/tables}/__init__.py +0 -0
  248. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  249. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  250. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  251. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  252. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  253. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  254. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  255. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  256. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  257. {osbot_utils-2.18.0/osbot_utils/helpers/xml → osbot_utils-2.20.0/osbot_utils/helpers/ssh}/__init__.py +0 -0
  258. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  259. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  260. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  261. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  262. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  263. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  264. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  265. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  266. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  267. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  268. {osbot_utils-2.18.0/osbot_utils/testing → osbot_utils-2.20.0/osbot_utils/helpers/trace}/__init__.py +0 -0
  269. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  270. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  271. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  272. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  273. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  274. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  275. {osbot_utils-2.18.0/osbot_utils/testing/performance → osbot_utils-2.20.0/osbot_utils/helpers/xml}/__init__.py +0 -0
  276. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  277. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  278. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  279. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  280. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  281. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Catch.py +0 -0
  282. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  283. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Duration.py +0 -0
  284. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Hook_Method.py +0 -0
  285. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  286. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Log_To_String.py +0 -0
  287. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Logging.py +0 -0
  288. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Patch_Print.py +0 -0
  289. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Profiler.py +0 -0
  290. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Pytest.py +0 -0
  291. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Stderr.py +0 -0
  292. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Stdout.py +0 -0
  293. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  294. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Temp_File.py +0 -0
  295. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  296. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  297. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  298. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  299. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  300. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Unit_Test.py +0 -0
  301. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/Unzip_File.py +0 -0
  302. {osbot_utils-2.18.0/osbot_utils/testing/performance/models → osbot_utils-2.20.0/osbot_utils/testing}/__init__.py +0 -0
  303. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  304. {osbot_utils-2.18.0/osbot_utils/type_safe → osbot_utils-2.20.0/osbot_utils/testing/performance}/__init__.py +0 -0
  305. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  306. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  307. {osbot_utils-2.18.0/osbot_utils/type_safe/decorators → osbot_utils-2.20.0/osbot_utils/testing/performance/models}/__init__.py +0 -0
  308. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/Type_Safe.py +0 -0
  309. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  310. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/Type_Safe__Dict.py +0 -0
  311. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/Type_Safe__List.py +0 -0
  312. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/Type_Safe__Method.py +0 -0
  313. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/Type_Safe__Tuple.py +0 -0
  314. {osbot_utils-2.18.0/osbot_utils/type_safe/methods → osbot_utils-2.20.0/osbot_utils/type_safe}/__init__.py +0 -0
  315. {osbot_utils-2.18.0/osbot_utils/type_safe/shared → osbot_utils-2.20.0/osbot_utils/type_safe/decorators}/__init__.py +0 -0
  316. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/decorators/type_safe.py +0 -0
  317. {osbot_utils-2.18.0/osbot_utils/type_safe/steps → osbot_utils-2.20.0/osbot_utils/type_safe/methods}/__init__.py +0 -0
  318. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/methods/type_safe_property.py +0 -0
  319. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/shared/Type_Safe__Annotations.py +0 -0
  320. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/shared/Type_Safe__Cache.py +0 -0
  321. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/shared/Type_Safe__Convert.py +0 -0
  322. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/shared/Type_Safe__Not_Cached.py +0 -0
  323. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/shared/Type_Safe__Raise_Exception.py +0 -0
  324. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/shared/Type_Safe__Shared__Variables.py +0 -0
  325. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/shared/Type_Safe__Validation.py +0 -0
  326. {osbot_utils-2.18.0/osbot_utils/type_safe/validators → osbot_utils-2.20.0/osbot_utils/type_safe/shared}/__init__.py +0 -0
  327. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
  328. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  329. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Value.py +0 -0
  330. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/steps/Type_Safe__Step__From_Json.py +0 -0
  331. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Init.py +0 -0
  332. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Set_Attr.py +0 -0
  333. {osbot_utils-2.18.0/osbot_utils/utils → osbot_utils-2.20.0/osbot_utils/type_safe/steps}/__init__.py +0 -0
  334. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  335. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  336. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  337. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  338. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  339. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Assert.py +0 -0
  340. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Call_Stack.py +0 -0
  341. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Csv.py +0 -0
  342. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Dev.py +0 -0
  343. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Env.py +0 -0
  344. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Exceptions.py +0 -0
  345. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Files.py +0 -0
  346. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Functions.py +0 -0
  347. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Http.py +0 -0
  348. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Int.py +0 -0
  349. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Json_Cache.py +0 -0
  350. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Lists.py +0 -0
  351. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Misc.py +0 -0
  352. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Objects.py +0 -0
  353. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Png.py +0 -0
  354. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Process.py +0 -0
  355. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Python_Logger.py +0 -0
  356. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Regex.py +0 -0
  357. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Status.py +0 -0
  358. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Str.py +0 -0
  359. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Threads.py +0 -0
  360. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Toml.py +0 -0
  361. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Version.py +0 -0
  362. {osbot_utils-2.18.0 → osbot_utils-2.20.0}/osbot_utils/utils/Zip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: osbot_utils
3
- Version: 2.18.0
3
+ Version: 2.20.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  License: MIT
6
6
  Author: Dinis Cruz
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  Powerful Python util methods and classes that simplify common apis and tasks.
25
25
 
26
- ![Current Release](https://img.shields.io/badge/release-v2.18.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v2.20.0-blue)
27
27
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
28
28
 
29
29
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Powerful Python util methods and classes that simplify common apis and tasks.
4
4
 
5
- ![Current Release](https://img.shields.io/badge/release-v2.18.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v2.20.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
 
@@ -3,10 +3,12 @@ import logging
3
3
  import typing
4
4
 
5
5
  from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
6
+ from osbot_utils.helpers.flows.actions.Flow__Data import Flow__Data
7
+ from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
6
8
  from osbot_utils.type_safe.Type_Safe import Type_Safe
7
9
  from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
8
10
  from osbot_utils.helpers.flows.models.Flow_Run__Config import Flow_Run__Config
9
- from osbot_utils.helpers.flows.Flow__Events import flow_events
11
+ from osbot_utils.helpers.flows.actions.Flow__Events import flow_events
10
12
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
11
13
  from osbot_utils.testing.Stdout import Stdout
12
14
  from osbot_utils.utils.Misc import random_id, lower, time_now
@@ -22,6 +24,7 @@ FLOW__LOGGING__DATE_FORMAT = '%H:%M:%S'
22
24
 
23
25
  # todo: add flow duration
24
26
  class Flow(Type_Safe):
27
+ flow_data : Flow__Data
25
28
  captured_exec_logs : list
26
29
  data : dict # dict available to the tasks to add and collect data
27
30
  flow_id : str # rename to flow_run_id (or also capture the flow_run_id)
@@ -47,6 +50,10 @@ class Flow(Type_Safe):
47
50
  type = artifact_type or "link")) # type clashed with built-in type
48
51
  event_data.flow_run_id = self.flow_id
49
52
  flow_events.on__new_artifact(event_data)
53
+ self.flow_data.add_artifact(key = key or 'default' ,
54
+ description = description or '' ,
55
+ data = data ,
56
+ artifact_type = artifact_type or 'default' )
50
57
 
51
58
 
52
59
  def add_flow_result(self, key, description):
@@ -55,6 +62,7 @@ class Flow(Type_Safe):
55
62
  event_data.data = dict(result_data = dict(key = key ,
56
63
  description = description ))
57
64
  flow_events.on__new_result(event_data)
65
+ self.flow_data.add_result(key, description)
58
66
 
59
67
  def config_logger(self):
60
68
  with self.logger as _:
@@ -79,9 +87,12 @@ class Flow(Type_Safe):
79
87
  try:
80
88
  with Stdout() as stdout:
81
89
  self.invoke_flow_target()
90
+ self.flow_data.set_return_value(self.flow_return_value)
91
+ self.flow_data.set_completed()
82
92
  except Exception as error:
83
93
  self.flow_error = error
84
94
  self.log_error(self.cformat.red(f"Error executing flow: {error}"))
95
+ self.flow_data.set_error(error)
85
96
 
86
97
  self.log_captured_stdout (stdout)
87
98
  self.print_flow_return_value ()
@@ -93,6 +104,9 @@ class Flow(Type_Safe):
93
104
  if self.flow_return_value:
94
105
  self.add_flow_result(key = 'flow-return-value', description=f'{self.flow_return_value}')
95
106
  flow_events.on__flow__stop(self.flow_event_data())
107
+
108
+ if self.flow_config.raise_flow_error and self.flow_error: # raise an event if there was an error and raise_flow_error is set
109
+ raise self.flow_error
96
110
  return self
97
111
 
98
112
  def captured_logs(self):
@@ -153,6 +167,7 @@ class Flow(Type_Safe):
153
167
  self.logger.error(message)
154
168
  else:
155
169
  self.logger.info(message)
170
+ self.flow_data.add_log(log_level, message, task_run_id)
156
171
 
157
172
  def log_messages(self):
158
173
  return ansis_to_texts(self.log_messages_with_colors())
@@ -161,6 +176,8 @@ class Flow(Type_Safe):
161
176
  return self.logger.memory_handler_messages()
162
177
 
163
178
  def print_log_messages(self, use_colors=True):
179
+ print()
180
+ print()
164
181
  if use_colors:
165
182
  if self.captured_exec_logs:
166
183
  for message in self.captured_exec_logs:
@@ -230,9 +247,23 @@ class Flow(Type_Safe):
230
247
  _.config_logger ()
231
248
  _.setup_flow_run ()
232
249
  _.set_flow_name ()
250
+ _.flow_data.set_flow_id (self.flow_id)
251
+ _.flow_data.set_flow_name(self.flow_name)
252
+ _.add_event_listener()
233
253
  return self
234
254
 
235
255
  def setup_flow_run(self):
236
256
  with self as _:
237
257
  if not _.flow_id:
238
258
  _.flow_id = self.random_flow_id()
259
+
260
+ def add_event_listener(self):
261
+ flow_events.event_listeners.append(self.event_listener)
262
+
263
+ def event_listener(self, flow_event: Flow_Run__Event):
264
+ if self.flow_config.flow_data__capture_events:
265
+ self.flow_data.add_event(flow_event)
266
+
267
+ def json(self) -> typing.Dict[str, typing.Any]: # Convert flow data to JSON
268
+ return self.flow_data.json()
269
+
@@ -4,7 +4,7 @@ import typing
4
4
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
5
5
  from osbot_utils.utils.Misc import random_id, lower
6
6
  from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
7
- from osbot_utils.helpers.flows.Flow__Events import flow_events
7
+ from osbot_utils.helpers.flows.actions.Flow__Events import flow_events
8
8
  from osbot_utils.testing.Stdout import Stdout
9
9
  from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_red, f_blue, f_bold
10
10
  from osbot_utils.type_safe.Type_Safe import Type_Safe
@@ -49,6 +49,7 @@ class Task(Type_Safe):
49
49
  return self.execute__after()
50
50
 
51
51
  def execute__before(self):
52
+ self.on_task_start()
52
53
  self.task_flow = self.find_flow()
53
54
  if self.task_flow is None:
54
55
  raise Exception("No Flow found for Task")
@@ -107,17 +108,17 @@ class Task(Type_Safe):
107
108
  self.print_task_finished_message()
108
109
 
109
110
  flow_events.on__task__stop(self.task_event_data())
111
+ self.on_task_end()
110
112
  return self.task_return_value
111
113
 
112
-
113
- def find_flow(self):
114
+ def find_flow(self): # Find the closest Flow instance in the call stack by examining both self parameters and local variables in each frame
114
115
  stack = inspect.stack()
115
116
  for frame_info in stack:
116
117
  frame = frame_info.frame
117
- if 'self' in frame.f_locals:
118
- instance = frame.f_locals['self']
119
- if type(instance) is Flow:
120
- return instance
118
+ for var_name, var_value in list(frame.f_locals.items()): # Check all local variables in the frame
119
+ if type(var_value) is Flow:
120
+ return var_value
121
+ return None
121
122
 
122
123
  def print_task_finished_message(self):
123
124
  if self.task_flow.flow_config.print_finished_message:
@@ -131,4 +132,15 @@ class Task(Type_Safe):
131
132
 
132
133
 
133
134
  def random_task_id(self):
134
- return lower(random_id(prefix=TASK__RANDOM_ID__PREFIX))
135
+ return lower(random_id(prefix=TASK__RANDOM_ID__PREFIX))
136
+
137
+
138
+ def on_task_start(self): # Handle task start event
139
+ self.task_flow.flow_data.add_task(self.task_id, self.task_name)
140
+
141
+ def on_task_end(self): # Handle task end event
142
+ status = 'failed' if self.task_error else 'completed'
143
+ self.task_flow.flow_data.update_task(self.task_id ,
144
+ status ,
145
+ self.task_error ,
146
+ self.task_return_value)
@@ -0,0 +1,87 @@
1
+ from typing import Optional, Dict, Any
2
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
3
+ from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
4
+ from osbot_utils.helpers.flows.models.Schema__Flow__Artifact import Schema__Flow__Artifact
5
+ from osbot_utils.helpers.flows.models.Schema__Flow__Result import Schema__Flow__Result
6
+ from osbot_utils.helpers.flows.schemas.Schema__Flow import Schema__Flow
7
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Data import Schema__Flow__Data
8
+ #from osbot_utils.helpers.flows.schemas.Schema__Flow__Event import Schema__Flow__Event
9
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Log import Schema__Flow__Log
10
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Task__Data import Schema__Flow__Task__Data
11
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
12
+
13
+
14
+ class Flow__Data(Type_Safe):
15
+ flow_data : Schema__Flow__Data # Main data container for flow execution
16
+
17
+ def set_completed(self): # Mark flow as completed
18
+ self.flow_data.end_time = Timestamp_Now()
19
+ self.flow_data.status = "completed"
20
+
21
+ def set_error(self, error: Exception): # Record flow execution error
22
+ self.flow_data.end_time = Timestamp_Now()
23
+ self.flow_data.status = "failed"
24
+ self.flow_data.error = str(error)
25
+
26
+ def set_flow_id(self, flow_id: str): # Set flow identifier
27
+ self.flow_data.flow_id = flow_id
28
+
29
+ def set_flow_name(self, flow_name: str): # Set flow name
30
+ self.flow_data.flow_name = flow_name
31
+
32
+ def set_return_value(self, value: Any): # Set flow return value
33
+ self.flow_data.return_value = value
34
+
35
+ def add_task(self, task_id: str, task_name: str): # Record start of task execution
36
+ self.flow_data.tasks[task_id] = Schema__Flow__Task__Data(task_id = task_id ,
37
+ task_name = task_name ,
38
+ start_time = Timestamp_Now() ,
39
+ end_time = None ,
40
+ status = "" ,
41
+ error_message= None ,
42
+ return_value = None ,
43
+ input_args = () ,
44
+ input_kwargs = {} )
45
+
46
+ def update_task(self, task_id: str, status: str, # Update task execution status
47
+ error: Optional[Exception] = None,
48
+ return_value: Any = None):
49
+ if task_id in self.flow_data.tasks:
50
+ task_data = self.flow_data.tasks[task_id]
51
+ task_data.end_time = Timestamp_Now()
52
+ task_data.status = status
53
+ task_data.error_message = str(error) if error else None
54
+ task_data.return_value = return_value
55
+
56
+ # def add_event(self, event: Schema__Flow__Event): # todo: this needs refactoring with the Flow_Run__Event events used below
57
+ def add_event(self, event: Flow_Run__Event): # Record flow execution event
58
+ self.flow_data.events.append(event)
59
+
60
+ def add_log(self, level: int, message: str, # Record log message
61
+ task_id: Optional[str] = None):
62
+ self.flow_data.logs.append(Schema__Flow__Log(
63
+ timestamp = Timestamp_Now(),
64
+ level = level,
65
+ message = message,
66
+ task_id = task_id))
67
+
68
+ def add_result(self, key: str, description: str): # Record flow execution result
69
+ self.flow_data.results.append(Schema__Flow__Result(
70
+ key = key,
71
+ description = description,
72
+ timestamp = Timestamp_Now()))
73
+
74
+ def add_artifact(self, key : str,
75
+ description : str,
76
+ data : Any,
77
+ artifact_type: str): # Record flow execution artifact
78
+
79
+ self.flow_data.artifacts.append(Schema__Flow__Artifact(
80
+ key = key,
81
+ description = description,
82
+ data = data,
83
+ type = artifact_type,
84
+ timestamp = Timestamp_Now()))
85
+
86
+ def json(self) -> Dict[str, Any]: # Convert flow data to JSON
87
+ return Schema__Flow(flow_data=self.flow_data).json()
@@ -0,0 +1,14 @@
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
+
3
+ # todo: this needs a good clean up and refactoring
4
+ class Flow_Run__Config(Type_Safe):
5
+ add_task_to_self : bool = True
6
+ log_to_console : bool = False
7
+ log_to_memory : bool = True
8
+ logging_enabled : bool = True
9
+ print_logs : bool = False
10
+ print_none_return_value : bool = False
11
+ print_finished_message : bool = False
12
+ raise_flow_error : bool = True
13
+ flow_data__capture_events : bool = False
14
+
@@ -1,12 +1,9 @@
1
- from osbot_utils.helpers.Random_Guid import Random_Guid
2
-
3
- from osbot_utils.type_safe.Type_Safe import Type_Safe
1
+ from osbot_utils.helpers.Random_Guid import Random_Guid
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
3
  from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
5
4
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
6
5
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Type import Flow_Run__Event_Type
7
6
 
8
-
9
-
10
7
  class Flow_Run__Event(Type_Safe):
11
8
  event_id : Random_Guid
12
9
  event_type : Flow_Run__Event_Type
@@ -1,8 +1,6 @@
1
1
  import logging
2
-
3
2
  from osbot_utils.type_safe.Type_Safe import Type_Safe
4
3
 
5
-
6
4
  class Flow_Run__Event_Data(Type_Safe):
7
5
  data : dict
8
6
  event_source: str
@@ -1,3 +1,4 @@
1
+
1
2
  from enum import Enum
2
3
 
3
4
  from osbot_utils.type_safe.Type_Safe import Type_Safe
@@ -0,0 +1,11 @@
1
+ from typing import Any
2
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
+
5
+
6
+ class Schema__Flow__Artifact(Type_Safe): # Represents an artifact produced during flow execution
7
+ key : str
8
+ description : str
9
+ data : Any
10
+ type : str
11
+ timestamp : Timestamp_Now
@@ -0,0 +1,7 @@
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
3
+
4
+ class Schema__Flow__Result(Type_Safe): # Represents a result produced by the flow
5
+ key : str
6
+ description : str
7
+ timestamp : Timestamp_Now
@@ -0,0 +1,9 @@
1
+ from typing import List
2
+
3
+ from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
4
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Data import Schema__Flow__Data
5
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
6
+
7
+ class Schema__Flow(Type_Safe): # Root schema for flow execution data
8
+ flow_data : Schema__Flow__Data
9
+ flow_events: List[Flow_Run__Event] # todo: refactor this Flow_Run__Event class with the respective Schema_* classes
@@ -0,0 +1,25 @@
1
+ from typing import Optional, Dict, List, Any
2
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
3
+ from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
4
+ from osbot_utils.helpers.flows.models.Schema__Flow__Artifact import Schema__Flow__Artifact
5
+ from osbot_utils.helpers.flows.models.Schema__Flow__Result import Schema__Flow__Result
6
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Log import Schema__Flow__Log
7
+ from osbot_utils.helpers.flows.schemas.Schema__Flow__Task__Data import Schema__Flow__Task__Data
8
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
9
+ #from osbot_utils.helpers.flows.schemas.Schema__Flow__Event import Schema__Flow__Event
10
+
11
+
12
+ class Schema__Flow__Data(Type_Safe): # Main container for flow execution data
13
+ flow_id : str
14
+ flow_name : str
15
+ start_time : Timestamp_Now
16
+ end_time : Optional[Timestamp_Now]
17
+ status : str # 'completed', 'failed', 'running'
18
+ error : Optional[str]
19
+ tasks : Dict[str, Schema__Flow__Task__Data] # task_id -> task_data
20
+ #events : List[Schema__Flow__Event] # todo: this needs refactoring with the Flow_Run__Event events used below
21
+ events : List[Flow_Run__Event]
22
+ results : List[Schema__Flow__Result]
23
+ artifacts : List[Schema__Flow__Artifact]
24
+ logs : List[Schema__Flow__Log]
25
+ return_value : Any
@@ -0,0 +1,13 @@
1
+ # todo: this needs refactoring with the Flow_Run__Event events stored in the Schema__Flow__Data. object
2
+
3
+
4
+ # from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
5
+ # from osbot_utils.helpers.flows.schemas.Schema__Flow__Event__Data import Schema__Flow__Event__Data
6
+ # from osbot_utils.type_safe.Type_Safe import Type_Safe
7
+ #
8
+ #
9
+ # class Schema__Flow__Event(Type_Safe): # Represents a single event in the flow execution"""
10
+ # event_id : str
11
+ # event_type : str
12
+ # event_data : Schema__Flow__Event__Data
13
+ # timestamp : Timestamp_Now
@@ -0,0 +1,14 @@
1
+ # todo: this needs refactoring with the Flow_Run__Event events stored in the Schema__Flow__Data. object
2
+
3
+ # from typing import Dict, Optional, Any
4
+ # from osbot_utils.type_safe.Type_Safe import Type_Safe
5
+ #
6
+ #
7
+ # class Schema__Flow__Event__Data(Type_Safe): # Represents the data associated with a flow event
8
+ # data : Dict[str, Any]
9
+ # event_source : str
10
+ # flow_name : Optional[str]
11
+ # flow_run_id : Optional[str]
12
+ # log_level : int
13
+ # task_name : Optional[str]
14
+ # task_run_id : Optional[str]
@@ -0,0 +1,10 @@
1
+ from typing import Optional
2
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
+
5
+
6
+ class Schema__Flow__Log(Type_Safe): # Represents a log entry from the flow execution
7
+ timestamp : Timestamp_Now
8
+ level : int
9
+ message : str
10
+ task_id : Optional[str]
@@ -0,0 +1,15 @@
1
+ from typing import Optional, Any
2
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
+
5
+
6
+ class Schema__Flow__Task__Data(Type_Safe): # Represents the data associated with a task execution
7
+ task_id : str
8
+ task_name : str
9
+ start_time : Timestamp_Now
10
+ end_time : Optional[Timestamp_Now]
11
+ status : str # 'completed', 'failed', 'running'
12
+ error_message : Optional[str]
13
+ return_value : Any
14
+ input_args : tuple
15
+ input_kwargs : dict
@@ -58,11 +58,12 @@ class RSS__Feed__Parser:
58
58
  # Process channel image if present
59
59
  if 'image' in channel_data:
60
60
  img_data = channel_data['image']
61
- channel.image = RSS__Image( url = img_data.get('url' , '' ),
62
- title = img_data.get('title' , '' ),
63
- link = img_data.get('link' , '' ),
64
- width = int(img_data.get('width' , 0 )),
65
- height = int(img_data.get('height', 0 )))
61
+ if img_data:
62
+ channel.image = RSS__Image( url = img_data.get('url' , '' ),
63
+ title = img_data.get('title' , '' ),
64
+ link = img_data.get('link' , '' ),
65
+ width = int(img_data.get('width' , 0 )),
66
+ height = int(img_data.get('height', 0 )))
66
67
 
67
68
  known_channel_fields = {'title', 'link', 'description', 'language', # Move non-standard channel elements to extensions
68
69
  'lastBuildDate', 'image', 'item', 'updateFrequency', 'updatePeriod'}
@@ -29,4 +29,9 @@ class Type_Safe__Set(Type_Safe__Base, set):
29
29
  result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
30
30
  else:
31
31
  result.append(item)
32
- return result
32
+ return result
33
+
34
+ def __eq__(self, other): # todo: see if this is needed
35
+ if isinstance(other, (set, Type_Safe__Set)):
36
+ return set(self) == set(other)
37
+ return False
@@ -1,3 +1,5 @@
1
+ from typing import Any
2
+
1
3
 
2
4
  def bytes_to_json_loads(data):
3
5
  import json
@@ -21,6 +23,38 @@ def json_dumps(python_object, indent=4, pretty=True, sort_keys=False, default=st
21
23
  def json_dumps_to_bytes(*args, **kwargs):
22
24
  return json_dumps(*args, **kwargs).encode()
23
25
 
26
+ def json__type_key(obj: Any) -> tuple:
27
+ if obj is None : return (0, None)
28
+ if isinstance(obj, bool) : return (1, obj)
29
+ if isinstance(obj, int) : return (2, obj)
30
+ if isinstance(obj, float) : return (3, obj)
31
+ if isinstance(obj, str) : return (4, obj)
32
+ if isinstance(obj, (list, set, tuple)): return (5, tuple(sorted(json__type_key(x) for x in obj)))
33
+ if isinstance(obj, dict) : return (6, tuple(sorted((k, json__type_key(v)) for k,v in obj.items())))
34
+ return (7, str(obj)) # Fallback for unknown types
35
+
36
+ def json__equals__list_and_set(value_1: Any, value_2: Any) -> bool:
37
+ if isinstance(value_1, (list, set)) or isinstance(value_2, (list, set)):
38
+ list_1 = list(value_1)
39
+ list_2 = list(value_2)
40
+
41
+ if len(list_1) != len(list_2): # Quick length check
42
+ return False
43
+
44
+ sorted_1 = sorted(list_1, key=json__type_key)
45
+ sorted_2 = sorted(list_2, key=json__type_key)
46
+
47
+ return all(json__equals__list_and_set(a, b)
48
+ for a, b in zip(sorted_1, sorted_2))
49
+
50
+ if isinstance(value_1, dict) and isinstance(value_2, dict):
51
+ if value_1.keys() != value_2.keys(): # Check keys match
52
+ return False
53
+ return all(json__equals__list_and_set(value_1[key], value_2[key]) # Recursively compare values
54
+ for key in value_1.keys())
55
+
56
+ return value_1 == value_2
57
+
24
58
  def json_lines_file_load(target_path):
25
59
  from osbot_utils.utils.Files import file_lines
26
60
 
File without changes
@@ -0,0 +1 @@
1
+ v2.20.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.18.0"
3
+ version = "v2.20.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,12 +0,0 @@
1
- from osbot_utils.type_safe.Type_Safe import Type_Safe
2
-
3
-
4
- class Flow_Run__Config(Type_Safe):
5
- add_task_to_self : bool = True
6
- log_to_console : bool = False
7
- log_to_memory : bool = True
8
- logging_enabled : bool = True
9
- print_logs : bool = False
10
- print_none_return_value: bool = False
11
- print_finished_message : bool = False
12
-
@@ -1 +0,0 @@
1
- v2.18.0
File without changes