osbot-utils 1.88.0__tar.gz → 1.89.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 (326) hide show
  1. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/README.md +1 -1
  3. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/base_classes/Type_Safe.py +24 -8
  4. osbot_utils-1.88.0/osbot_utils/base_classes/Type_Safe__List.py → osbot_utils-1.89.0/osbot_utils/base_classes/Type_Safe__Base.py +2 -18
  5. osbot_utils-1.89.0/osbot_utils/base_classes/Type_Safe__Dict.py +22 -0
  6. osbot_utils-1.89.0/osbot_utils/base_classes/Type_Safe__List.py +22 -0
  7. osbot_utils-1.89.0/osbot_utils/helpers/Xml_To_Dict.py +87 -0
  8. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Objects.py +7 -4
  9. osbot_utils-1.89.0/osbot_utils/version +1 -0
  10. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/pyproject.toml +1 -1
  11. osbot_utils-1.88.0/osbot_utils/version +0 -1
  12. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/LICENSE +0 -0
  13. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/__init__.py +0 -0
  14. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  15. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  16. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  17. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/base_classes/__init__.py +0 -0
  18. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/context_managers/__init__.py +0 -0
  19. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  20. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  21. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  22. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/context_managers/print_duration.py +0 -0
  23. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/__init__.py +0 -0
  24. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  25. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  26. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  27. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  28. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  29. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  30. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  31. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/cache.py +0 -0
  32. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  33. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  34. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  35. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  36. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  37. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/catch.py +0 -0
  38. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/context.py +0 -0
  39. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  40. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  41. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  42. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  43. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  44. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/decorators/methods/type_safe.py +0 -0
  45. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  46. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  47. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/fluent/__init__.py +0 -0
  48. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/__init__.py +0 -0
  49. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  50. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  51. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  52. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  53. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  54. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  55. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  56. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  57. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  58. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  59. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  60. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  61. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  62. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  63. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  64. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  65. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  66. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  67. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  68. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  69. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  70. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/CFormat.py +0 -0
  71. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/CPrint.py +0 -0
  72. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  73. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  74. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Guid.py +0 -0
  75. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  76. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  77. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  78. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Print_Table.py +0 -0
  79. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  80. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  81. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  82. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  83. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Safe_Id.py +0 -0
  84. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  85. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  86. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  87. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Type_Safe_Method.py +0 -0
  88. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  89. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/__init__.py +0 -0
  90. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  91. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  92. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  93. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  94. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  95. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  96. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  97. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  98. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  99. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  100. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  101. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  102. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  103. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  104. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  105. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  106. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  107. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  108. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  109. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  110. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  111. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  112. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  113. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  114. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  115. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  116. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  117. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  118. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  119. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  120. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  121. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  122. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  123. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  124. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  125. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  126. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  127. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  128. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  129. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  130. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  131. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  132. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  133. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  134. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  135. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  136. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  137. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  138. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  139. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  140. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  141. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  142. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  143. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  144. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  145. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  146. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  147. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  148. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  149. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  150. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  151. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  152. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  153. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  154. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  155. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  156. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  157. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  158. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  159. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  160. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  161. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  162. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  163. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  164. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  165. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  166. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  167. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  168. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  169. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  170. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  171. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  172. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  173. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  174. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  175. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/Flow__Events.py +0 -0
  176. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/Task.py +0 -0
  177. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  178. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  179. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  180. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  181. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  182. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  183. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  184. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  185. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  186. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  187. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  188. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  189. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  190. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  191. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  192. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  193. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  194. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  195. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  196. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  197. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  198. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  199. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  200. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  201. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  202. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  203. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  204. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  205. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/html/__init__.py +0 -0
  206. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  207. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  208. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  209. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  210. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  211. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  212. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  213. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  214. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  215. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  216. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  217. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  218. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  219. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  220. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  221. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  222. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  223. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  224. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  225. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  226. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  227. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  228. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  229. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  230. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  231. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  232. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  233. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  234. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  235. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  236. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  237. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  238. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  239. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  240. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  241. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  242. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  243. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  244. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  245. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  246. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  247. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  248. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  249. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  250. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  251. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  252. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  253. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  254. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  255. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  256. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  257. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  258. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  259. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  260. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  261. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  262. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  263. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  264. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  265. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  266. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  267. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  268. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  269. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  270. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  271. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  272. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  273. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  274. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  275. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  276. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  277. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  278. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  279. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  280. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Catch.py +0 -0
  281. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  282. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Duration.py +0 -0
  283. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Hook_Method.py +0 -0
  284. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  285. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Log_To_String.py +0 -0
  286. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Logging.py +0 -0
  287. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Patch_Print.py +0 -0
  288. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Profiler.py +0 -0
  289. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Pytest.py +0 -0
  290. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Stderr.py +0 -0
  291. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Stdout.py +0 -0
  292. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  293. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Temp_File.py +0 -0
  294. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  295. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  296. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  297. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  298. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  299. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Unit_Test.py +0 -0
  300. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/Unzip_File.py +0 -0
  301. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/testing/__init__.py +0 -0
  302. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Assert.py +0 -0
  303. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Call_Stack.py +0 -0
  304. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Csv.py +0 -0
  305. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Dev.py +0 -0
  306. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Env.py +0 -0
  307. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Exceptions.py +0 -0
  308. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Files.py +0 -0
  309. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Functions.py +0 -0
  310. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Http.py +0 -0
  311. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Int.py +0 -0
  312. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Json.py +0 -0
  313. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Json_Cache.py +0 -0
  314. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Lists.py +0 -0
  315. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Misc.py +0 -0
  316. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Png.py +0 -0
  317. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Process.py +0 -0
  318. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Python_Logger.py +0 -0
  319. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Regex.py +0 -0
  320. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Status.py +0 -0
  321. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Str.py +0 -0
  322. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Threads.py +0 -0
  323. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Toml.py +0 -0
  324. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Version.py +0 -0
  325. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/Zip.py +0 -0
  326. {osbot_utils-1.88.0 → osbot_utils-1.89.0}/osbot_utils/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.88.0
