osbot-utils 2.2.0__tar.gz → 2.4.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 (325) hide show
  1. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/PKG-INFO +2 -2
  2. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/README.md +1 -1
  3. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Guid.py +0 -1
  4. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/Type_Safe.py +10 -2
  5. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/Type_Safe_Method.py +12 -4
  6. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Objects.py +18 -3
  7. osbot_utils-2.4.0/osbot_utils/utils/__init__.py +0 -0
  8. osbot_utils-2.4.0/osbot_utils/version +1 -0
  9. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/pyproject.toml +1 -1
  10. osbot_utils-2.2.0/osbot_utils/version +0 -1
  11. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/LICENSE +0 -0
  12. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/__init__.py +0 -0
  13. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  14. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  15. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  16. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/base_classes/__init__.py +0 -0
  17. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/context_managers/__init__.py +0 -0
  18. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  19. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  20. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  21. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/context_managers/print_duration.py +0 -0
  22. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/__init__.py +0 -0
  23. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  24. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  25. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  26. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  27. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  28. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  29. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  30. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/cache.py +0 -0
  31. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  32. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  33. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  34. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  35. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  36. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/catch.py +0 -0
  37. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/context.py +0 -0
  38. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  39. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  40. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  41. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  42. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  43. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  44. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  45. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/fluent/__init__.py +0 -0
  46. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/CFormat.py +0 -0
  47. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/CPrint.py +0 -0
  48. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  49. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  50. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  51. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  52. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  53. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Print_Table.py +0 -0
  54. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  55. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  56. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  57. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  58. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Safe_Id.py +0 -0
  59. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  60. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  61. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  62. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  63. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/__init__.py +0 -0
  64. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  65. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  66. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  67. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  68. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  69. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  70. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  71. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  72. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  73. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  74. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  75. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  76. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  77. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  78. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  79. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  80. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  81. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  82. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  83. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  84. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  85. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  86. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  87. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  88. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  89. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  90. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  91. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  92. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  93. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  94. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  95. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  96. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  97. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  98. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  99. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  100. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  101. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  102. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  103. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  104. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  105. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  106. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  107. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  108. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  109. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  110. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  111. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  112. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  113. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  114. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  115. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  116. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  117. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  118. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  119. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  120. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  121. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  122. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  123. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  124. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  125. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  126. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  127. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  128. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  129. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  130. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  131. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  132. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  133. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  134. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  135. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  136. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  137. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  138. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  139. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  140. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  141. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  142. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  143. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  144. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  145. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  146. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  147. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  148. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  149. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/Flow__Events.py +0 -0
  150. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/Task.py +0 -0
  151. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  152. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  153. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  154. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  155. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  156. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  157. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  158. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  159. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  160. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  161. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  162. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  163. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  164. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  165. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  166. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  167. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  168. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  169. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  170. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  171. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  172. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  173. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  174. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  175. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  176. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  177. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  178. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  179. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/html/__init__.py +0 -0
  180. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  181. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  182. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  183. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  184. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  185. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  186. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  187. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  188. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  189. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  190. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  191. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  192. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  193. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  194. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  195. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/python_compatibility/__init__.py +0 -0
  196. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  197. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  198. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  199. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  200. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  201. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  202. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  203. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  204. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  205. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  206. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  207. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  208. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  209. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  210. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  211. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  212. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  213. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  214. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  215. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  216. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  217. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  218. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  219. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  220. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  221. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  222. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  223. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  224. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  225. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  226. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  227. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  228. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  229. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  230. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  231. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  232. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  233. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  234. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  235. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  236. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  237. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  238. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  239. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  240. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  241. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  242. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  243. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  244. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  245. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  246. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  247. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  248. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  249. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  250. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  251. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  252. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  253. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  254. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  255. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  256. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  257. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  258. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  259. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  260. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  261. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/__init__.py +0 -0
  262. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  263. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  264. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  265. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  266. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  267. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  268. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Catch.py +0 -0
  269. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  270. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Duration.py +0 -0
  271. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Hook_Method.py +0 -0
  272. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  273. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Log_To_String.py +0 -0
  274. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Logging.py +0 -0
  275. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Patch_Print.py +0 -0
  276. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Profiler.py +0 -0
  277. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Pytest.py +0 -0
  278. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Stderr.py +0 -0
  279. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Stdout.py +0 -0
  280. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  281. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Temp_File.py +0 -0
  282. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  283. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  284. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  285. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  286. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  287. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Unit_Test.py +0 -0
  288. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/Unzip_File.py +0 -0
  289. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/testing/__init__.py +0 -0
  290. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  291. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/Type_Safe__Dict.py +0 -0
  292. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/Type_Safe__List.py +0 -0
  293. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/Type_Safe__Validator.py +0 -0
  294. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/__init__.py +0 -0
  295. {osbot_utils-2.2.0/osbot_utils/type_safe/validators → osbot_utils-2.4.0/osbot_utils/type_safe/decorators}/__init__.py +0 -0
  296. {osbot_utils-2.2.0/osbot_utils/decorators/methods → osbot_utils-2.4.0/osbot_utils/type_safe/decorators}/type_safe.py +0 -0
  297. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  298. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  299. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  300. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  301. {osbot_utils-2.2.0/osbot_utils/utils → osbot_utils-2.4.0/osbot_utils/type_safe/validators}/__init__.py +0 -0
  302. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Assert.py +0 -0
  303. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Call_Stack.py +0 -0
  304. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Csv.py +0 -0
  305. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Dev.py +0 -0
  306. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Env.py +0 -0
  307. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Exceptions.py +0 -0
  308. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Files.py +0 -0
  309. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Functions.py +0 -0
  310. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Http.py +0 -0
  311. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Int.py +0 -0
  312. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Json.py +0 -0
  313. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Json_Cache.py +0 -0
  314. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Lists.py +0 -0
  315. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Misc.py +0 -0
  316. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Png.py +0 -0
  317. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Process.py +0 -0
  318. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Python_Logger.py +0 -0
  319. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Regex.py +0 -0
  320. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Status.py +0 -0
  321. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Str.py +0 -0
  322. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Threads.py +0 -0
  323. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Toml.py +0 -0
  324. {osbot_utils-2.2.0 → osbot_utils-2.4.0}/osbot_utils/utils/Version.py +0 -0
  325. {osbot_utils-2.2.0 → osbot_utils-2.4.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.2.0
3
+ Version: 2.4.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-v2.2.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v2.4.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.2.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v2.4.0-blue)
6
6
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
7
7
 
