osbot-utils 2.87.0__tar.gz → 2.89.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/PKG-INFO +2 -2
  2. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/README.md +1 -1
  3. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/decorators/capture_duration.py +0 -1
  4. osbot_utils-2.89.0/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +4 -0
  5. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder.py +11 -11
  6. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Data.py +6 -6
  7. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/Type_Safe.py +1 -1
  8. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/Safe_Str.py +7 -5
  9. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Enum__LLM__Role.py +10 -0
  10. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Description.py +14 -0
  11. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Message__Assistant.py +7 -0
  12. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Message__System.py +7 -0
  13. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Message__Tool.py +7 -0
  14. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Message__User.py +7 -0
  15. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Modality.py +14 -0
  16. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Model_ID.py +14 -0
  17. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Model_Name.py +13 -0
  18. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Model_Slug.py +12 -0
  19. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Prompt.py +7 -0
  20. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm/Safe_Str__LLM__Tokenizer.py +13 -0
  21. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Code__Snippet.py +9 -0
  22. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__API__Parameter.py +13 -0
  23. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Email.py +12 -0
  24. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Password.py +14 -0
  25. osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Username.py +8 -0
  26. osbot_utils-2.89.0/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py +18 -0
  27. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Validation.py +6 -6
  28. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py +1 -1
  29. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Init.py +6 -3
  30. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py +5 -5
  31. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Objects.py +22 -9
  32. osbot_utils-2.89.0/osbot_utils/utils/__init__.py +0 -0
  33. osbot_utils-2.89.0/osbot_utils/version +1 -0
  34. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/pyproject.toml +1 -1
  35. osbot_utils-2.87.0/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +0 -4
  36. osbot_utils-2.87.0/osbot_utils/helpers/llms/schemas/Safe_Str__LLM__Model_Name.py +0 -10
  37. osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py +0 -14
  38. osbot_utils-2.87.0/osbot_utils/version +0 -1
  39. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/LICENSE +0 -0
  40. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/__init__.py +0 -0
  41. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  42. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  43. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  44. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/base_classes/__init__.py +0 -0
  45. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/context_managers/__init__.py +0 -0
  46. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  47. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  48. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/__init__.py +0 -0
  49. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  50. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  51. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  52. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  53. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  54. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  55. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  56. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/cache.py +0 -0
  57. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  58. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  59. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  60. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  61. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  62. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/catch.py +0 -0
  63. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/context.py +0 -0
  64. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  65. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  66. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  67. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  68. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  69. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  70. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  71. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/fluent/__init__.py +0 -0
  72. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/CFormat.py +0 -0
  73. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/CPrint.py +0 -0
  74. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  75. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  76. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  77. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  78. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  79. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  80. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Print_Table.py +0 -0
  81. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  82. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  83. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  84. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  85. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  86. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/__init__.py +0 -0
  87. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  88. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  89. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  90. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  91. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  92. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  93. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  94. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  95. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  96. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  97. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  98. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  99. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  100. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  101. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  102. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  103. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  104. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  105. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  106. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  107. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  108. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  109. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  110. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  111. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  112. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  113. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  114. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  115. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  116. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  117. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  118. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  119. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  120. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  121. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  122. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  123. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  124. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  125. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  126. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  127. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  128. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  129. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  130. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  131. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  132. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  133. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  134. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  135. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  136. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  137. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  138. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  139. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  140. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  141. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  142. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  143. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  144. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  145. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  146. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  147. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  148. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  149. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  150. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  151. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  152. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  153. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  154. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  155. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  156. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  157. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  158. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  159. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  160. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  161. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  162. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  163. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_on_self/Cache_Controller.py +0 -0
  164. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_on_self/Cache_Key_Generator.py +0 -0
  165. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_on_self/Cache_Metrics.py +0 -0
  166. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_on_self/Cache_On_Self.py +0 -0
  167. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_on_self/Cache_Storage.py +0 -0
  168. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_on_self/__init__.py +0 -0
  169. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  170. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  171. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  172. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  173. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  174. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  175. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  176. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/Duration.py +0 -0
  177. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/__init__.py +0 -0
  178. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/decorators/__init__.py +0 -0
  179. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/decorators/duration.py +0 -0
  180. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/decorators/print_duration.py +0 -0
  181. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/schemas/Schema__Duration.py +0 -0
  182. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/duration/schemas/__init__.py +0 -0
  183. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  184. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/Task.py +0 -0
  185. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  186. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -0
  187. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
  188. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +0 -0
  189. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +0 -0
  190. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/actions/__init__.py +0 -0
  191. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  192. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  193. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  194. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  195. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  196. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  197. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  198. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
  199. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
  200. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  201. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
  202. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
  203. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
  204. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
  205. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
  206. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +0 -0
  207. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +0 -0
  208. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
  209. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +0 -0
  210. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/flows/schemas/__init__.py +0 -0
  211. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  212. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  213. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  214. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  215. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  216. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/__init__.py +0 -0
  217. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/schemas/Schema__Html_Document.py +0 -0
  218. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node.py +0 -0
  219. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data.py +0 -0
  220. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/schemas/__init__.py +0 -0
  221. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Base.py +0 -0
  222. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Body.py +0 -0
  223. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Div.py +0 -0
  224. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__H.py +0 -0
  225. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__HR.py +0 -0
  226. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Head.py +0 -0
  227. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Html.py +0 -0
  228. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Link.py +0 -0
  229. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Style.py +0 -0
  230. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/Tag__Text.py +0 -0
  231. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/tags/__init__.py +0 -0
  232. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/CSS_Dict__To__Css.py +0 -0
  233. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html.py +0 -0
  234. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Document.py +0 -0
  235. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/Html_Dict__To__Html_Tags.py +0 -0
  236. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/Html_Document__To__Html_Dict.py +0 -0
  237. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Dict.py +0 -0
  238. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Document.py +0 -0
  239. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/Html__To__Html_Tag.py +0 -0
  240. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/transformers/__init__.py +0 -0
  241. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/utils/Html__Query.py +0 -0
  242. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/html/utils/__init__.py +0 -0
  243. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/__init__.py +0 -0
  244. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/actions/LLM_Request__Execute.py +0 -0
  245. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py +0 -0
  246. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/actions/__init__.py +0 -0
  247. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py +0 -0
  248. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/builders/LLM_Request__Factory.py +0 -0
  249. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/builders/__init__.py +0 -0
  250. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py +0 -0
  251. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache.py +0 -0
  252. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__File_System.py +0 -0
  253. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__Storage.py +0 -0
  254. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Local__Folder.py +0 -0
  255. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Sqlite.py +0 -0
  256. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/cache/__init__.py +0 -0
  257. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/platforms/__init__.py +0 -0
  258. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/platforms/open_ai/API__LLM__Open_AI.py +0 -0
  259. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/platforms/open_ai/__init__.py +0 -0
  260. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Cache__Index.py +0 -0
  261. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request.py +0 -0
  262. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Function_Call.py +0 -0
  263. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Content.py +0 -0
  264. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Role.py +0 -0
  265. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response.py +0 -0
  266. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response__Cache.py +0 -0
  267. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/llms/schemas/__init__.py +0 -0
  268. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  269. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  270. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  271. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  272. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  273. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  274. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  275. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  276. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  277. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  278. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  279. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  280. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  281. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  282. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  283. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/python_compatibility/__init__.py +0 -0
  284. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  285. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  286. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  287. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  288. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  289. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  290. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  291. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  292. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  293. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  294. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  295. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  296. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  297. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  298. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  299. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  300. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  301. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  302. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  303. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  304. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  305. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  306. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  307. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  308. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  309. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  310. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  311. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  312. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  313. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  314. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  315. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  316. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  317. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  318. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  319. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  320. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  321. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  322. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  323. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  324. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  325. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  326. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  327. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  328. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  329. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  330. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  331. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  332. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  333. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  334. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  335. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  336. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  337. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  338. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  339. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  340. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  341. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  342. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  343. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/transformers/Dict__To__Toml.py +0 -0
  344. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  345. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  346. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  347. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  348. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  349. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  350. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/__init__.py +0 -0
  351. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  352. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  353. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  354. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  355. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  356. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  357. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Catch.py +0 -0
  358. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  359. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Hook_Method.py +0 -0
  360. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  361. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Log_To_String.py +0 -0
  362. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Logging.py +0 -0
  363. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Patch_Print.py +0 -0
  364. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Profiler.py +0 -0
  365. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Pytest.py +0 -0
  366. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Stderr.py +0 -0
  367. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Stdout.py +0 -0
  368. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  369. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Temp_File.py +0 -0
  370. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  371. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  372. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  373. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  374. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  375. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Unit_Test.py +0 -0
  376. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/Unzip_File.py +0 -0
  377. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/__.py +0 -0
  378. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/__init__.py +0 -0
  379. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  380. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/performance/__init__.py +0 -0
  381. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  382. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  383. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/performance/models/__init__.py +0 -0
  384. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/test_data/__init__.py +0 -0
  385. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/testing/test_data/const__test__data__html.py +0 -0
  386. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  387. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/Type_Safe__Primitive.py +0 -0
  388. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/__init__.py +0 -0
  389. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/__init__.py +0 -0
  390. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float.py +0 -0
  391. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Engineering.py +0 -0
  392. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Money.py +0 -0
  393. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Percentage_Exact.py +0 -0
  394. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_float/__init__.py +0 -0
  395. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_int/Safe_Int.py +0 -0
  396. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_int/Timestamp_Now.py +0 -0
  397. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_int/__init__.py +0 -0
  398. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/Enum__Safe_Str__Regex_Mode.py +0 -0
  399. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/__init__.py +0 -0
  400. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/__init__.py +0 -0
  401. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py +0 -0
  402. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py +0 -0
  403. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py +0 -0
  404. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/__init__.py +0 -0
  405. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py +0 -0
  406. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py +0 -0
  407. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Schema__NaCl__Keys.py +0 -0
  408. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/__init__.py +0 -0
  409. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py +0 -0
  410. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Path.py +0 -0
  411. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/__init__.py +0 -0
  412. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Branch.py +0 -0
  413. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py +0 -0
  414. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py +0 -0
  415. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Tag.py +0 -0
  416. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py +0 -0
  417. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/git/__init__.py +0 -0
  418. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py +0 -0
  419. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py +0 -0
  420. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py +0 -0
  421. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/github/__init__.py +0 -0
  422. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py +0 -0
  423. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__ETag.py +0 -0
  424. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Last_Modified.py +0 -0
  425. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Text.py +0 -0
  426. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/http/__init__.py +0 -0
  427. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Guid.py +0 -0
  428. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid.py +0 -0
  429. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid_Short.py +0 -0
  430. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Safe_Id.py +0 -0
  431. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/__init__.py +0 -0
  432. {osbot_utils-2.87.0/osbot_utils/type_safe/primitives/safe_str/text → osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/llm}/__init__.py +0 -0
  433. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text.py +0 -0
  434. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text__Dangerous.py +0 -0
  435. {osbot_utils-2.87.0/osbot_utils/type_safe/primitives/safe_str/web → osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/text}/__init__.py +0 -0
  436. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Html.py +0 -0
  437. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__IP_Address.py +0 -0
  438. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Url.py +0 -0
  439. {osbot_utils-2.87.0/osbot_utils/type_safe/primitives/safe_uint → osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_str/web}/__init__.py +0 -0
  440. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt.py +0 -0
  441. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Byte.py +0 -0
  442. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__FileSize.py +0 -0
  443. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Percentage.py +0 -0
  444. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Port.py +0 -0
  445. {osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core → osbot_utils-2.89.0/osbot_utils/type_safe/primitives/safe_uint}/__init__.py +0 -0
  446. {osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/collections → osbot_utils-2.89.0/osbot_utils/type_safe/type_safe_core}/__init__.py +0 -0
  447. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py +0 -0
  448. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py +0 -0
  449. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py +0 -0
  450. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +0 -0
  451. {osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/decorators → osbot_utils-2.89.0/osbot_utils/type_safe/type_safe_core/collections}/__init__.py +0 -0
  452. {osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/methods → osbot_utils-2.89.0/osbot_utils/type_safe/type_safe_core/decorators}/__init__.py +0 -0
  453. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/decorators/type_safe.py +0 -0
  454. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/methods/Type_Safe__Method.py +0 -0
  455. {osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/shared → osbot_utils-2.89.0/osbot_utils/type_safe/type_safe_core/methods}/__init__.py +0 -0
  456. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/methods/type_safe_property.py +0 -0
  457. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Annotations.py +0 -0
  458. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Cache.py +0 -0
  459. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Convert.py +0 -0
  460. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor.py +0 -0
  461. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
  462. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Not_Cached.py +0 -0
  463. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Shared__Variables.py +0 -0
  464. {osbot_utils-2.87.0/osbot_utils/type_safe/type_safe_core/steps → osbot_utils-2.89.0/osbot_utils/type_safe/type_safe_core/shared}/__init__.py +0 -0
  465. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  466. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Value.py +0 -0
  467. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py +0 -0
  468. {osbot_utils-2.87.0/osbot_utils/type_safe/validators → osbot_utils-2.89.0/osbot_utils/type_safe/type_safe_core/steps}/__init__.py +0 -0
  469. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  470. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  471. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  472. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  473. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  474. {osbot_utils-2.87.0/osbot_utils/utils → osbot_utils-2.89.0/osbot_utils/type_safe/validators}/__init__.py +0 -0
  475. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Assert.py +0 -0
  476. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Call_Stack.py +0 -0
  477. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Csv.py +0 -0
  478. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Dev.py +0 -0
  479. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Env.py +0 -0
  480. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Exceptions.py +0 -0
  481. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Files.py +0 -0
  482. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Functions.py +0 -0
  483. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Http.py +0 -0
  484. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Int.py +0 -0
  485. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Json.py +0 -0
  486. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Json_Cache.py +0 -0
  487. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Lists.py +0 -0
  488. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Misc.py +0 -0
  489. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Png.py +0 -0
  490. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Process.py +0 -0
  491. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Python_Logger.py +0 -0
  492. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Regex.py +0 -0
  493. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Status.py +0 -0
  494. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Str.py +0 -0
  495. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Threads.py +0 -0
  496. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Toml.py +0 -0
  497. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Version.py +0 -0
  498. {osbot_utils-2.87.0 → osbot_utils-2.89.0}/osbot_utils/utils/Zip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: osbot_utils
