osbot-utils 2.84.0__tar.gz → 2.86.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 (479) hide show
  1. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/PKG-INFO +2 -2
  2. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/README.md +1 -1
  3. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/Type_Safe__Primitive.py +6 -1
  4. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/Safe_Str.py +9 -9
  5. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py +4 -4
  6. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py +1 -1
  7. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py +1 -1
  8. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py +1 -1
  9. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py +1 -1
  10. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py +1 -1
  11. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py +1 -1
  12. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py +1 -1
  13. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py +1 -1
  14. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py +8 -4
  15. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py +3 -3
  16. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py +4 -4
  17. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py +1 -1
  18. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py +8 -3
  19. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py +2 -0
  20. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py +17 -2
  21. osbot_utils-2.86.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +74 -0
  22. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py +6 -2
  23. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py +17 -1
  24. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Objects.py +10 -6
  25. osbot_utils-2.86.0/osbot_utils/version +1 -0
  26. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/pyproject.toml +1 -1
  27. osbot_utils-2.84.0/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +0 -41
  28. osbot_utils-2.84.0/osbot_utils/version +0 -1
  29. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/LICENSE +0 -0
  30. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/__init__.py +0 -0
  31. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  32. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  33. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  34. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/base_classes/__init__.py +0 -0
  35. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/context_managers/__init__.py +0 -0
  36. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  37. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  38. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/__init__.py +0 -0
  39. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  40. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  41. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  42. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  43. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  44. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  45. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  46. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache.py +0 -0
  47. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  48. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  49. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  50. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  51. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  52. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/catch.py +0 -0
  53. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/context.py +0 -0
  54. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  55. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  56. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  57. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  58. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  59. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  60. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  61. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/fluent/__init__.py +0 -0
  62. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/CFormat.py +0 -0
  63. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/CPrint.py +0 -0
  64. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  65. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  66. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  67. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  68. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  69. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  70. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Print_Table.py +0 -0
  71. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  72. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  73. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  74. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  75. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  76. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/__init__.py +0 -0
  77. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  78. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  79. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  80. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  81. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  82. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  83. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  84. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  85. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  86. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  87. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  88. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  89. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  90. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  91. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  92. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  93. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  94. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  95. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  96. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  97. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  98. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  99. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  100. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  101. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  102. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  103. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  104. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  105. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  106. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  107. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  108. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  109. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  110. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  111. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  112. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  113. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  114. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  115. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  116. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  117. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  118. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  119. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  120. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  121. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  122. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  123. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  124. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  125. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  126. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  127. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  128. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  129. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  130. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  131. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  132. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  133. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  134. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  135. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  136. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  137. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  138. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  139. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  140. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  141. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  142. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  143. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  144. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  145. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  146. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  147. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  148. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  149. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  150. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  151. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  152. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  153. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Controller.py +0 -0
  154. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Key_Generator.py +0 -0
  155. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Metrics.py +0 -0
  156. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_On_Self.py +0 -0
  157. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/Cache_Storage.py +0 -0
  158. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_on_self/__init__.py +0 -0
  159. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  160. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  161. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  162. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  163. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  164. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  165. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  166. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/Duration.py +0 -0
  167. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/__init__.py +0 -0
  168. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/__init__.py +0 -0
  169. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/capture_duration.py +0 -0
  170. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/duration.py +0 -0
  171. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/decorators/print_duration.py +0 -0
  172. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/schemas/Schema__Duration.py +0 -0
  173. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/duration/schemas/__init__.py +0 -0
  174. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  175. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/Task.py +0 -0
  176. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  177. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -0
  178. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
  179. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +0 -0
  180. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +0 -0
  181. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/actions/__init__.py +0 -0
  182. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  183. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  184. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  185. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  186. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  187. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  188. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  189. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
  190. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
  191. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  192. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
  193. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
  194. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
  195. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
  196. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
  197. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +0 -0
  198. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +0 -0
  199. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
  200. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +0 -0
  201. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/flows/schemas/__init__.py +0 -0
  202. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  203. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  204. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  205. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  206. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  207. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/__init__.py +0 -0
  208. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Document.py +0 -0
  209. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node.py +0 -0
  210. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data.py +0 -0
  211. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +0 -0
  212. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/schemas/__init__.py +0 -0
  213. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Base.py +0 -0
  214. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Body.py +0 -0
  215. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Div.py +0 -0
  216. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__H.py +0 -0
  217. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__HR.py +0 -0
  218. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Head.py +0 -0
  219. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Html.py +0 -0
  220. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Link.py +0 -0
  221. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Style.py +0 -0
  222. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/Tag__Text.py +0 -0
  223. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/tags/__init__.py +0 -0
  224. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/CSS_Dict__To__Css.py +0 -0
  225. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html.py +0 -0
  226. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Document.py +0 -0
  227. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Tags.py +0 -0
  228. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html_Document__To__Html_Dict.py +0 -0
  229. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Dict.py +0 -0
  230. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Document.py +0 -0
  231. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Tag.py +0 -0
  232. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/transformers/__init__.py +0 -0
  233. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/utils/Html__Query.py +0 -0
  234. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/html/utils/__init__.py +0 -0
  235. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/__init__.py +0 -0
  236. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/actions/LLM_Request__Execute.py +0 -0
  237. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py +0 -0
  238. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/actions/__init__.py +0 -0
  239. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder.py +0 -0
  240. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py +0 -0
  241. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/LLM_Request__Factory.py +0 -0
  242. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/builders/__init__.py +0 -0
  243. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py +0 -0
  244. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache.py +0 -0
  245. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__File_System.py +0 -0
  246. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__Storage.py +0 -0
  247. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Local__Folder.py +0 -0
  248. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Sqlite.py +0 -0
  249. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/cache/__init__.py +0 -0
  250. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/platforms/__init__.py +0 -0
  251. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/platforms/open_ai/API__LLM__Open_AI.py +0 -0
  252. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/platforms/open_ai/__init__.py +0 -0
  253. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Safe_Str__LLM__Model_Name.py +0 -0
  254. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Cache__Index.py +0 -0
  255. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request.py +0 -0
  256. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Data.py +0 -0
  257. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Function_Call.py +0 -0
  258. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Content.py +0 -0
  259. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Role.py +0 -0
  260. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response.py +0 -0
  261. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response__Cache.py +0 -0
  262. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/llms/schemas/__init__.py +0 -0
  263. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  264. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  265. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  266. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  267. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  268. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  269. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  270. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  271. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  272. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  273. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  274. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  275. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  276. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  277. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  278. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/python_compatibility/__init__.py +0 -0
  279. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  280. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  281. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  282. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  283. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  284. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  285. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  286. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  287. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  288. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  289. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  290. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  291. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  292. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  293. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  294. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  295. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  296. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  297. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  298. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  299. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  300. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  301. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  302. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  303. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  304. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  305. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  306. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  307. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  308. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  309. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  310. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  311. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  312. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  313. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  314. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  315. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  316. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  317. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  318. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  319. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  320. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  321. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  322. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  323. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  324. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  325. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  326. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  327. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  328. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  329. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  330. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  331. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  332. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  333. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  334. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  335. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  336. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  337. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  338. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/transformers/Dict__To__Toml.py +0 -0
  339. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  340. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  341. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  342. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  343. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  344. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  345. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/__init__.py +0 -0
  346. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  347. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  348. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  349. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  350. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  351. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  352. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Catch.py +0 -0
  353. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  354. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Hook_Method.py +0 -0
  355. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  356. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Log_To_String.py +0 -0
  357. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Logging.py +0 -0
  358. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Patch_Print.py +0 -0
  359. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Profiler.py +0 -0
  360. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Pytest.py +0 -0
  361. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Stderr.py +0 -0
  362. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Stdout.py +0 -0
  363. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  364. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_File.py +0 -0
  365. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  366. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  367. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  368. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  369. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  370. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Unit_Test.py +0 -0
  371. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/Unzip_File.py +0 -0
  372. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/__.py +0 -0
  373. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/__init__.py +0 -0
  374. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  375. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/__init__.py +0 -0
  376. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  377. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  378. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/performance/models/__init__.py +0 -0
  379. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/test_data/__init__.py +0 -0
  380. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/testing/test_data/const__test__data__html.py +0 -0
  381. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/Type_Safe.py +0 -0
  382. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  383. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/__init__.py +0 -0
  384. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/__init__.py +0 -0
  385. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float.py +0 -0
  386. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Engineering.py +0 -0
  387. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Money.py +0 -0
  388. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Percentage_Exact.py +0 -0
  389. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_float/__init__.py +0 -0
  390. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_int/Safe_Int.py +0 -0
  391. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_int/Timestamp_Now.py +0 -0
  392. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_int/__init__.py +0 -0
  393. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/Enum__Safe_Str__Regex_Mode.py +0 -0
  394. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/__init__.py +0 -0
  395. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/__init__.py +0 -0
  396. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/__init__.py +0 -0
  397. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Schema__NaCl__Keys.py +0 -0
  398. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/__init__.py +0 -0
  399. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Path.py +0 -0
  400. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/__init__.py +0 -0
  401. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Branch.py +0 -0
  402. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Tag.py +0 -0
  403. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/git/__init__.py +0 -0
  404. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/github/__init__.py +0 -0
  405. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__ETag.py +0 -0
  406. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Last_Modified.py +0 -0
  407. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Text.py +0 -0
  408. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/http/__init__.py +0 -0
  409. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Guid.py +0 -0
  410. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid.py +0 -0
  411. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid_Short.py +0 -0
  412. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Safe_Id.py +0 -0
  413. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/__init__.py +0 -0
  414. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text.py +0 -0
  415. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text__Dangerous.py +0 -0
  416. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/text/__init__.py +0 -0
  417. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Html.py +0 -0
  418. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__IP_Address.py +0 -0
  419. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Url.py +0 -0
  420. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_str/web/__init__.py +0 -0
  421. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt.py +0 -0
  422. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Byte.py +0 -0
  423. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__FileSize.py +0 -0
  424. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Percentage.py +0 -0
  425. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Port.py +0 -0
  426. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/primitives/safe_uint/__init__.py +0 -0
  427. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/__init__.py +0 -0
  428. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/collections/__init__.py +0 -0
  429. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/decorators/__init__.py +0 -0
  430. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/decorators/type_safe.py +0 -0
  431. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/methods/Type_Safe__Method.py +0 -0
  432. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/methods/__init__.py +0 -0
  433. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/methods/type_safe_property.py +0 -0
  434. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Annotations.py +0 -0
  435. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Cache.py +0 -0
  436. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Convert.py +0 -0
  437. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor.py +0 -0
  438. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
  439. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Not_Cached.py +0 -0
  440. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py +0 -0
  441. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Shared__Variables.py +0 -0
  442. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Validation.py +0 -0
  443. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/shared/__init__.py +0 -0
  444. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
  445. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  446. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Value.py +0 -0
  447. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Init.py +0 -0
  448. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/type_safe_core/steps/__init__.py +0 -0
  449. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  450. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  451. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  452. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  453. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  454. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/type_safe/validators/__init__.py +0 -0
  455. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Assert.py +0 -0
  456. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Call_Stack.py +0 -0
  457. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Csv.py +0 -0
  458. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Dev.py +0 -0
  459. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Env.py +0 -0
  460. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Exceptions.py +0 -0
  461. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Files.py +0 -0
  462. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Functions.py +0 -0
  463. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Http.py +0 -0
  464. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Int.py +0 -0
  465. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Json.py +0 -0
  466. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Json_Cache.py +0 -0
  467. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Lists.py +0 -0
  468. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Misc.py +0 -0
  469. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Png.py +0 -0
  470. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Process.py +0 -0
  471. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Python_Logger.py +0 -0
  472. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Regex.py +0 -0
  473. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Status.py +0 -0
  474. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Str.py +0 -0
  475. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Threads.py +0 -0
  476. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Toml.py +0 -0
  477. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Version.py +0 -0
  478. {osbot_utils-2.84.0 → osbot_utils-2.86.0}/osbot_utils/utils/Zip.py +0 -0
  479. {osbot_utils-2.84.0 → osbot_utils-2.86.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.84.0
3
+ Version: 2.86.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.84.0-blue)
24
+ ![Current Release](https://img.shields.io/badge/release-v2.86.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.84.0-blue)
3
+ ![Current Release](https://img.shields.io/badge/release-v2.86.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)
@@ -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
@@ -12,7 +12,7 @@ class Safe_Str(Type_Safe__Primitive, str):
12
12
  regex : re.Pattern = TYPE_SAFE__STR__REGEX__SAFE_STR
13
13
  regex_mode : Enum__Safe_Str__Regex_Mode = Enum__Safe_Str__Regex_Mode.REPLACE
14
14
  replacement_char : str = '_'
15
- allow_empty : bool = True
15
+ allow_empty : bool = True # note: making this False does cause some side effects on .json() on cases like auto serialization in environments like FastAPI (like it requires more explict value setting), so all have now been converted into a value of True
16
16
  trim_whitespace : bool = False
17
17
  allow_all_replacement_char: bool = True
18
18
  strict_validation : bool = False # If True, don't replace invalid chars, raise an error instead
@@ -34,12 +34,12 @@ class Safe_Str(Type_Safe__Primitive, str):
34
34
  value = value.strip()
35
35
 
36
36
  if not cls.allow_empty and (value is None or value == ""): # Check for empty string if not allowed
37
- raise ValueError("Value cannot be empty when allow_empty is False")
37
+ raise ValueError(f"in {cls.__name__}, value cannot be empty when allow_empty is False")
38
38
 
39
- if cls.exact_length and len(value) != cls.max_length:
40
- raise ValueError(f"Value must be exactly {cls.max_length} characters long (was {len(value)})")
39
+ if cls.exact_length and len(value) and len(value) != cls.max_length:
40
+ raise ValueError(f"in {cls.__name__}, value must be exactly {cls.max_length} characters long (was {len(value)})")
41
41
  elif not cls.exact_length and len(value) > cls.max_length: # Check max length
42
- raise ValueError(f"Value exceeds maximum length of {cls.max_length} characters (was {len(value)})")
42
+ raise ValueError(f"in {cls.__name__}, value exceeds maximum length of {cls.max_length} characters (was {len(value)})")
43
43
 
44
44
  if cls.allow_empty and value =='':
45
45
  return str.__new__(cls, '')
@@ -54,22 +54,22 @@ class Safe_Str(Type_Safe__Primitive, str):
54
54
  if cls.strict_validation:
55
55
  if cls.regex_mode == Enum__Safe_Str__Regex_Mode.MATCH: # For 'match' mode, regex defines the valid pattern (like version numbers)
56
56
  if not cls.regex.match(value):
57
- raise ValueError(f"Value does not match required pattern: {cls.regex.pattern}")
57
+ raise ValueError(f"in {cls.__name__}, value does not match required pattern: {cls.regex.pattern}")
58
58
  return value
59
59
  elif cls.regex_mode == Enum__Safe_Str__Regex_Mode.REPLACE: # For 'replace' mode, regex defines invalid characters to replace
60
60
  if cls.regex.search(value) is not None:
61
- raise ValueError(f"Value contains invalid characters (must not match pattern: {cls.regex.pattern})")
61
+ raise ValueError(f"in {cls.__name__}, value contains invalid characters (must not match pattern: {cls.regex.pattern})")
62
62
  return value
63
63
  else:
64
64
  raise ValueError(f"in {cls.__name__}, regex_mode value cannot be None when strict_validation is True")
65
65
  else:
66
66
  if cls.regex_mode == Enum__Safe_Str__Regex_Mode.MATCH: # Cannot do replacement when regex defines valid pattern
67
- raise ValueError(f"Cannot use regex_mode='match' without strict_validation=True")
67
+ raise ValueError(f"in {cls.__name__}, cannot use regex_mode='match' without strict_validation=True")
68
68
  else: # assume the default Enum__Safe_Str__Regex_Mode.MATCH
69
69
  sanitized_value = cls.regex.sub(cls.replacement_char, value)
70
70
 
71
71
  if not cls.allow_all_replacement_char and set(sanitized_value) == {
72
72
  cls.replacement_char} and sanitized_value:
73
- raise ValueError(f"Sanitized value consists entirely of '{cls.replacement_char}' characters")
73
+ raise ValueError(f"in {cls.__name__}, sanitized value consists entirely of '{cls.replacement_char}' characters")
74
74
 
75
75
  return sanitized_value
@@ -10,10 +10,10 @@ TYPE_SAFE_STR__HASH__REGEX = re.compile(r'[^a-fA-F0-9]') # Only a
10
10
  class Safe_Str__Hash(Safe_Str):
11
11
  regex = TYPE_SAFE_STR__HASH__REGEX
12
12
  max_length = SIZE__VALUE_HASH
13
- allow_empty = False # Don't allow empty hash values
14
- trim_whitespace = True # Trim any whitespace
15
- strict_validation = True # Enable strict validation - new attribute
16
- exact_length = True # Require exact length match - new attribute
13
+ allow_empty = True # Don't allow empty hash values
14
+ trim_whitespace = True # Trim any whitespace
15
+ strict_validation = True # Enable strict validation - new attribute
16
+ exact_length = True # Require exact length match - new attribute
17
17
 
18
18
  def safe_str_hash(value: Any) -> Safe_Str__Hash:
19
19
  if isinstance(value, str):
@@ -21,6 +21,6 @@ class Safe_Str__SHA1(Safe_Str):
21
21
  regex_mode = Enum__Safe_Str__Regex_Mode.MATCH
22
22
  max_length = TYPE_SAFE_STR__GITHUB__SHA__LENGTH
23
23
  exact_length = True
24
- allow_empty = False
24
+ allow_empty = True
25
25
  trim_whitespace = True
26
26
  strict_validation = True
@@ -19,6 +19,6 @@ class Safe_Str__SHA1__Short(Safe_Str):
19
19
  regex_mode = Enum__Safe_Str__Regex_Mode.MATCH
20
20
  max_length = TYPE_SAFE_STR__GITHUB__SHA_SHORT__LENGTH
21
21
  exact_length = True
22
- allow_empty = False
22
+ allow_empty = True
23
23
  trim_whitespace = True
24
24
  strict_validation = True
@@ -22,6 +22,6 @@ class Safe_Str__NaCl__Private_Key(Safe_Str):
22
22
  regex_mode = Enum__Safe_Str__Regex_Mode.MATCH
23
23
  max_length = TYPE_SAFE_STR__NACL__PRIVATE_KEY__LENGTH
24
24
  exact_length = True
25
- allow_empty = False
25
+ allow_empty = True
26
26
  trim_whitespace = True
27
27
  strict_validation = True
@@ -23,6 +23,6 @@ class Safe_Str__NaCl__Public_Key(Safe_Str):
23
23
  regex_mode = Enum__Safe_Str__Regex_Mode.MATCH
24
24
  max_length = TYPE_SAFE_STR__NACL__PUBLIC_KEY__LENGTH
25
25
  exact_length = True
26
- allow_empty = False
26
+ allow_empty = True
27
27
  trim_whitespace = True
28
28
  strict_validation = True
@@ -5,6 +5,6 @@ TYPE_SAFE_STR__FILE__NAME__REGEX = re.compile(r'[^a-zA-Z0-9_\-. ]')
5
5
 
6
6
  class Safe_Str__File__Name(Safe_Str):
7
7
  regex = TYPE_SAFE_STR__FILE__NAME__REGEX
8
- allow_empty = False
8
+ allow_empty = True
9
9
  trim_whitespace = True
10
10
  allow_all_replacement_char = False
@@ -24,7 +24,7 @@ class Safe_Str__Git__Ref(Safe_Str):
24
24
  - /repos/{owner}/{repo}/commits/{ref}
25
25
  """
26
26
  max_length = 255
27
- allow_empty = False
27
+ allow_empty = True
28
28
  trim_whitespace = True
29
29
 
30
30
  def __new__(cls, value=None):
@@ -23,7 +23,7 @@ class Safe_Str__Git__Ref_Base(Safe_Str):
23
23
  """
24
24
  regex = TYPE_SAFE_STR__GIT_REF__REGEX
25
25
  max_length = TYPE_SAFE_STR__GIT_REF__MAX_LENGTH
26
- allow_empty = False
26
+ allow_empty = True
27
27
  trim_whitespace = True
28
28
  allow_all_replacement_char = True
29
29
 
@@ -9,7 +9,7 @@ class Safe_Str__Version(Safe_Str):
9
9
  regex = TYPE_SAFE_STR__VERSION__REGEX
10
10
  regex_mode = Enum__Safe_Str__Regex_Mode.MATCH # in this case we need an exact match of the version regex
11
11
  max_length = TYPE_SAFE_STR__VERSION__MAX_LENGTH
12
- allow_empty = False
12
+ allow_empty = True
13
13
  trim_whitespace = True
14
14
  strict_validation = True # Ensure the value exactly matches the regex
15
15
 
@@ -20,7 +20,7 @@ class Safe_Str__GitHub__Repo(Safe_Str):
20
20
  """
21
21
  regex = TYPE_SAFE_STR__GITHUB__REPO__REGEX
22
22
  max_length = TYPE_SAFE_STR__GITHUB__REPO__MAX_LENGTH
23
- allow_empty = False
23
+ allow_empty = True
24
24
  trim_whitespace = True
25
25
  allow_all_replacement_char = False
26
26
  repo_owner : Safe_Str__GitHub__Repo_Owner = None # note: due to the str override these will not show in the Pycharm code hints (but they will work)
@@ -31,16 +31,20 @@ class Safe_Str__GitHub__Repo(Safe_Str):
31
31
 
32
32
  if result:
33
33
  if '/' not in result: # Check for the required forward slash
34
- raise ValueError(f"GitHub repository must be in 'owner/repo' format: {result}")
34
+ raise ValueError(f"in {cls.__name__}, gitHub repository must be in 'owner/repo' format: {result}")
35
35
 
36
36
 
37
37
  parts = result.split('/') # Split and validate components using the dedicated classes
38
38
  if len(parts) != 2:
39
- raise ValueError(f"GitHub repository must be in 'owner/repo' format: {result}")
39
+ raise ValueError(f"in {cls.__name__}, gitHub repository must be in 'owner/repo' format: {result}")
40
40
 
41
41
  owner_part, repo_part = parts
42
42
 
43
43
  result.repo_owner = Safe_Str__GitHub__Repo_Owner(owner_part) # Validate using the dedicated classes (and store the references)
44
- result.repo_name = Safe_Str__GitHub__Repo_Name(repo_part ) # This will raise appropriate errors if validation fails
44
+ result.repo_name = Safe_Str__GitHub__Repo_Name(repo_part )
45
+ if not result.repo_owner:
46
+ raise ValueError(f"in {cls.__name__}, missing owner, gitHub repository must be in 'owner/repo' format: {result}")
47
+ if not result.repo_name:
48
+ raise ValueError(f"in {cls.__name__}, missing name, gitHub repository must be in 'owner/repo' format: {result}")
45
49
 
46
50
  return result
@@ -15,7 +15,7 @@ class Safe_Str__GitHub__Repo_Name(Safe_Str):
15
15
  """
16
16
  regex = TYPE_SAFE_STR__GITHUB__REPO_NAME__REGEX
17
17
  max_length = TYPE_SAFE_STR__GITHUB__REPO_NAME__MAX_LENGTH
18
- allow_empty = False
18
+ allow_empty = True
19
19
  trim_whitespace = True
20
20
  allow_all_replacement_char = False
21
21
 
@@ -26,10 +26,10 @@ class Safe_Str__GitHub__Repo_Name(Safe_Str):
26
26
  if result:
27
27
  # Check if it's just periods (reserved names)
28
28
  if result in ['.', '..']:
29
- raise ValueError(f"Invalid repository name: {result}")
29
+ raise ValueError(f"in {cls.__name__}, invalid repository name: {result}")
30
30
 
31
31
  # Check for all replacement characters
32
32
  if set(result) == {'_'} and len(result) > 0:
33
- raise ValueError(f"Invalid repository name: {result}")
33
+ raise ValueError(f"in {cls.__name__}, invalid repository name: {result}")
34
34
 
35
35
  return result
@@ -16,7 +16,7 @@ class Safe_Str__GitHub__Repo_Owner(Safe_Str):
16
16
  """
17
17
  regex = TYPE_SAFE_STR__GITHUB__REPO_OWNER__REGEX
18
18
  max_length = TYPE_SAFE_STR__GITHUB__REPO_OWNER__MAX_LENGTH
19
- allow_empty = False
19
+ allow_empty = True
20
20
  trim_whitespace = True
21
21
  allow_all_replacement_char = False
22
22
 
@@ -26,13 +26,13 @@ class Safe_Str__GitHub__Repo_Owner(Safe_Str):
26
26
 
27
27
  if result: # Additional GitHub-specific validation
28
28
  if result.startswith('-') or result.endswith('-'): # Check for leading/trailing hyphens
29
- raise ValueError(f"GitHub owner name cannot start or end with a hyphen: {result}")
29
+ raise ValueError(f"in {cls.__name__}, gitHub owner name cannot start or end with a hyphen: {result}")
30
30
 
31
31
  if '--' in result: # Check for consecutive hyphens
32
- raise ValueError(f"GitHub owner name cannot contain consecutive hyphens: {result}")
32
+ raise ValueError(f"in {cls.__name__}, gitHub owner name cannot contain consecutive hyphens: {result}")
33
33
 
34
34
  if result.replace('_', '') == '': # Check for all underscores (sanitized invalid input)
35
- raise ValueError(f"Invalid GitHub owner name: {result}")
35
+ raise ValueError(f"in {cls.__name__}, invalid GitHub owner name: {result}")
36
36
 
37
37
  return result
38
38
 
@@ -7,6 +7,6 @@ TYPE_SAFE_STR__HTTP__CONTENT_TYPE__MAX_LENGTH = 256
7
7
  class Safe_Str__Http__Content_Type(Safe_Str):
8
8
  regex = TYPE_SAFE_STR__HTTP__CONTENT_TYPE__REGEX
9
9
  max_length = TYPE_SAFE_STR__HTTP__CONTENT_TYPE__MAX_LENGTH
10
- allow_empty = False
10
+ allow_empty = True
11
11
  trim_whitespace = True
12
12
  allow_all_replacement_char = False
@@ -1,5 +1,6 @@
1
1
  from typing import Type
2
2
  from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base
3
+ from osbot_utils.type_safe.Type_Safe__Primitive import Type_Safe__Primitive
3
4
  from osbot_utils.type_safe.type_safe_core.collections.Type_Safe__List import Type_Safe__List
4
5
 
5
6
 
@@ -35,7 +36,8 @@ class Type_Safe__Dict(Type_Safe__Base, dict):
35
36
 
36
37
  if isinstance(key, (type, Type)): # Handle Type objects as keys
37
38
  key = f"{key.__module__}.{key.__name__}"
38
-
39
+ elif isinstance(key, Type_Safe__Primitive):
40
+ key = key.__to_primitive__()
39
41
  if isinstance(value, Type_Safe): # Handle Type_Safe objects in values
40
42
  result[key] = value.json()
41
43
  elif isinstance(value, (list, tuple)): # Handle lists/tuples that might contain Type_Safe objects
@@ -44,8 +46,11 @@ class Type_Safe__Dict(Type_Safe__Base, dict):
44
46
  elif isinstance(value, dict): # Handle nested dictionaries that might contain Type_Safe objects
45
47
  result[key] = {k: v.json() if isinstance(v, Type_Safe) else v
46
48
  for k, v in value.items()}
47
- else: # Regular values can be used as-is
48
- result[key] = value
49
+ else:
50
+ if isinstance(value, Type_Safe__Primitive):
51
+ result[key] = value.__to_primitive__()
52
+ else:
53
+ result[key] = value
49
54
  return result
50
55
 
51
56
  def keys(self) -> Type_Safe__List:
@@ -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
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
@@ -10,6 +10,7 @@ from osbot_utils.type_safe.primitives.safe_str.cryptography.hashes.Safe_Str__Has
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
@@ -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.86.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.84.0"
3
+ version = "v2.86.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -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.84.0
File without changes