8
8
 
@@ -1,5 +1,4 @@
1
1
  import uuid
2
-
3
2
  from osbot_utils.utils.Misc import is_guid
4
3
 
5
4
  GUID__NAMESPACE = uuid.UUID('2cfec064-537a-4ff7-8fdc-2fc9e2606f3d')
@@ -142,7 +142,7 @@ class Type_Safe:
142
142
  from enum import EnumMeta
143
143
  from osbot_utils.utils.Objects import obj_is_type_union_compatible
144
144
 
145
- IMMUTABLE_TYPES = (bool, int, float, complex, str, tuple, frozenset, bytes, NoneType, EnumMeta)
145
+ IMMUTABLE_TYPES = (bool, int, float, complex, str, tuple, frozenset, bytes, NoneType, EnumMeta, type)
146
146
 
147
147
 
148
148
  kwargs = {}
@@ -172,7 +172,15 @@ class Type_Safe:
172
172
  if var_value is not None: # allow None assignments on ctor since that is a valid use case
173
173
  if get_origin(var_type) is Annotated:
174
174
  continue
175
- if var_type and not isinstance(var_value, var_type): # check type
175
+ if get_origin(var_type) is type: # Special handling for Type[T]
176
+ if not isinstance(var_value, type):
177
+ exception_message = f"variable '{var_name}' is defined as Type[T] but has value '{var_value}' which is not a type"
178
+ raise ValueError(exception_message)
179
+ type_arg = get_args(var_type)[0]
180
+ if not issubclass(var_value, type_arg):
181
+ exception_message = f"variable '{var_name}' is defined as {var_type} but value {var_value} is not a subclass of {type_arg}"
182
+ raise ValueError(exception_message)
183
+ elif var_type and not isinstance(var_value, var_type): # check type
176
184
  exception_message = f"variable '{var_name}' is defined as type '{var_type}' but has value '{var_value}' of type '{type(var_value)}'"
177
185
  raise ValueError(exception_message)
178
186
  if var_type not in IMMUTABLE_TYPES and var_name.startswith('__') is False: # if var_type is not one of the IMMUTABLE_TYPES or is an __ internal
@@ -1,15 +1,22 @@
1
1
  import inspect # For function introspection
2
2
  from enum import Enum
3
- from typing import get_args, get_origin, Optional, Union, List, Any, Dict # For type hinting utilities
3
+ from typing import get_args, get_origin, Union, List, Any # For type hinting utilities
4
4
 
5
5
 
6
6
  class Type_Safe_Method: # Class to handle method type safety validation
7
7
  def __init__(self, func): # Initialize with function
8
8
  self.func = func # Store original function
9
9
  self.sig = inspect.signature(func) # Get function signature