3
- Version: 2.87.0
3
+ Version: 2.89.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.87.0-blue)
24
+ ![Current Release](https://img.shields.io/badge/release-v2.89.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.87.0-blue)
3
+ ![Current Release](https://img.shields.io/badge/release-v2.89.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,5 +1,4 @@
1
1
  import time
2
-
3
2
  from osbot_utils.type_safe.Type_Safe import Type_Safe
4
3
 
5
4
 
@@ -0,0 +1,4 @@
1
+ from enum import Enum
2
+
3
+ class Schema__Html_Node__Data__Type(str, Enum):
4
+ TEXT : str = 'text'
@@ -1,14 +1,14 @@
1
- from typing import Dict, Any, Type
2
- from osbot_utils.helpers.llms.actions.Type_Safe__Schema_For__LLMs import Type_Safe__Schema_For__LLMs
3
- from osbot_utils.helpers.llms.schemas.Safe_Str__LLM__Model_Name import Safe_Str__LLM__Model_Name
4
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request import Schema__LLM_Request
5
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Data import Schema__LLM_Request__Data
6
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Function_Call import Schema__LLM_Request__Function_Call
7
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Content import Schema__LLM_Request__Message__Content
8
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Role import Schema__LLM_Request__Message__Role
9
- from osbot_utils.type_safe.Type_Safe import Type_Safe
10
- from osbot_utils.type_safe.primitives.safe_str.text.Safe_Str__Text import Safe_Str__Text
11
- from osbot_utils.type_safe.type_safe_core.decorators.type_safe import type_safe
1
+ from typing import Dict, Any, Type
2
+ from osbot_utils.helpers.llms.actions.Type_Safe__Schema_For__LLMs import Type_Safe__Schema_For__LLMs
3
+ from osbot_utils.type_safe.primitives.safe_str.llm.Safe_Str__LLM__Model_Name import Safe_Str__LLM__Model_Name
4
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request import Schema__LLM_Request
5
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Data import Schema__LLM_Request__Data
6
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Function_Call import Schema__LLM_Request__Function_Call
7
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Content import Schema__LLM_Request__Message__Content
8
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Role import Schema__LLM_Request__Message__Role
9
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
10
+ from osbot_utils.type_safe.primitives.safe_str.text.Safe_Str__Text import Safe_Str__Text
11
+ from osbot_utils.type_safe.type_safe_core.decorators.type_safe import type_safe
12
12
 
13
13
 
14
14
  class LLM_Request__Builder(Type_Safe):
@@ -1,9 +1,9 @@
1
- from typing import List, Optional
2
- from osbot_utils.helpers.llms.schemas.Safe_Str__LLM__Model_Name import Safe_Str__LLM__Model_Name
3
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Function_Call import Schema__LLM_Request__Function_Call
4
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Content import Schema__LLM_Request__Message__Content
5
- from osbot_utils.type_safe.Type_Safe import Type_Safe
6
- from osbot_utils.type_safe.primitives.safe_str.text.Safe_Str__Text import Safe_Str__Text
1
+ from typing import List, Optional
2
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Function_Call import Schema__LLM_Request__Function_Call
3
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Content import Schema__LLM_Request__Message__Content
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
+ from osbot_utils.type_safe.primitives.safe_str.llm.Safe_Str__LLM__Model_Name import Safe_Str__LLM__Model_Name
6
+ from osbot_utils.type_safe.primitives.safe_str.text.Safe_Str__Text import Safe_Str__Text
7
7
 
8
8
 
9
9
  class Schema__LLM_Request__Data(Type_Safe): # Schema for LLM API request data
@@ -88,7 +88,7 @@ class Type_Safe:
88
88
  if value is not None:
89
89
  if hasattr(self,'__annotations__'): # can only do type safety checks if the class does not have annotations
90
90
  if type_safe_validation.check_if__type_matches__obj_annotation__for_attr(self, key, value) is False:
91
- raise ValueError(f"Invalid type for attribute '{key}'. Expected '{self.__annotations__.get(key)}' but got '{type(value)}'")
91
+ raise ValueError(f"On {self.__class__.__name__} invalid type for attribute '{key}'. Expected '{self.__annotations__.get(key)}' but got '{type(value)}'")
92
92
  setattr(self, key, value)
93
93
  return self
94
94
 
@@ -8,16 +8,16 @@ TYPE_SAFE__STR__MAX_LENGTH = 512
8
8
 
9
9
 
10
10
  class Safe_Str(Type_Safe__Primitive, str):
11
+ allow_all_replacement_char: bool = True
12
+ 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
13
+ exact_length : bool = False # If True, require exact length match, not just max length
11
14
  max_length : int = TYPE_SAFE__STR__MAX_LENGTH
12
15
  regex : re.Pattern = TYPE_SAFE__STR__REGEX__SAFE_STR
13
16
  regex_mode : Enum__Safe_Str__Regex_Mode = Enum__Safe_Str__Regex_Mode.REPLACE
14
17
  replacement_char : str = '_'
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
- trim_whitespace : bool = False
17
- allow_all_replacement_char: bool = True
18
18
  strict_validation : bool = False # If True, don't replace invalid chars, raise an error instead
19
- exact_length : bool = False # If True, require exact length match, not just max length
20
-
19
+ to_lower_case : bool = False # If True, convert string to lowercase
20
+ trim_whitespace : bool = False
21
21
 
22
22
  def __new__(cls, value: Optional[str] = None) -> 'Safe_Str':
23
23
 
@@ -46,6 +46,8 @@ class Safe_Str(Type_Safe__Primitive, str):
46
46
 
47
47
  sanitized_value = cls.validate_and_sanitize(value)
48
48
 
49
+ if cls.to_lower_case:
50
+ sanitized_value = sanitized_value.lower()
49
51
 
50
52
  return str.__new__(cls, sanitized_value)
51
53
 
@@ -0,0 +1,10 @@
1
+ from enum import Enum
2
+
3
+ class Enum__LLM__Role(str, Enum): # Extended roles for specific providers
4
+ SYSTEM = "system"
5
+ USER = "user"
6
+ ASSISTANT = "assistant"
7
+ TOOL = "tool"
8
+
9
+ def __str__(self):
10
+ return self.value # Override to return the value
@@ -0,0 +1,14 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__LLM__Description(Safe_Str): # LLM model or feature description
5
+ max_length = 4096
6
+ regex = re.compile(r'[^a-zA-Z0-9_ ()\[\]\-+=:;,.?*/\\×\n`&"\'#%<>{}$@|!\s~]') # Allows common description chars
7
+
8
+ # Supports rich descriptions with:
9
+ # - Basic punctuation and formatting
10
+ # - Mathematical symbols (×, +, -)
11
+ # - Common special characters for technical descriptions
12
+ # - Newlines for multi-line descriptions
13
+ # - Brackets for annotations [like this]
14
+ # - Quotes for "emphasis" or 'terms'
@@ -0,0 +1,7 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+
5
+ class Safe_Str__LLM__Message__Assistant(Safe_Str): # For assistant/AI responses
6
+ max_length = 32768 # Full context window for responses
7
+ regex = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F]') # Permissive - only control chars
@@ -0,0 +1,7 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+
5
+ class Safe_Str__LLM__Message__System(Safe_Str): # For system prompts
6
+ max_length = 4096 # Shorter than full prompts
7
+ regex = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F]') # Remove control chars EXCEPT tab (\x09), newline (\x0A), and carriage return (\x0D)
@@ -0,0 +1,7 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+
5
+ class Safe_Str__LLM__Message__Tool(Safe_Str): # For tool/function responses
6
+ max_length = 16384 # Tool responses often shorter
7
+ regex = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F]') # Permissive for JSON/structured data
@@ -0,0 +1,7 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+
5
+ class Safe_Str__LLM__Message__User(Safe_Str): # For user messages
6
+ max_length = 32768 # Full context window for user input
7
+ regex = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F]') # Permissive - only control chars
@@ -0,0 +1,14 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__LLM__Modality(Safe_Str): # LLM model modality descriptor
5
+ max_length = 128
6
+ regex = re.compile(r'[^a-zA-Z0-9+\->\s]') # Allows: alphanumeric, +, -, >, space
7
+
8
+ # Supports modality descriptions:
9
+ # - "text"
10
+ # - "text->image"
11
+ # - "image+text->text"
12
+ # - "multimodal"
13
+ # - "text + vision"
14
+ # - "audio->text"
@@ -0,0 +1,14 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__LLM__Model_ID(Safe_Str): # Generic LLM model identifier
5
+ max_length = 256
6
+ regex = re.compile(r'[^a-zA-Z0-9/\-.:_@]') # Allows: alphanumeric, /, -, ., :, _, @
7
+
8
+
9
+ # Supports various model ID formats:
10
+ # - OpenRouter: "openai/gpt-4", "anthropic/claude-3-opus"
11
+ # - OpenAI: "gpt-4", "gpt-3.5-turbo"
12
+ # - Anthropic: "claude-3-opus-20240229", "claude-3-sonnet@20240229"
13
+ # - Cohere: "command-r-plus"
14
+ # - Google: "models/gemini-pro"
@@ -0,0 +1,13 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__LLM__Model_Name(Safe_Str): # Human-readable LLM model name
5
+ max_length = 256
6
+ regex = re.compile(r'[^a-zA-Z0-9: .\-()+,]') # Allows: alphanumeric, :, space, ., -, (, ), +, &, ,
7
+
8
+ # Supports various display names:
9
+ # - "GPT-4 Turbo"
10
+ # - "Claude 3 Opus (Latest)"
11
+ # - "Llama 3.1: Instruct (70B)"
12
+ # - "Command R+"
13
+ # - "Gemini Pro 1.5"
@@ -0,0 +1,12 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__LLM__Model_Slug(Safe_Str): # URL-safe LLM model slug
5
+ max_length = 256
6
+ regex = re.compile(r'[^a-zA-Z0-9/\-._]') # Allows: alphanumeric, /, -, ., _
7
+
8
+ # URL-safe slugs for routing/APIs:
9
+ # - "gpt-4-turbo"
10
+ # - "claude-3-opus"
11
+ # - "llama-3.1-70b"
12
+ # - "command_r_plus"
@@ -0,0 +1,7 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+
5
+ class Safe_Str__LLM__Prompt(Safe_Str): # Or Safe_Str__LLM__Message
6
+ max_length = 32768 # Common context window size
7
+ regex = re.compile(r'[\x00\x01-\x08\x0B\x0C\x0E-\x1F]') # Remove control chars only
@@ -0,0 +1,13 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__LLM__Tokenizer(Safe_Str): # LLM tokenizer type identifier
5
+ max_length = 64
6
+ regex = re.compile(r'[^a-zA-Z0-9\-_\s]') # Allows: alphanumeric, -, _, space
7
+
8
+ # Supports tokenizer names:
9
+ # - "cl100k_base"
10
+ # - "tiktoken"
11
+ # - "GPT-4 Tokenizer"
12
+ # - "sentencepiece"
13
+ # - "BPE"
@@ -0,0 +1,9 @@
1
+ import re
2
+
3
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
4
+
5
+
6
+ class Safe_Str__Code__Snippet(Safe_Str): # Allows various characters needed for code snippets.
7
+ regex = re.compile(r'[^a-zA-Z0-9_\-.\s(),;:=+\[\]{}\'"]<>')
8
+ max_length = 1024
9
+ trim_whitespace = False # Preserve leading whitespace for code indentation
@@ -0,0 +1,13 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__API__Parameter(Safe_Str): # Generic API parameter name
5
+ max_length = 64
6
+ regex = re.compile(r'[^a-zA-Z0-9_]') # Allows: alphanumeric, _
7
+
8
+ # Standard API parameter names:
9
+ # - "max_tokens"
10
+ # - "temperature"
11
+ # - "top_p"
12
+ # - "stream"
13
+ # - "response_format"
@@ -0,0 +1,12 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+ class Safe_Str__Email(Safe_Str): # Special class for emails with simple custom validation.
5
+ regex = re.compile(r'[^a-zA-Z0-9_\-.@]')
6
+ max_length = 256
7
+
8
+ def __new__(cls, value=None):
9
+ result = super().__new__(cls, value)
10
+ if '@' not in result: # Additional validation for email format
11
+ raise ValueError(f"in {cls.__name__}, email must contain an @ symbol")
12
+ return result
@@ -0,0 +1,14 @@
1
+ import re
2
+
3
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
4
+
5
+
6
+ class Safe_Str__Password(Safe_Str): # Password with minimum requirements.
7
+ regex = re.compile(r'[^a-zA-Z0-9_\-.\s!@#$%^&*()]')
8
+ min_length = 8 # Custom attribute
9
+
10
+ def __new__(cls, value=None):
11
+ result = super().__new__(cls, value)
12
+ if len(result) < cls.min_length:
13
+ raise ValueError(f"Password must be at least {cls.min_length} characters long")
14
+ return result
@@ -0,0 +1,8 @@
1
+ import re
2
+ from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
3
+
4
+
5
+ class Safe_Str__Username(Safe_Str):
6
+ """Allows only alphanumerics and underscores, with a 32 character limit."""
7
+ regex = re.compile(r'[^a-zA-Z0-9_]')
8
+ max_length = 32
@@ -0,0 +1,18 @@
1
+ from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Shared__Variables import IMMUTABLE_TYPES
2
+
3
+
4
+ class Type_Safe__Raise_Exception:
5
+
6
+ def type_mismatch_error__on_instance(self, _self, var_name: str, expected_type: type, actual_type: type) -> None: # Raises formatted error for type validation failures
7
+ exception_message = f"On {_self.__class__.__name__}, invalid type for attribute '{var_name}'. Expected '{expected_type}' but got '{actual_type}'"
8
+ raise ValueError(exception_message) from None
9
+
10
+ def type_mismatch_error__on_type(self, cls, var_name: str, expected_type: type, actual_type: type) -> None: # Raises formatted error for type validation failures
11
+ exception_message = f"On {cls.__name__}, invalid type for attribute '{var_name}'. Expected '{expected_type}' but got '{actual_type}'"
12
+ raise ValueError(exception_message) from None
13
+
14
+ def immutable_type_error(self, var_name, var_type):
15
+ exception_message = f"variable '{var_name}' is defined as type '{var_type}' which is not supported by Type_Safe, with only the following immutable types being supported: '{IMMUTABLE_TYPES}' and the following subclasses (int, float, str)"
16
+ raise ValueError(exception_message) from None
17
+
18
+ type_safe_raise_exception = Type_Safe__Raise_Exception()
@@ -270,11 +270,11 @@ class Type_Safe__Validation:
270
270
  def validate_if_value_has_been_set(self, _self, annotations, name, value):