3
+ Version: 1.89.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -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-v1.88.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v1.89.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-v1.88.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.89.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,7 +3,7 @@
3
3
 
4
4
  import sys
5
5
  import types
6
- from osbot_utils.utils.Objects import default_value # todo: remove test mocking requirement for this to be here (instead of on the respective method)
6
+ from osbot_utils.utils.Objects import default_value # todo: remove test mocking requirement for this to be here (instead of on the respective method)
7
7
 
8
8
  # Backport implementations of get_origin and get_args for Python 3.7
9
9
  if sys.version_info < (3, 8): # pragma: no cover
@@ -23,7 +23,7 @@ if sys.version_info < (3, 8): # pragma
23
23
  else:
24
24
  return ()
25
25
  else:
26
- from typing import get_origin, get_args
26
+ from typing import get_origin, get_args, ForwardRef
27
27
 
28
28
  if sys.version_info >= (3, 10):
29
29
  NoneType = types.NoneType
@@ -148,6 +148,7 @@ class Type_Safe:
148
148
  def __default__value__(cls, var_type):
149
149
  import typing
150
150
  from osbot_utils.base_classes.Type_Safe__List import Type_Safe__List
151
+ from osbot_utils.base_classes.Type_Safe__Dict import Type_Safe__Dict
151
152
 
152
153
  if var_type is typing.Set: # todo: refactor the dict, set and list logic, since they are 90% the same
153
154
  return set()
@@ -156,13 +157,28 @@ class Type_Safe:
156
157
 
157
158
  if var_type is typing.Dict:
158
159
  return {}
159
- if get_origin(var_type) is dict:
160
- return {} # todo: add Type_Safe__Dict
160
+
161
+ if get_origin(var_type) is dict: # e.g. Dict[key_type, value_type]
162
+ key_type, value_type = get_args(var_type)
163
+ if isinstance(key_type, ForwardRef): # Handle forward references on key_type ---
164
+ forward_name = key_type.__forward_arg__
165
+ if forward_name == cls.__name__:
166
+ key_type = cls
167
+ if isinstance(value_type, ForwardRef): # Handle forward references on value_type ---
168
+ forward_name = value_type.__forward_arg__
169
+ if forward_name == cls.__name__:
170
+ value_type = cls
171
+ return Type_Safe__Dict(expected_key_type=key_type, expected_value_type=value_type)
161
172
 
162
173
  if var_type is typing.List:
163
- return [] # handle case when List was used with no type information provided
174
+ return [] # handle case when List was used with no type information provided
175
+
164
176
  if get_origin(var_type) is list: # if we have list defined as list[type]
165
177
  item_type = get_args(var_type)[0] # get the type that was defined
178
+ if isinstance(item_type, ForwardRef): # handle the case when the type is a forward reference
179
+ forward_name = item_type.__forward_arg__
180
+ if forward_name == cls.__name__: # if the forward reference is to the current class (simple name check)
181
+ item_type = cls # set the item_type to the current class
166
182
  return Type_Safe__List(expected_type=item_type) # and used it as expected_type in Type_Safe__List
167
183
  else:
168
184
  return default_value(var_type) # for all other cases call default_value, which will try to create a default instance
@@ -258,16 +274,16 @@ class Type_Safe:
258
274
  return self
259
275
 
