osbot-utils 2.85.0__tar.gz → 2.87.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 (480) hide show
  1. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/PKG-INFO +2 -2
  2. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/README.md +1 -1
  3. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/Type_Safe.py +2 -2
  4. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/Type_Safe__Primitive.py +6 -1
  5. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid_Short.py +3 -3
  6. osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py +83 -0
  7. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py +2 -0
  8. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py +18 -3
  9. osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +74 -0
  10. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py +8 -4
  11. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py +17 -1
  12. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Objects.py +10 -6
  13. osbot_utils-2.87.0/osbot_utils/version +1 -0
  14. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/pyproject.toml +1 -1
  15. osbot_utils-2.85.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py +0 -55
  16. osbot_utils-2.85.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +0 -41
  17. osbot_utils-2.85.0/osbot_utils/version +0 -1
  18. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/LICENSE +0 -0
  19. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/__init__.py +0 -0
  20. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  21. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  22. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  23. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/base_classes/__init__.py +0 -0
  24. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/context_managers/__init__.py +0 -0
  25. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  26. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  27. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/__init__.py +0 -0
  28. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  29. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  30. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  31. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  32. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  33. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  34. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  35. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/cache.py +0 -0
  36. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  37. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  38. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  39. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  40. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  41. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/catch.py +0 -0
  42. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/context.py +0 -0
  43. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  44. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  45. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  46. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  47. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  48. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  49. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  50. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/fluent/__init__.py +0 -0
  51. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/CFormat.py +0 -0
  52. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/CPrint.py +0 -0
  53. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  54. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  55. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  56. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  57. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  58. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  59. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Print_Table.py +0 -0
  60. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  61. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  62. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  63. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  64. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  65. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/__init__.py +0 -0
  66. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  67. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  68. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  69. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  70. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  71. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  72. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  73. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  74. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  75. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  76. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  77. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  78. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  79. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  80. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  81. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  82. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  83. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  84. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  85. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  86. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  87. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  88. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  89. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  90. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  91. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  92. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  93. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  94. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  95. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  96. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  97. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  98. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  99. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  100. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  101. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  102. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  103. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  104. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  105. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  106. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  107. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  108. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  109. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  110. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  111. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  112. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  113. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  114. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  115. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  116. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  117. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  118. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  119. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  120. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  121. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  122. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  123. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  124. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  125. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  126. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  127. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  128. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  129. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  130. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  131. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  132. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  133. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  134. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  135. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  136. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  137. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  138. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  139. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  140. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  141. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  142. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_on_self/Cache_Controller.py +0 -0
  143. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_on_self/Cache_Key_Generator.py +0 -0
  144. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_on_self/Cache_Metrics.py +0 -0
  145. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_on_self/Cache_On_Self.py +0 -0
  146. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_on_self/Cache_Storage.py +0 -0
  147. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_on_self/__init__.py +0 -0
  148. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  149. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  150. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  151. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  152. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  153. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  154. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  155. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/Duration.py +0 -0
  156. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/__init__.py +0 -0
  157. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/decorators/__init__.py +0 -0
  158. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/decorators/capture_duration.py +0 -0
  159. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/decorators/duration.py +0 -0
  160. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/decorators/print_duration.py +0 -0
  161. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/schemas/Schema__Duration.py +0 -0
  162. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/duration/schemas/__init__.py +0 -0
  163. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  164. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/Task.py +0 -0
  165. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  166. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -0
  167. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
  168. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +0 -0
  169. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +0 -0
  170. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/actions/__init__.py +0 -0
  171. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  172. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  173. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  174. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  175. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  176. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  177. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  178. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
  179. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
  180. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  181. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
  182. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
  183. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
  184. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
  185. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
  186. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +0 -0
  187. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +0 -0
  188. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
  189. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +0 -0
  190. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/flows/schemas/__init__.py +0 -0
  191. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  192. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  193. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  194. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  195. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  196. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/__init__.py +0 -0
  197. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/schemas/Schema__Html_Document.py +0 -0
  198. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node.py +0 -0
  199. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data.py +0 -0
  200. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +0 -0
  201. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/schemas/__init__.py +0 -0
  202. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Base.py +0 -0
  203. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Body.py +0 -0
  204. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Div.py +0 -0
  205. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__H.py +0 -0
  206. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__HR.py +0 -0
  207. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Head.py +0 -0
  208. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Html.py +0 -0
  209. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Link.py +0 -0
  210. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Style.py +0 -0
  211. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/Tag__Text.py +0 -0
  212. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/tags/__init__.py +0 -0
  213. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/CSS_Dict__To__Css.py +0 -0
  214. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html.py +0 -0
  215. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Document.py +0 -0
  216. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Tags.py +0 -0
  217. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/Html_Document__To__Html_Dict.py +0 -0
  218. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Dict.py +0 -0
  219. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Document.py +0 -0
  220. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Tag.py +0 -0
  221. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/transformers/__init__.py +0 -0
  222. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/utils/Html__Query.py +0 -0
  223. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/html/utils/__init__.py +0 -0
  224. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/__init__.py +0 -0
  225. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/actions/LLM_Request__Execute.py +0 -0
  226. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py +0 -0
  227. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/actions/__init__.py +0 -0
  228. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder.py +0 -0
  229. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py +0 -0
  230. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/builders/LLM_Request__Factory.py +0 -0
  231. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/builders/__init__.py +0 -0
  232. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py +0 -0
  233. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache.py +0 -0
  234. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__File_System.py +0 -0
  235. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__Storage.py +0 -0
  236. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Local__Folder.py +0 -0
  237. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Sqlite.py +0 -0
  238. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/cache/__init__.py +0 -0
  239. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/platforms/__init__.py +0 -0
  240. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/platforms/open_ai/API__LLM__Open_AI.py +0 -0
  241. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/platforms/open_ai/__init__.py +0 -0
  242. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Safe_Str__LLM__Model_Name.py +0 -0
  243. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Cache__Index.py +0 -0
  244. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request.py +0 -0
  245. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Data.py +0 -0
  246. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Function_Call.py +0 -0
  247. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Content.py +0 -0
  248. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Role.py +0 -0
  249. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response.py +0 -0
  250. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response__Cache.py +0 -0
  251. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/llms/schemas/__init__.py +0 -0
  252. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  253. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  254. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  255. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  256. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  257. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  258. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  259. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  260. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  261. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  262. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  263. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  264. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  265. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  266. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  267. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/python_compatibility/__init__.py +0 -0
  268. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  269. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  270. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  271. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  272. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  273. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  274. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  275. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  276. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  277. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  278. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  279. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  280. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  281. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  282. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  283. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  284. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  285. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  286. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  287. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  288. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  289. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  290. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  291. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  292. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  293. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  294. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  295. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  296. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  297. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  298. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  299. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  300. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  301. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  302. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  303. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  304. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  305. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  306. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  307. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  308. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  309. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  310. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  311. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  312. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  313. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  314. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  315. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  316. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  317. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  318. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  319. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  320. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  321. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  322. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  323. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  324. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  325. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  326. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  327. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/transformers/Dict__To__Toml.py +0 -0
  328. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  329. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  330. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  331. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  332. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  333. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  334. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/__init__.py +0 -0
  335. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  336. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  337. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  338. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  339. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  340. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  341. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Catch.py +0 -0
  342. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  343. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Hook_Method.py +0 -0
  344. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  345. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Log_To_String.py +0 -0
  346. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Logging.py +0 -0
  347. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Patch_Print.py +0 -0
  348. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Profiler.py +0 -0
  349. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Pytest.py +0 -0
  350. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Stderr.py +0 -0
  351. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Stdout.py +0 -0
  352. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  353. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Temp_File.py +0 -0
  354. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  355. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  356. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  357. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  358. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  359. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Unit_Test.py +0 -0
  360. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/Unzip_File.py +0 -0
  361. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/__.py +0 -0
  362. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/__init__.py +0 -0
  363. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  364. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/performance/__init__.py +0 -0
  365. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  366. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  367. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/performance/models/__init__.py +0 -0
  368. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/test_data/__init__.py +0 -0
  369. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/testing/test_data/const__test__data__html.py +0 -0
  370. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  371. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/__init__.py +0 -0
  372. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/__init__.py +0 -0
  373. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float.py +0 -0
  374. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Engineering.py +0 -0
  375. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Money.py +0 -0
  376. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Percentage_Exact.py +0 -0
  377. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_float/__init__.py +0 -0
  378. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_int/Safe_Int.py +0 -0
  379. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_int/Timestamp_Now.py +0 -0
  380. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_int/__init__.py +0 -0
  381. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/Enum__Safe_Str__Regex_Mode.py +0 -0
  382. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/Safe_Str.py +0 -0
  383. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/__init__.py +0 -0
  384. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/__init__.py +0 -0
  385. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py +0 -0
  386. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py +0 -0
  387. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py +0 -0
  388. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/__init__.py +0 -0
  389. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py +0 -0
  390. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py +0 -0
  391. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Schema__NaCl__Keys.py +0 -0
  392. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/__init__.py +0 -0
  393. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py +0 -0
  394. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Path.py +0 -0
  395. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/__init__.py +0 -0
  396. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Branch.py +0 -0
  397. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py +0 -0
  398. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py +0 -0
  399. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Tag.py +0 -0
  400. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py +0 -0
  401. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/git/__init__.py +0 -0
  402. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py +0 -0
  403. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py +0 -0
  404. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py +0 -0
  405. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/github/__init__.py +0 -0
  406. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py +0 -0
  407. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__ETag.py +0 -0
  408. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Last_Modified.py +0 -0
  409. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Text.py +0 -0
  410. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/http/__init__.py +0 -0
  411. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Guid.py +0 -0
  412. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid.py +0 -0
  413. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Safe_Id.py +0 -0
  414. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/__init__.py +0 -0
  415. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text.py +0 -0
  416. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text__Dangerous.py +0 -0
  417. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/text/__init__.py +0 -0
  418. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Html.py +0 -0
  419. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__IP_Address.py +0 -0
  420. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Url.py +0 -0
  421. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_str/web/__init__.py +0 -0
  422. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt.py +0 -0
  423. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Byte.py +0 -0
  424. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__FileSize.py +0 -0
  425. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Percentage.py +0 -0
  426. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Port.py +0 -0
  427. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/primitives/safe_uint/__init__.py +0 -0
  428. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/__init__.py +0 -0
  429. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/collections/__init__.py +0 -0
  430. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/decorators/__init__.py +0 -0
  431. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/decorators/type_safe.py +0 -0
  432. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/methods/Type_Safe__Method.py +0 -0
  433. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/methods/__init__.py +0 -0
  434. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/methods/type_safe_property.py +0 -0
  435. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Annotations.py +0 -0
  436. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Cache.py +0 -0
  437. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Convert.py +0 -0
  438. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor.py +0 -0
  439. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
  440. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Not_Cached.py +0 -0
  441. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py +0 -0
  442. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Shared__Variables.py +0 -0
  443. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Validation.py +0 -0
  444. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/shared/__init__.py +0 -0
  445. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
  446. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  447. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Value.py +0 -0
  448. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Init.py +0 -0
  449. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/type_safe_core/steps/__init__.py +0 -0
  450. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  451. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  452. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  453. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  454. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  455. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/type_safe/validators/__init__.py +0 -0
  456. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Assert.py +0 -0
  457. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Call_Stack.py +0 -0
  458. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Csv.py +0 -0
  459. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Dev.py +0 -0
  460. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Env.py +0 -0
  461. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Exceptions.py +0 -0
  462. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Files.py +0 -0
  463. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Functions.py +0 -0
  464. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Http.py +0 -0
  465. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Int.py +0 -0
  466. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Json.py +0 -0
  467. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Json_Cache.py +0 -0
  468. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Lists.py +0 -0
  469. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Misc.py +0 -0
  470. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Png.py +0 -0
  471. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Process.py +0 -0
  472. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Python_Logger.py +0 -0
  473. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Regex.py +0 -0
  474. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Status.py +0 -0
  475. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Str.py +0 -0
  476. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Threads.py +0 -0
  477. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Toml.py +0 -0
  478. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Version.py +0 -0
  479. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/Zip.py +0 -0
  480. {osbot_utils-2.85.0 → osbot_utils-2.87.0}/osbot_utils/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: osbot_utils