271
271
  if hasattr(_self, name) and annotations.get(name) : # don't allow previously set variables to be set to None
272
272
  if getattr(_self, name) is not None: # unless it is already set to None
273
- raise ValueError(f"Can't set None, to a variable that is already set. Invalid type for attribute '{name}'. Expected '{_self.__annotations__.get(name)}' but got '{type(value)}'")
273
+ raise ValueError(f"On {_self.__class__.__name__}, can't be set to None, to a variable that is already set. Invalid type for attribute '{name}'. Expected '{_self.__annotations__.get(name)}' but got '{type(value)}'")
274
274
 
275
- def validate_if__types_are_compatible_for_assigment(self, name, current_type, expected_type):
275
+ def validate_if__types_are_compatible_for_assigment(self, _self, name, current_type, expected_type):
276
276
  if not type_safe_validation.are_types_compatible_for_assigment(current_type, expected_type):
277
- type_safe_raise_exception.type_mismatch_error(name, expected_type, current_type)
277
+ type_safe_raise_exception.type_mismatch_error__on_instance(_self, name, expected_type, current_type)
278
278
 
279
279
  def validate_type_compatibility(self, target : Any , # Target object to validate
280
280
  annotations : Dict[str, Any] , # Type annotations
@@ -295,7 +295,7 @@ class Type_Safe__Validation:
295
295
  actual_type = value
296
296
  else:
297
297
  actual_type = type(value)
298
- raise ValueError(f"Invalid type for attribute '{name}'. Expected '{expected_type}' but got '{actual_type}'") from None
298
+ raise ValueError(f"On {target.__class__.__name__}, invalid type for attribute '{name}'. Expected '{expected_type}' but got '{actual_type}'") from None
299
299
 
300
300
  # todo: see if need to add cache support to this method (it looks like this method is not called very often)
301
301
  def validate_type_immutability(self, var_name: str, var_type: Any) -> None: # Validates that type is immutable or in supported format
@@ -321,8 +321,8 @@ class Type_Safe__Validation:
321
321
  # if not (isinstance(var_type, type) and issubclass(var_type, (int,str, float))):
322
322
  # type_safe_raise_exception.immutable_type_error(var_name, var_type)
323
323
 
324
- def validate_variable_type(self, var_name, var_type, var_value): # Validate type compatibility
324
+ def validate_variable_type(self, base_cls, var_name, var_type, var_value): # Validate type compatibility
325
325
  if type(var_type) is type and not isinstance(var_value, var_type):
326
- type_safe_raise_exception.type_mismatch_error(var_name, var_type, type(var_value))
326
+ type_safe_raise_exception.type_mismatch_error__on_type(base_cls, var_name, var_type, type(var_value))
327
327
 
328
328
  type_safe_validation = Type_Safe__Validation()
@@ -96,7 +96,7 @@ class Type_Safe__Step__Class_Kwargs:
96
96
  # If conversion fails, let the original validation handle it
97
97
  pass
98
98
 
99
- type_safe_validation.validate_variable_type(var_name, var_type, var_value)
99
+ type_safe_validation.validate_variable_type(base_cls, var_name, var_type, var_value)
100
100
  type_safe_validation.validate_type_immutability(var_name, var_type)
101
101
 
102
102
  def process_annotation(self, cls : Type , # Process single annotation
@@ -33,13 +33,16 @@ class Type_Safe__Step__Init:
33
33
  raise ValueError(f"{__self.__class__.__name__} has no attribute '{key}' and cannot be assigned the value '{value}'. "
34
34
  f"Use {__self.__class__.__name__}.__default_kwargs__() see what attributes are available") from None
35
35
 
36
- def convert_value_to_type_safe_objects(self, __self, key, value): # todo: see if we should use _self here (like in Type_Safe__Step__From_Json, or vice versa)
36
+ def convert_value_to_type_safe_objects(self, __self, key, value):
37
37
  annotation = type_safe_annotations.obj_attribute_annotation(__self, key)
38
38
  if annotation:
39
39
  if isinstance(annotation, EnumMeta) and type(value) is str:
40
- if value not in annotation.__members__:
40
+ if value in annotation.__members__: # First check if it's a valid name (e.g., 'SYSTEM')
41
+ value = annotation[value]
42
+ elif hasattr(annotation, '_value2member_map_') and value in annotation._value2member_map_: # Then check if it's a valid value (e.g., 'system')
43
+ value = annotation._value2member_map_[value]
44
+ else:
41
45
  raise ValueError(f"Invalid value '{value}' for enum {annotation.__name__}")
42
- value = annotation[value]
43
46
  else:
44
47
 
45
48
  origin = type_safe_annotations.get_origin(annotation)
@@ -22,7 +22,7 @@ class Type_Safe__Step__Set_Attr:
22
22
  else:
23
23
  value = self.resolve_value__from_origin(value)
24
24
 
25
- self.validate_literal_value(annotations, name, value) # Check Literal value constraints before generic type checking
25
+ self.validate_literal_value(_self, annotations, name, value) # Check Literal value constraints before generic type checking
26
26
 
27
27
  type_safe_validation.validate_type_compatibility(_self, annotations, name, value)
28
28
  return value
@@ -106,7 +106,7 @@ class Type_Safe__Step__Set_Attr:
106
106
  if name in immutable_vars:
107
107
  expected_type = immutable_vars[name]
108
108
  current_type = type if value is type else type(value)
109
- type_safe_validation.validate_if__types_are_compatible_for_assigment(name, current_type, expected_type)
109
+ type_safe_validation.validate_if__types_are_compatible_for_assigment(_self, name, current_type, expected_type)
110
110
  _super.__setattr__(name, value)
111
111
  return True
112
112
  return False
@@ -129,7 +129,7 @@ class Type_Safe__Step__Set_Attr:
129
129
 
130
130
  _super.__setattr__(name, value)
131
131
 
132
- def validate_literal_value(self, annotations, name, value): # Check if a value is valid for a Literal type annotation
132
+ def validate_literal_value(self, _self, annotations, name, value): # Check if a value is valid for a Literal type annotation
133
133
 
134
134
  annotation = annotations.get(name)
135
135
  if not annotation:
@@ -145,7 +145,7 @@ class Type_Safe__Step__Set_Attr:
145
145
  allowed_values = get_args(arg) # Found Literal inside Optional
146
146
  if value is not None and value not in allowed_values:
147
147
  allowed_str = ', '.join(repr(v) for v in allowed_values)
148
- raise ValueError(f"Invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
148
+ raise ValueError(f"On {_self.__class__.__name__}, invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
149
149
  return
150
150
 
151
151
 
@@ -153,7 +153,7 @@ class Type_Safe__Step__Set_Attr:
153
153
  allowed_values = get_args(annotation)
154
154
  if value not in allowed_values:
155
155
  allowed_str = ', '.join(repr(v) for v in allowed_values)
156
- raise ValueError(f"Invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
156
+ raise ValueError(f"On {_self.__class__.__name__}, invalid value for '{name}': must be one of [{allowed_str}], got {repr(value)}")
157
157
 
158
158
 
159
159
  type_safe_step_set_attr = Type_Safe__Step__Set_Attr()
@@ -1,5 +1,4 @@
1
- from types import SimpleNamespace
2
-
1
+ from types import SimpleNamespace
3
2
  from osbot_utils.testing.__ import __
4
3
 
5
4
  def base_classes(cls):
@@ -96,10 +95,13 @@ def str_to_obj(target):
96
95
  return dict_to_obj(json.loads(target))
97
96
 
98
97
  def enum_from_value(enum_type, value):
99
- try:
100
- return enum_type[value] # Attempt to convert the value to an Enum member by name
101
- except KeyError:
102
- raise ValueError(f"Value '{value}' is not a valid member of {enum_type.__name__}.") # Handle the case where the value does not match any Enum member
98
+ if value in enum_type.__members__: # Try to get by name (e.g., 'SYSTEM')
99
+ return enum_type[value]
100
+
101
+ if hasattr(enum_type, '_value2member_map_') and value in enum_type._value2member_map_: # Try to get by value (e.g., 'system') using the reverse mapping
102
+ return enum_type._value2member_map_[value]
103
+
104
+ raise ValueError(f"Value '{value}' is not a valid member of {enum_type.__name__}.") # If neither worked, raise an error
103
105
 
104
106
 
105
107
  def get_field(target, field, default=None):
@@ -276,13 +278,18 @@ def serialize_to_dict(obj):
276
278
  return obj.json() # use the provided .json() method, which handles the type conversions more specifically to those types (dict, list, set and tuple)
277
279
  elif hasattr(obj, '__primitive_base__') and isinstance(obj, (str, int, float)):
278
280
  return obj.__primitive_base__(obj)
281
+ elif isinstance(obj, Enum):
282
+ if isinstance(obj.value, (str, int, float, bool, type(None))): # Check if the enum value is directly serializable
283
+ return obj.value
284
+ elif isinstance(obj.value, (list, tuple, dict, set)): # Recursively serialize complex values
285
+ return serialize_to_dict(obj.value)
286
+ else:
287
+ return obj.name # Fallback to name for non-serializable values
279
288
  elif isinstance(obj, (str, int, float, bool, bytes, Decimal)) or obj is None: # todo: add support for objects like datetime
280
289
  return obj
281
- elif isinstance(obj, Enum):
282
- return obj.name
283
290
  elif isinstance(obj, type):
284
291
  return f"{obj.__module__}.{obj.__name__}" # save the full type name
285
- elif isinstance(obj, (list, tuple, List)): # Added tuple here
292
+ elif isinstance(obj, (list, tuple, List)): # Added tuple here
286
293
  return [serialize_to_dict(item) for item in obj]
287
294
  elif isinstance(obj, set):
288
295
  return [serialize_to_dict(item) for item in obj]
@@ -296,6 +303,12 @@ def serialize_to_dict(obj):
296
303
  serialized_dict[serialized_key] = serialize_to_dict(value) # Recursively serialize the value
297
304
  return serialized_dict
298
305
  #return {key: serialize_to_dict(value) for key, value in obj.items()}
306
+ elif callable(obj) and not isinstance(obj, type): # For functions/lambdas, return a string representation
307
+ if hasattr(obj, '__name__'):
308
+ return obj.__name__
309
+ if hasattr(obj, '__class__'):
310
+ return obj.__class__.__name__
311
+ return str(obj)
299
312
  elif hasattr(obj, "__dict__"):
300
313
  data = {} # todo: look at a more advanced version which saved the type of the object, for example with {'__type__': type(obj).__name__}
301
314
  for key, value in obj.__dict__.items():
File without changes
@@ -0,0 +1 @@
1
+ v2.89.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.87.0"
3
+ version = "v2.89.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,4 +0,0 @@
1
- from enum import Enum
2
-
3
- class Schema__Html_Node__Data__Type(Enum):
4
- TEXT : str = 'text'
@@ -1,10 +0,0 @@
1
- import re
2
-
3
- from osbot_utils.type_safe.primitives.safe_str.Safe_Str import Safe_Str
4
-
5
- TYPE_SAFE_STR__LLM__MODEL_NAME__MAX_LENGTH = 256
6
- TYPE_SAFE_STR__LLM__MODEL_NAME__REGEX = r'[^a-zA-Z0-9/_\-.:]'
7
-
8
- class Safe_Str__LLM__Model_Name(Safe_Str):
9
- regex = re.compile(TYPE_SAFE_STR__LLM__MODEL_NAME__REGEX)
10
- max_length = TYPE_SAFE_STR__LLM__MODEL_NAME__MAX_LENGTH
@@ -1,14 +0,0 @@
1
- from osbot_utils.type_safe.type_safe_core.shared.Type_Safe__Shared__Variables import IMMUTABLE_TYPES
2
-
3
-
4
- class Type_Safe__Raise_Exception:
5
-
6
- def type_mismatch_error(self, var_name: str, expected_type: type, actual_type: type) -> None: # Raises formatted error for type validation failures
7
- exception_message = f"Invalid type for attribute '{var_name}'. Expected '{expected_type}' but got '{actual_type}'"
8
- raise ValueError(exception_message) from None
9
-
10
- def immutable_type_error(self, var_name, var_type):
11
- exception_message = f"variable '{var_name}' is defined as type '{var_type}' which is not supported by Type_Safe, with only the following immutable types being supported: '{IMMUTABLE_TYPES}' and the following subclasses (int, float, str)"
12
- raise ValueError(exception_message) from None
13
-
14
- type_safe_raise_exception = Type_Safe__Raise_Exception()
@@ -1 +0,0 @@
1
- v2.87.0
File without changes