10
- self.annotations = func.__annotations__ # Get type annotations
10
+ self.annotations = func.__annotations__ # Get function annotations
11
+
12
+ def check_for_any_use(self):
13
+ for param_name, type_hint in self.annotations.items():
14
+ if type_hint is any: # Detect incorrect usage of lowercase any
15
+ raise ValueError(f"Parameter '{param_name}' uses lowercase 'any' instead of 'Any' from typing module. "
16
+ f"Please use 'from typing import Any' and annotate as '{param_name}: Any'")
11
17
 
12
18
  def handle_type_safety(self, args: tuple, kwargs: dict): # Main method to handle type safety
19
+ self.check_for_any_use()
13
20
  bound_args = self.bind_args(args, kwargs) # Bind arguments to parameters
14
21
  for param_name, param_value in bound_args.arguments.items(): # Iterate through arguments
15
22
  if param_name != 'self': # Skip self parameter
@@ -107,5 +114,6 @@ class Type_Safe_Method:
107
114
 
108
115
  def validate_direct_type(self, param_name: str, # Validate direct type match
109
116
  param_value: Any, expected_type: Any): # Type parameters
110
- if not isinstance(param_value, expected_type): # Check type match
111
- raise ValueError(f"Parameter '{param_name}' expected type {expected_type}, but got {type(param_value)}") # Raise error if no match
117
+ if expected_type is not Any:
118
+ if not isinstance(param_value, expected_type): # Check type match
119
+ raise ValueError(f"Parameter '{param_name}' expected type {expected_type}, but got {type(param_value)}") # Raise error if no match
@@ -25,7 +25,7 @@ if sys.version_info < (3, 8):
25
25
  else:
26
26
  return ()
27
27
  else:
28
- from typing import get_origin, get_args, List, Tuple, Dict
28
+ from typing import get_origin, get_args, List, Tuple, Dict, Type, _GenericAlias
29
29
 
30
30
 
31
31
  def are_types_compatible_for_assigment(source_type, target_type):
@@ -128,6 +128,16 @@ def convert_to_value_from_obj_annotation(target, attr_name, value):
128
128
  if hasattr(obj_annotations,'get'):
129
129
  attribute_annotation = obj_annotations.get(attr_name)
130
130
  if attribute_annotation:
131
+ origin = get_origin(attribute_annotation) # Add handling for Type[T] annotations
132
+ if origin is type and isinstance(value, str):
133
+ try: # Convert string path to actual type
134
+ if len(value.rsplit('.', 1)) > 1:
135
+ module_name, class_name = value.rsplit('.', 1)
136
+ module = __import__(module_name, fromlist=[class_name])
137
+ return getattr(module, class_name)
138
+ except (ValueError, ImportError, AttributeError) as e:
139
+ raise ValueError(f"Could not convert '{value}' to type: {str(e)}")
140
+
131
141
  if attribute_annotation in TYPE_SAFE__CONVERT_VALUE__SUPPORTED_TYPES: # for now hard-coding this to just these types until we understand the side effects
132
142
  return attribute_annotation(value)
133
143
  return value
@@ -373,6 +383,8 @@ def obj_is_type_union_compatible(var_type, compatible_types):
373
383
  from typing import Union
374
384
 
375
385
  origin = get_origin(var_type)
386
+ if isinstance(var_type, _GenericAlias) and origin is type: # Add handling for Type[T]
387
+ return type in compatible_types # Allow if 'type' is in compatible types
376
388
  if origin is Union: # For Union types, including Optionals
377
389
  args = get_args(var_type) # Get the argument types
378
390
  for arg in args: # Iterate through each argument in the Union
@@ -454,8 +466,11 @@ def value_type_matches_obj_annotation_for_attr(target, attr_name, value):
454
466
  annotations = all_annotations(target)
455
467
  attr_type = annotations.get(attr_name)
456
468
  if attr_type:
457
- origin_attr_type = get_origin(attr_type) # to handle when type definition contains a generic
458
- if origin_attr_type is Annotated: # if the type is Annotated
469
+ origin_attr_type = get_origin(attr_type) # to handle when type definition contains a generic
470
+ if origin_attr_type is type: # Add handling for Type[T]
471
+ type_arg = get_args(attr_type)[0] # Get T from Type[T]
472
+ return isinstance(value, type) and issubclass(value, type_arg) # Check that value is a type and is subclass of type_arg
473
+ if origin_attr_type is Annotated: # if the type is Annotated
459
474
  args = get_args(attr_type)
460
475
  origin_attr_type = args[0]
461
476
 
File without changes
@@ -0,0 +1 @@
1
+ v2.4.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.2.0"
3
+ version = "v2.4.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
- v2.2.0
File without changes