3
- Version: 2.85.0
3
+ Version: 2.87.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  License: MIT
6
6
  Author: Dinis Cruz
@@ -21,7 +21,7 @@ Description-Content-Type: text/markdown
21
21
 
22
22
  # OSBot-Utils
23
23
 
24
- ![Current Release](https://img.shields.io/badge/release-v2.85.0-blue)
24
+ ![Current Release](https://img.shields.io/badge/release-v2.87.0-blue)
25
25
  ![Python](https://img.shields.io/badge/python-3.8+-green)
26
26
  ![Type-Safe](https://img.shields.io/badge/Type--Safe-✓-brightgreen)
27
27
  ![Caching](https://img.shields.io/badge/Caching-Built--In-orange)
@@ -1,6 +1,6 @@
1
1
  # OSBot-Utils
2
2
 
3
- ![Current Release](https://img.shields.io/badge/release-v2.85.0-blue)
3
+ ![Current Release](https://img.shields.io/badge/release-v2.87.0-blue)
4
4
  ![Python](https://img.shields.io/badge/python-3.8+-green)
5
5
  ![Type-Safe](https://img.shields.io/badge/Type--Safe-✓-brightgreen)
6
6
  ![Caching](https://img.shields.io/badge/Caching-Built--In-orange)
@@ -1,8 +1,8 @@
1
1
  # todo: find a way to add these documentations strings to a separate location so that
2
2
  # the data is available in IDE's code complete
3
- from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Validation import type_safe_validation
3
+ from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Validation import type_safe_validation
4
4
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Class_Kwargs import type_safe_step_class_kwargs
5
- from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Default_Kwargs import type_safe_step_default_kwargs
5
+ from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Default_Kwargs import type_safe_step_default_kwargs
6
6
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Default_Value import type_safe_step_default_value
7
7
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Init import type_safe_step_init
8
8
  from osbot_utils.type_safe.type_safe_core.steps.Type_Safe__Step__Set_Attr import type_safe_step_set_attr
@@ -67,4 +67,9 @@ class Type_Safe__Primitive:
67
67
  if self.__primitive_base__ is str:
68
68
  return f"{type(self).__name__}('{value_str}')"
69
69
  else:
70
- return f"{type(self).__name__}({value_str})"
70
+ return f"{type(self).__name__}({value_str})"
71
+
72
+ def __to_primitive__(self): # Convert this Type_Safe__Primitive instance to its base primitive type.
73
+ if self.__primitive_base__:
74
+ return self.__primitive_base__(self)
75
+ return str(self) # fallback
@@ -1,8 +1,8 @@
1
- # todo add to osbot utils
2
- from osbot_utils.utils.Misc import random_guid_short
1
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
2
+ from osbot_utils.utils.Misc import random_guid_short
3
3
 
4
4
 
5
- class Random_Guid_Short(str):
5
+ class Random_Guid_Short(Type_Safe__Primitive, str):
6
6
  def __new__(cls, value=None):
7
7
  if value is None:
8
8
  value = random_guid_short()
@@ -0,0 +1,83 @@
1
+ from typing import Type
2
+ from osbot_utils.testing.__ import __
3
+ from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
4
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
5
+ from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
6
+ from osbot_utils.utils.Objects import dict_to_obj
7
+
8
+
9
+ class Type_Safe__Dict(Type_Safe__Base, dict):
10
+ def __init__(self, expected_key_type, expected_value_type, *args, **kwargs):
11
+ super().__init__(*args, **kwargs)
12
+
13
+ self.expected_key_type = expected_key_type
14
+ self.expected_value_type = expected_value_type
15
+
16
+ def __getitem__(self, key):
17
+ try:
18
+ return super().__getitem__(key) # First try direct lookup
19
+ except KeyError:
20
+ converted_key = self.try_convert(key, self.expected_key_type) # Try converting the key
21
+ return super().__getitem__(converted_key) # and compare again
22
+
23
+ def __setitem__(self, key, value): # Check type-safety before allowing assignment.
24
+ key = self.try_convert(key , self.expected_key_type )
25
+ value = self.try_convert(value, self.expected_value_type)
26
+ self.is_instance_of_type(key , self.expected_key_type)
27
+ self.is_instance_of_type(value, self.expected_value_type)
28
+ super().__setitem__(key, value)
29
+
30
+ def __enter__(self): return self
31
+ def __exit__ (self, type, value, traceback): pass
32
+
33
+ def json(self):
34
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
35
+
36
+ def serialize_value(v):
37
+ """Recursively serialize values, handling nested structures"""
38
+ if isinstance(v, Type_Safe):
39
+ return v.json()
40
+ elif isinstance(v, Type_Safe__Primitive):
41
+ return v.__to_primitive__()
42
+ elif isinstance(v, dict):
43
+ # Recursively handle nested dictionaries
44
+ return {k2: serialize_value(v2) for k2, v2 in v.items()}
45
+ elif isinstance(v, (list, tuple, set)):
46
+ # Recursively handle sequences
47
+ serialized = [serialize_value(item) for item in v]
48
+ if isinstance(v, list):
49
+ return serialized
50
+ elif isinstance(v, tuple):
51
+ return tuple(serialized)
52
+ else: # set
53
+ return set(serialized)
54
+ else:
55
+ return v
56
+
57
+ result = {}
58
+ for key, value in self.items():
59
+ # Handle Type objects as keys
60
+ if isinstance(key, (type, Type)):
61
+ key = f"{key.__module__}.{key.__name__}"
62
+ elif isinstance(key, Type_Safe__Primitive):
63
+ key = key.__to_primitive__()
64
+
65
+ # Use recursive serialization for values
66
+ result[key] = serialize_value(value)
67
+
68
+ return result
69
+
70
+ def get(self, key, default=None): # this makes it consistent with the modified behaviour of __get__item
71
+ try:
72
+ return self[key] # Use __getitem__ with conversion
73
+ except KeyError:
74
+ return default # Return default instead of raising
75
+
76
+ def keys(self) -> Type_Safe__List:
77
+ return Type_Safe__List(self.expected_key_type, super().keys())
78
+
79
+ def obj(self) -> __:
80
+ return dict_to_obj(self.json())
81
+
82
+ def values(self) -> Type_Safe__List:
83
+ return Type_Safe__List(self.expected_value_type, super().values())
@@ -50,6 +50,8 @@ class Type_Safe__List(Type_Safe__Base, list):
50
50
  for item in self:
51
51
  if isinstance(item, Type_Safe):
52
52
  result.append(item.json())
53
+ elif isinstance(item, Type_Safe__Primitive):
54
+ result.append(item.__to_primitive__())
53
55
  elif isinstance(item, (list, tuple)):
54
56
  result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
55
57
  elif isinstance(item, dict):
@@ -1,4 +1,6 @@
1
- from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
1
+ from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
2
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
3
+
2
4
 
3
5
  class Type_Safe__Set(Type_Safe__Base, set):
4
6
  def __init__(self, expected_type, *args):
@@ -10,10 +12,21 @@ class Type_Safe__Set(Type_Safe__Base, set):
10
12
  return f"set[{expected_type_name}] with {len(self)} elements"
11
13
 
12
14
  def add(self, item):
13
- try:
15
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
16
+ if type(self.expected_type) is type and issubclass(self.expected_type, Type_Safe) and type(item) is dict: # Handle Type_Safe objects from dicts
17
+ item = self.expected_type.from_json(item)
18
+ elif type(self.expected_type) is type and issubclass(self.expected_type, Type_Safe__Primitive): # Handle Type_Safe__Primitive conversions (str -> Safe_Str, etc.)
19
+ if not isinstance(item, self.expected_type):
20
+ try:
21
+ item = self.expected_type(item)
22
+ except (ValueError, TypeError) as e:
23
+ raise TypeError(f"In Type_Safe__Set: Could not convert {type(item).__name__} to {self.expected_type.__name__}: {e}") from None
24
+
25
+ try: # Now validate the (possibly converted) item
14
26
  self.is_instance_of_type(item, self.expected_type)
15
27
  except TypeError as e:
16
- raise TypeError(f"In Type_Safe__Set: Invalid type for item: {e}")
28
+ raise TypeError(f"In Type_Safe__Set: Invalid type for item: {e}") from None
29
+
17
30
  super().add(item)
18
31
 
19
32
  def json(self):
@@ -23,6 +36,8 @@ class Type_Safe__Set(Type_Safe__Base, set):
23
36
  for item in self:
24
37
  if isinstance(item, Type_Safe):
25
38
  result.append(item.json())
39
+ elif isinstance(item, Type_Safe__Primitive):
40
+ result.append(item.__to_primitive__())
26
41
  elif isinstance(item, (list, tuple, set)):
27
42
  result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
28
43
  elif isinstance(item, dict):
@@ -0,0 +1,74 @@
1
+ from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
2
+
3
+ class Type_Safe__Tuple(Type_Safe__Base, tuple):
4
+
5
+ def __new__(cls, expected_types, items=None):
6
+ items = items or tuple()
7
+
8
+ converted_items = cls.convert_items(expected_types, items) # Convert items BEFORE creating the tuple
9
+
10
+ instance = super().__new__(cls, converted_items)
11
+ instance.expected_types = expected_types
12
+ return instance
13
+
14
+ def __init__(self, expected_types, items=None):
15
+ if items:
16
+ self.validate_items(self) # Validate the already-converted items
17
+
18
+ @classmethod
19
+ def convert_items(cls, expected_types, items): # Convert items to expected types before creating the tuple.
20
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
21
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
22
+
23
+ if not items:
24
+ return tuple()
25
+
26
+ if len(items) != len(expected_types):
27
+ raise ValueError(f"Expected {len(expected_types)} elements, got {len(items)}")
28
+
29
+
30
+ converted = []
31
+ for item, expected_type in zip(items, expected_types):
32
+ if type(expected_type) is type and issubclass(expected_type, Type_Safe) and type(item) is dict: # Handle Type_Safe objects from dicts
33
+ item = expected_type.from_json(item)
34
+ elif type(expected_type) is type and issubclass(expected_type, Type_Safe__Primitive): # Handle Type_Safe__Primitive conversions
35
+ if not isinstance(item, expected_type):
36
+ try:
37
+ item = expected_type(item)
38
+ except (ValueError, TypeError) as e:
39
+ raise TypeError(f"In Type_Safe__Tuple: Could not convert {type(item).__name__} to {expected_type.__name__}: {e}") from None
40
+
41
+ converted.append(item)
42
+
43
+ return tuple(converted)
44
+
45
+ def validate_items(self, items):
46
+ if len(items) != len(self.expected_types):
47
+ raise ValueError(f"Expected {len(self.expected_types)} elements, got {len(items)}")
48
+ for item, expected_type in zip(items, self.expected_types):
49
+ try:
50
+ self.is_instance_of_type(item, expected_type)
51
+ except TypeError as e:
52
+ raise TypeError(f"In Type_Safe__Tuple: Invalid type for item: {e}")
53
+
54
+ def __repr__(self):
55
+ types_str = ', '.join(type_str(t) for t in self.expected_types)
56
+ return f"tuple[{types_str}] with {len(self)} elements"
57
+
58
+ def json(self):
59
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
60
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
61
+
62
+ result = []
63
+ for item in self:
64
+ if isinstance(item, Type_Safe):
65
+ result.append(item.json())
66
+ elif isinstance(item, Type_Safe__Primitive):
67
+ result.append(item.__to_primitive__()) # Convert primitives to base types
68
+ elif isinstance(item, (list, tuple)):
69
+ result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
70
+ elif isinstance(item, dict):
71
+ result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
72
+ else:
73
+ result.append(item)
74
+ return result
@@ -5,17 +5,18 @@ from enum
5
5
  from osbot_utils.helpers.Obj_Id import Obj_Id
6
6
  from osbot_utils.type_safe.Type_Safe import Type_Safe
7
7
  from osbot_utils.type_safe.primitives.safe_str.identifiers.Random_Guid import Random_Guid
8
- from osbot_utils.type_safe.primitives.safe_str.identifiers.Random_Guid_Short import Random_Guid_Short
8
+ from osbot_utils.type_safe.primitives.safe_str.identifiers.Random_Guid_Short import Random_Guid_Short
9
9
  from osbot_utils.type_safe.primitives.safe_str.cryptography.hashes.Safe_Str__Hash import Safe_Str__Hash
10
10
  from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Dict import Type_Safe__Dict
11
11
  from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
12
12
  from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Set import Type_Safe__Set
13
+ from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Tuple import Type_Safe__Tuple
13
14
  from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Annotations import type_safe_annotations
14
15
  from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Cache import type_safe_cache
15
16
  from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Convert import type_safe_convert
16
17
  from osbot_utils.utils.Objects import enum_from_value
17
18
  from osbot_utils.type_safe.primitives.safe_str.identifiers.Safe_Id import Safe_Id
18
- from osbot_utils.type_safe.primitives.safe_int.Timestamp_Now import Timestamp_Now
19
+ from osbot_utils.type_safe.primitives.safe_int.Timestamp_Now import Timestamp_Now
19
20
 
20
21
  # todo; refactor all this python compatibility into the python_3_8 class
21
22
  if sys.version_info < (3, 8): # pragma: no cover
@@ -60,8 +61,11 @@ class Type_Safe__Step__From_Json:
60
61
  elif annotation_origin == type: # Handle type objects inside ForwardRef
61
62
  value = self.deserialize_type__using_value(value)
62
63
  if annotation_origin is tuple and isinstance(value, list):
63
- # item_types = get_args(annotation) # todo: see if we should do type safety here
64
- value = tuple(value)
64
+ item_types = get_args(annotation)
65
+ if item_types:
66
+ value = Type_Safe__Tuple(expected_types=item_types, items=value) # Create a Type_Safe__Tuple with proper type conversion
67
+ else:
68
+ value = tuple(value)
65
69
  elif type_safe_annotations.obj_is_attribute_annotation_of_type(_self, key, dict): # handle the case when the value is a dict
66
70
  value = self.deserialize_dict__using_key_value_annotations(_self, key, value)
67
71
  elif type_safe_annotations.obj_is_attribute_annotation_of_type(_self, key, set): # handle the case when the value is a list
@@ -13,6 +13,8 @@ class Type_Safe__Step__Set_Attr:
13
13
  value = self.resolve_value__dict(_self, name, value)
14
14
  elif type(value) is list:
15
15
  value = self.resolve_value__list(_self, name, value)
16
+ elif type(value) is tuple:
17
+ value = self.resolve_value__tuple(_self, name, value)
16
18
  elif isinstance(annotations.get(name), type) and issubclass(annotations.get(name), Type_Safe__Primitive) and type(value) in (int, str, float):
17
19
  return annotations.get(name)(value)
18
20
  elif type(value) in (int, str): # for now only a small number of str and int classes are supported (until we understand the full implications of this)
@@ -53,6 +55,20 @@ class Type_Safe__Step__Set_Attr:
53
55
  return type_safe_list
54
56
 
55
57
  return value
58
+
59
+ def resolve_value__tuple(self, _self, name, value): # Convert regular tuples to Type_Safe__Tuple instances
60
+ annotations = type_safe_cache.get_obj_annotations(_self)
61
+ annotation = annotations.get(name)
62
+
63
+ if annotation:
64
+ origin = type_safe_cache.get_origin(annotation)
65
+ if origin is tuple:
66
+ args = get_args(annotation)
67
+ if args:
68
+ from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__Tuple import Type_Safe__Tuple
69
+ return Type_Safe__Tuple(expected_types=args, items=value)
70
+
71
+ return value
56
72
  def resolve_value__from_origin(self, value):
57
73
  #origin = type_safe_cache.get_origin(value) # todo: figure out why this is the only place that the type_safe_cache.get_origin doesn't work (due to WeakKeyDictionary key error on value)
58
74
  origin = get_origin(value)
@@ -106,7 +122,7 @@ class Type_Safe__Step__Set_Attr:
106
122
  return _super.__setattr__(name, value)
107
123
 
108
124
  if value is not None:
109
- value = self.resolve_value (_self, annotations, name, value)
125
+ value = self.resolve_value (_self, annotations, name, value)
110
126
  value = self.handle_get_class(_self, annotations, name, value)
111
127
  else:
112
128
  type_safe_validation.validate_if_value_has_been_set(_self, annotations, name, value)
@@ -265,14 +265,18 @@ def pickle_load_from_bytes(pickled_data: bytes):
265
265
  return {}
266
266
 
267
267
  # todo: see if it is possible to add recursive protection to this logic
268
+ # todo: we should move this method to the type_safe classes and folders
268
269
  def serialize_to_dict(obj):
269
- from decimal import Decimal
270
- from enum import Enum
271
- from typing import List
272
-
273
- if hasattr(obj, '__primitive_base__') and isinstance(obj, (str, int, float)):
270
+ from decimal import Decimal
271
+ from enum import Enum
272
+ from typing import List
273
+ from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
274
+
275
+ if isinstance(obj, Type_Safe__Base) and hasattr(obj, 'json'): # if it is one of these Type_Safe__Base classes
276
+ return obj.json() # use the provided .json() method, which handles the type conversions more specifically to those types (dict, list, set and tuple)
277
+ elif hasattr(obj, '__primitive_base__') and isinstance(obj, (str, int, float)):
274
278
  return obj.__primitive_base__(obj)
275
- elif isinstance(obj, (str, int, float, bool, bytes, Decimal)) or obj is None: # todo: add support for objects like datetime
279
+ elif isinstance(obj, (str, int, float, bool, bytes, Decimal)) or obj is None: # todo: add support for objects like datetime
276
280
  return obj
277
281
  elif isinstance(obj, Enum):
278
282
  return obj.name
@@ -0,0 +1 @@
1
+ v2.87.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.85.0"
3
+ version = "v2.87.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,55 +0,0 @@
1
- from typing import Type
2
- from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
3
- from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
4
-
5
-
6
- class Type_Safe__Dict(Type_Safe__Base, dict):
7
- def __init__(self, expected_key_type, expected_value_type, *args, **kwargs):
8
- super().__init__(*args, **kwargs)
9
-
10
- self.expected_key_type = expected_key_type
11
- self.expected_value_type = expected_value_type
12
-
13
- def __getitem__(self, key):
14
- try:
15
- return super().__getitem__(key) # First try direct lookup
16
- except KeyError:
17
- converted_key = self.try_convert(key, self.expected_key_type) # Try converting the key
18
- return super().__getitem__(converted_key) # and compare again
19
-
20
- def __setitem__(self, key, value): # Check type-safety before allowing assignment.
21
- key = self.try_convert(key , self.expected_key_type )
22
- value = self.try_convert(value, self.expected_value_type)
23
- self.is_instance_of_type(key , self.expected_key_type)
24
- self.is_instance_of_type(value, self.expected_value_type)
25
- super().__setitem__(key, value)
26
-
27
- def __enter__(self): return self
28
- def __exit__ (self, type, value, traceback): pass
29
-
30
- def json(self): # Convert the dictionary to a JSON-serializable format.
31
- from osbot_utils.type_safe.Type_Safe import Type_Safe # can only import this here to avoid circular imports
32
-
33
- result = {}
34
- for key, value in self.items():
35
-
36
- if isinstance(key, (type, Type)): # Handle Type objects as keys
37
- key = f"{key.__module__}.{key.__name__}"
38
-
39
- if isinstance(value, Type_Safe): # Handle Type_Safe objects in values
40
- result[key] = value.json()
41
- elif isinstance(value, (list, tuple)): # Handle lists/tuples that might contain Type_Safe objects
42
- result[key] = [item.json() if isinstance(item, Type_Safe) else item
43
- for item in value]
44
- elif isinstance(value, dict): # Handle nested dictionaries that might contain Type_Safe objects
45
- result[key] = {k: v.json() if isinstance(v, Type_Safe) else v
46
- for k, v in value.items()}
47
- else: # Regular values can be used as-is
48
- result[key] = value
49
- return result
50
-
51
- def keys(self) -> Type_Safe__List:
52
- return Type_Safe__List(self.expected_key_type, super().keys())
53
-
54
- def values(self) -> Type_Safe__List:
55
- return Type_Safe__List(self.expected_value_type, super().values())
@@ -1,41 +0,0 @@
1
- from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
2
-
3
- class Type_Safe__Tuple(Type_Safe__Base, tuple):
4
-
5
- def __new__(cls, expected_types, items=None):
6
- items = items or tuple()
7
- instance = super().__new__(cls, items)
8
- instance.expected_types = expected_types
9
- return instance
10
-
11
- def __init__(self, expected_types, items=None): # todo: see if we should be assigning expected_types to self here
12
- if items:
13
- self.validate_items(items)
14
-
15
- def validate_items(self, items):
16
- if len(items) != len(self.expected_types):
17
- raise ValueError(f"Expected {len(self.expected_types)} elements, got {len(items)}")
18
- for item, expected_type in zip(items, self.expected_types):
19
- try:
20
- self.is_instance_of_type(item, expected_type)
21
- except TypeError as e:
22
- raise TypeError(f"In Type_Safe__Tuple: Invalid type for item: {e}")
23
-
24
- def __repr__(self):
25
- types_str = ', '.join(type_str(t) for t in self.expected_types)
26
- return f"tuple[{types_str}] with {len(self)} elements"
27
-
28
- def json(self):
29
- from osbot_utils.type_safe.Type_Safe import Type_Safe
30
-
31
- result = []
32
- for item in self:
33
- if isinstance(item, Type_Safe):
34
- result.append(item.json())
35
- elif isinstance(item, (list, tuple)):
36
- result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
37
- elif isinstance(item, dict):
38
- result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
39
- else:
40
- result.append(item)
41
- return result
@@ -1 +0,0 @@
1
- v2.85.0
File without changes