260
276
  def deserialize_dict__using_key_value_annotations(self, key, value):
277
+ from osbot_utils.base_classes.Type_Safe__Dict import Type_Safe__Dict
278
+
261
279
  dict_annotations_tuple = get_args(self.__annotations__[key])
262
280
  if not dict_annotations_tuple: # happens when the value is a dict/Dict with no annotations
263
281
  return value
264
282
  if not type(value) is dict:
265
283
  return value
266
- #key_class = get_args(self.__annotations__[key])[0]
267
- #value_class = get_args(self.__annotations__[key])[1]
268
284
  key_class = dict_annotations_tuple[0]
269
285
  value_class = dict_annotations_tuple[1]
270
- new_value = {}
286
+ new_value = Type_Safe__Dict(expected_key_type=key_class, expected_value_type=value_class)
271
287
 
272
288
  for dict_key, dict_value in value.items():
273
289
  if issubclass(key_class, Type_Safe):
@@ -2,23 +2,7 @@ from typing import get_origin, get_args, Union, Optional, Any, ForwardRef
2
2
 
3
3
  EXACT_TYPE_MATCH = (int, float, str, bytes, bool, complex)
4
4
 
5
- class Type_Safe__List(list):
6
-
7
- def __init__(self, expected_type, *args):
8
- super().__init__(*args)
9
- self.expected_type = expected_type
10
-
11
- def __repr__(self):
12
- expected_type_name = type_str(self.expected_type)
13
- return f"list[{expected_type_name}] with {len(self)} elements"
14
-
15
- def append(self, item):
16
- try:
17
- self.is_instance_of_type(item, self.expected_type)
18
- except TypeError as e:
19
- raise TypeError(f"In Type_Safe__List: Invalid type for item: {e}")
20
- super().append(item)
21
-
5
+ class Type_Safe__Base:
22
6
  def is_instance_of_type(self, item, expected_type):
23
7
  if expected_type is Any:
24
8
  return True
@@ -130,4 +114,4 @@ def get_object_type_str(obj):
130
114
  elem_type_str = ', '.join(sorted(elem_types))
131
115
  return f"List[{elem_type_str}]"
132
116
  else:
133
- return type(obj).__name__
117
+ return type(obj).__name__
@@ -0,0 +1,22 @@
1
+ from osbot_utils.base_classes.Type_Safe__Base import type_str, Type_Safe__Base
2
+
3
+ class Type_Safe__Dict(Type_Safe__Base, dict):
4
+ def __init__(self, expected_key_type, expected_value_type, *args, **kwargs):
5
+ super().__init__(*args, **kwargs)
6
+
7
+ self.expected_key_type = expected_key_type
8
+ self.expected_value_type = expected_value_type
9
+
10
+ for k, v in self.items(): # check type-safety of ctor arguments
11
+ self.is_instance_of_type(k, self.expected_key_type )
12
+ self.is_instance_of_type(v, self.expected_value_type)
13
+
14
+ def __setitem__(self, key, value): # Check type-safety before allowing assignment.
15
+ self.is_instance_of_type(key, self.expected_key_type)
16
+ self.is_instance_of_type(value, self.expected_value_type)
17
+ super().__setitem__(key, value)
18
+
19
+ def __repr__(self):
20
+ key_type_name = type_str(self.expected_key_type)
21
+ value_type_name = type_str(self.expected_value_type)
22
+ return f"dict[{key_type_name}, {value_type_name}] with {len(self)} entries"
@@ -0,0 +1,22 @@
1
+ from osbot_utils.base_classes.Type_Safe__Base import Type_Safe__Base, type_str
2
+
3
+
4
+ class Type_Safe__List(Type_Safe__Base, list):
5
+
6
+ def __init__(self, expected_type, *args):
7
+ super().__init__(*args)
8
+ self.expected_type = expected_type
9
+
10
+ def __repr__(self):
11
+ expected_type_name = type_str(self.expected_type)
12
+ return f"list[{expected_type_name}] with {len(self)} elements"
13
+
14
+ def append(self, item):
15
+ try:
16
+ self.is_instance_of_type(item, self.expected_type)
17
+ except TypeError as e:
18
+ raise TypeError(f"In Type_Safe__List: Invalid type for item: {e}")
19
+ super().append(item)
20
+
21
+
22
+
@@ -0,0 +1,87 @@
1
+ from typing import Dict, Any, Union
2
+ from xml.etree.ElementTree import Element
3
+
4
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
5
+
6
+ class XML_Attribute(Type_Safe):
7
+ name : str
8
+ value : str
9
+ namespace: str
10
+
11
+ class XML_Element(Type_Safe):
12
+ attributes: Dict[str, XML_Attribute]
13
+ children : Dict[str, Union[str, 'XML_Element']]
14
+
15
+
16
+ class Xml_To_Dict(Type_Safe):
17
+ xml_data : str = None # Input XML string
18
+ root : Element = None # Root ElementTree.Element
19
+ namespaces : Dict[str, str] # XML namespaces
20
+ xml_dict : Dict[str, Any] # Parsed XML as dictionary
21
+
22
+ def setup(self) :
23
+ from xml.etree.ElementTree import ParseError
24
+ try:
25
+ self.load_namespaces()
26
+ self.load_root()
27
+
28
+ except ParseError as e:
29
+ raise ValueError(f"Invalid XML: {str(e)}")
30
+ return self
31
+
32
+
33
+ def load_namespaces(self):
34
+ from xml.etree.ElementTree import iterparse
35
+ from io import StringIO
36
+
37
+ for event, elem in iterparse(StringIO(self.xml_data), events=("start-ns",)):
38
+ self.namespaces[elem[0]] = elem[1]
39
+
40
+ def load_root(self):
41
+ from xml.etree.ElementTree import fromstring
42
+
43
+ self.root = fromstring(self.xml_data)
44
+
45
+ def element_to_dict(self, element: Element) -> Union[Dict[str, Any], str]:
46
+ """Convert an ElementTree.Element to a dictionary"""
47
+ result: Dict[str, Any] = {}
48
+
49
+
50
+ if element.attrib: # Handle attributes
51
+ result.update(element.attrib)
52
+
53
+ # Handle child elements
54
+ child_nodes: Dict[str, Any] = {}
55
+ for child in element:
56
+ tag = child.tag # Remove namespace prefix if present
57
+ if '}' in tag:
58
+ tag = tag.split('}', 1)[1]
59
+
60
+ child_data = self.element_to_dict(child)
61
+
62
+ if tag in child_nodes:
63
+ if not isinstance(child_nodes[tag], list):
64
+ child_nodes[tag] = [child_nodes[tag]]
65
+ child_nodes[tag].append(child_data)
66
+ else:
67
+ child_nodes[tag] = child_data
68
+
69
+ # Handle text content
70
+ text = element.text.strip() if element.text else ''
71
+ if text:
72
+ if child_nodes or result:
73
+ result['_text'] = text
74
+ else:
75
+ return text
76
+ elif not child_nodes and not result: # Make sure we return text content even for empty nodes
77
+ return text
78
+
79
+ # Combine results
80
+ if child_nodes:
81
+ result.update(child_nodes)
82
+
83
+ return result
84
+
85
+ def parse(self) -> Dict[str, Any]: # Convert parsed XML to dictionary
86
+ self.xml_dict = self.element_to_dict(self.root)
87
+ return self
@@ -30,14 +30,17 @@ def are_types_compatible_for_assigment(source_type, target_type):
30
30
  import types
31
31
  import typing
32
32
 
33
+ if isinstance(target_type, str): # If the "target_type" is a forward reference (string), handle it here.
34
+ if target_type == source_type.__name__: # Simple check: does the string match the actual class name
35
+ return True
33
36
  if source_type is target_type:
34
37
  return True
35
38
  if source_type is int and target_type is float:
36
39
  return True
37
- if target_type in source_type.__mro__: # this means that the source_type has the target_type has of its base types
40
+ if target_type in source_type.__mro__: # this means that the source_type has the target_type has of its base types
38
41
  return True
39
- if target_type is callable: # handle case where callable was used as the target type
40
- if source_type is types.MethodType: # and a method or function was used as the source type
42
+ if target_type is callable: # handle case where callable was used as the target type
43
+ if source_type is types.MethodType: # and a method or function was used as the source type
41
44
  return True
42
45
  if source_type is types.FunctionType:
43
46
  return True
@@ -413,7 +416,7 @@ def value_type_matches_obj_annotation_for_attr(target, attr_name, value):
413
416
  origin_attr_type = get_origin(attr_type) # to handle when type definion contains an generic
414
417
  if origin_attr_type is typing.Union:
415
418
  args = get_args(attr_type)
416
- if len(args)==2 and args[1] is type(None): # todo: find a better way to do this, since this is handling an edge case when origin_attr_type is Optional (whcih is an shorthand for Union[X, None] )
419
+ if len(args)==2 and args[1] is type(None): # todo: find a better way to do this, since this is handling an edge case when origin_attr_type is Optional (which is an shorthand for Union[X, None] )
417
420
  attr_type = args[0]
418
421
  origin_attr_type = get_origin(attr_type)
419
422
 
@@ -0,0 +1 @@
1
+ v1.89.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.88.0"
3
+ version = "v1.89.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1 +0,0 @@
1
- v1.88.0
File without changes