osbot-utils 1.95.0__tar.gz → 2.1.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 (328) hide show
  1. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/README.md +1 -1
  3. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/base_classes/Kwargs_To_Self.py +1 -1
  4. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/context_managers/capture_duration.py +2 -2
  5. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/type_safe.py +1 -1
  6. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/CFormat.py +1 -1
  7. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Hashicorp_Secrets.py +1 -1
  8. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Zip_Bytes.py +1 -1
  9. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +1 -1
  10. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +1 -1
  11. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +1 -1
  12. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +1 -1
  13. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +1 -1
  14. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +1 -1
  15. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/Flow.py +1 -1
  16. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/Flow__Events.py +1 -1
  17. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/Task.py +1 -1
  18. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +1 -1
  19. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +1 -1
  20. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +1 -1
  21. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +1 -1
  22. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/generators/Generator_Manager.py +1 -1
  23. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +1 -1
  24. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/Event__Queue.py +1 -1
  25. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +1 -1
  26. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +1 -1
  27. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +1 -1
  28. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SSH.py +1 -1
  29. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SSH__Execute.py +1 -1
  30. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SSH__Python.py +1 -1
  31. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +1 -1
  32. osbot_utils-2.1.0/osbot_utils/helpers/xml/Xml__Attribute.py +7 -0
  33. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/Xml__Element.py +1 -1
  34. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/Xml__File.py +1 -1
  35. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/Xml__File__Load.py +1 -1
  36. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +1 -1
  37. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +1 -1
  38. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +1 -1
  39. osbot_utils-2.1.0/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +7 -0
  40. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +1 -1
  41. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +1 -1
  42. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +1 -1
  43. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Temp_Env_Vars.py +1 -1
  44. {osbot_utils-1.95.0/osbot_utils/base_classes → osbot_utils-2.1.0/osbot_utils/type_safe}/Type_Safe.py +9 -9
  45. {osbot_utils-1.95.0/osbot_utils/base_classes → osbot_utils-2.1.0/osbot_utils/type_safe}/Type_Safe__Base.py +3 -0
  46. osbot_utils-2.1.0/osbot_utils/type_safe/Type_Safe__Dict.py +39 -0
  47. osbot_utils-2.1.0/osbot_utils/type_safe/Type_Safe__List.py +34 -0
  48. {osbot_utils-1.95.0/osbot_utils/helpers → osbot_utils-2.1.0/osbot_utils}/type_safe/validators/Validator__Max.py +1 -1
  49. {osbot_utils-1.95.0/osbot_utils/helpers → osbot_utils-2.1.0/osbot_utils}/type_safe/validators/Validator__Min.py +1 -1
  50. {osbot_utils-1.95.0/osbot_utils/helpers → osbot_utils-2.1.0/osbot_utils}/type_safe/validators/Validator__One_Of.py +1 -1
  51. {osbot_utils-1.95.0/osbot_utils/helpers → osbot_utils-2.1.0/osbot_utils}/type_safe/validators/Validator__Regex.py +1 -1
  52. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Python_Logger.py +1 -1
  53. osbot_utils-2.1.0/osbot_utils/version +1 -0
  54. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/pyproject.toml +1 -1
  55. osbot_utils-1.95.0/osbot_utils/base_classes/Type_Safe__Dict.py +0 -22
  56. osbot_utils-1.95.0/osbot_utils/base_classes/Type_Safe__List.py +0 -22
  57. osbot_utils-1.95.0/osbot_utils/helpers/xml/Xml__Attribute.py +0 -7
  58. osbot_utils-1.95.0/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -7
  59. osbot_utils-1.95.0/osbot_utils/version +0 -1
  60. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/LICENSE +0 -0
  61. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/__init__.py +0 -0
  62. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  63. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  64. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/base_classes/__init__.py +0 -0
  65. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/context_managers/__init__.py +0 -0
  66. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  67. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  68. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/context_managers/print_duration.py +0 -0
  69. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/__init__.py +0 -0
  70. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  71. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  72. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  73. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  74. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  75. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  76. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  77. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/cache.py +0 -0
  78. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  79. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  80. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  81. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  82. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  83. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/catch.py +0 -0
  84. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/context.py +0 -0
  85. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  86. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  87. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  88. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  89. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  90. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  91. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  92. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/fluent/__init__.py +0 -0
  93. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/CPrint.py +0 -0
  94. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  95. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  96. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Guid.py +0 -0
  97. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  98. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  99. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Print_Table.py +0 -0
  100. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  101. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  102. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  103. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  104. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Safe_Id.py +0 -0
  105. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  106. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  107. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  108. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/__init__.py +0 -0
  109. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  110. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  111. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  112. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  113. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  114. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  115. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  116. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  117. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  118. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  119. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  120. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  121. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  122. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  123. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  124. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  125. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  126. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  127. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  128. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  129. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  130. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  131. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  132. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  133. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  134. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  135. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  136. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  137. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  138. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  139. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  140. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  141. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  142. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  143. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  144. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  145. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  146. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  147. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  148. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  149. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  150. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  151. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  152. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  153. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  154. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  155. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  156. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  157. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  158. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  159. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  160. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  161. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  162. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  163. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  164. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  165. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  166. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  167. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  168. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  169. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  170. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  171. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  172. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  173. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  174. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  175. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  176. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  177. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  178. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  179. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  180. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  181. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  182. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  183. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  184. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  185. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  186. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  187. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  188. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  189. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  190. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  191. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  192. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  193. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  194. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  195. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  196. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  197. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  198. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  199. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  200. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  201. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  202. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  203. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  204. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  205. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  206. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  207. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  208. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  209. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/html/__init__.py +0 -0
  210. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  211. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  212. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  213. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  214. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  215. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  216. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  217. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  218. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  219. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  220. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  221. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  222. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  223. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  224. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/python_compatibility/__init__.py +0 -0
  225. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  226. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  227. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  228. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  229. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  230. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  231. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  232. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  233. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  234. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  235. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  236. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  237. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  238. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  239. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  240. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  241. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  242. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  243. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  244. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  245. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  246. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  247. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  248. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  249. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  250. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  251. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  252. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  253. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  254. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  255. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  256. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  257. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  258. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  259. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  260. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  261. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  262. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  263. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  264. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  265. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  266. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  267. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  268. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  269. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  270. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  271. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  272. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  273. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  274. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  275. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  276. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  277. {osbot_utils-1.95.0/osbot_utils/helpers/type_safe → osbot_utils-2.1.0/osbot_utils/helpers/xml}/__init__.py +0 -0
  278. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  279. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Catch.py +0 -0
  280. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  281. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Duration.py +0 -0
  282. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Hook_Method.py +0 -0
  283. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  284. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Log_To_String.py +0 -0
  285. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Logging.py +0 -0
  286. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Patch_Print.py +0 -0
  287. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Profiler.py +0 -0
  288. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Pytest.py +0 -0
  289. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Stderr.py +0 -0
  290. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Stdout.py +0 -0
  291. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Temp_File.py +0 -0
  292. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  293. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  294. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  295. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  296. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  297. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Unit_Test.py +0 -0
  298. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/testing/Unzip_File.py +0 -0
  299. {osbot_utils-1.95.0/osbot_utils/helpers/type_safe/validators → osbot_utils-2.1.0/osbot_utils/testing}/__init__.py +0 -0
  300. {osbot_utils-1.95.0/osbot_utils/helpers → osbot_utils-2.1.0/osbot_utils/type_safe}/Type_Safe_Method.py +0 -0
  301. {osbot_utils-1.95.0/osbot_utils/helpers → osbot_utils-2.1.0/osbot_utils}/type_safe/Type_Safe__Validator.py +0 -0
  302. {osbot_utils-1.95.0/osbot_utils/helpers/xml → osbot_utils-2.1.0/osbot_utils/type_safe}/__init__.py +0 -0
  303. {osbot_utils-1.95.0/osbot_utils/testing → osbot_utils-2.1.0/osbot_utils/type_safe/validators}/__init__.py +0 -0
  304. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Assert.py +0 -0
  305. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Call_Stack.py +0 -0
  306. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Csv.py +0 -0
  307. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Dev.py +0 -0
  308. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Env.py +0 -0
  309. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Exceptions.py +0 -0
  310. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Files.py +0 -0
  311. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Functions.py +0 -0
  312. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Http.py +0 -0
  313. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Int.py +0 -0
  314. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Json.py +0 -0
  315. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Json_Cache.py +0 -0
  316. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Lists.py +0 -0
  317. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Misc.py +0 -0
  318. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Objects.py +0 -0
  319. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Png.py +0 -0
  320. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Process.py +0 -0
  321. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Regex.py +0 -0
  322. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Status.py +0 -0
  323. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Str.py +0 -0
  324. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Threads.py +0 -0
  325. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Toml.py +0 -0
  326. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Version.py +0 -0
  327. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/Zip.py +0 -0
  328. {osbot_utils-1.95.0 → osbot_utils-2.1.0}/osbot_utils/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.95.0
3
+ Version: 2.1.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  Powerful Python util methods and classes that simplify common apis and tasks.
25
25
 
26
- ![Current Release](https://img.shields.io/badge/release-v1.95.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v2.1.0-blue)
27
27
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
28
28
 
29
29
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Powerful Python util methods and classes that simplify common apis and tasks.
4
4
 
5
- ![Current Release](https://img.shields.io/badge/release-v1.95.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v2.1.0-blue)
6
6
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
7
7
 
8
8
 
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
 
3
3
  # todo: refactor all of Kwargs_To_Self to use Type_Safe
4
4
  Kwargs_To_Self = Type_Safe
@@ -1,5 +1,5 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
- from osbot_utils.utils.Misc import timestamp_utc_now
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
+ from osbot_utils.utils.Misc import timestamp_utc_now
3
3
 
4
4
 
5
5
  class capture_duration(Type_Safe):
@@ -1,5 +1,5 @@
1
1
  import functools # For wrapping functions
2
- from osbot_utils.helpers.Type_Safe_Method import Type_Safe_Method
2
+ from osbot_utils.type_safe.Type_Safe_Method import Type_Safe_Method
3
3
 
4
4
  def type_safe(func): # Main decorator function
5
5
  @functools.wraps(func) # Preserve function metadata
@@ -2,7 +2,7 @@
2
2
  # - Have code complete on CPrint
3
3
  # - not have the write the code for each of the methods
4
4
  # - have a good and logical place to capture the ID of the color
5
- from osbot_utils.base_classes.Type_Safe import Type_Safe
5
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
6
6
 
7
7
 
8
8
  class CFormat_Colors:
@@ -1,5 +1,5 @@
1
1
  from osbot_utils.utils.Env import get_env
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.utils.Lists import list_index_by
4
4
  from osbot_utils.utils.Misc import list_set
5
5
 
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
  from osbot_utils.utils.Dev import pprint
3
3
  from osbot_utils.utils.Files import files_list, file_create_from_bytes, temp_file, parent_folder, parent_folder_create
4
4
  from osbot_utils.utils.Misc import random_text
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
  from osbot_utils.helpers.cache_requests.Cache__Requests__Row import Cache__Requests__Row
3
3
  from osbot_utils.helpers.cache_requests.Cache__Requests__Table import Cache__Requests__Table
4
4
  from osbot_utils.utils.Json import json_dumps
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
 
3
3
 
4
4
  class Cache__Requests__Config(Type_Safe):
@@ -1,5 +1,5 @@
1
1
  import types
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.cache_requests.Cache__Requests__Config import Cache__Requests__Config
4
4
  from osbot_utils.helpers.cache_requests.Cache__Requests__Table import Cache__Requests__Table
5
5
  from osbot_utils.utils.Json import json_dumps, json_loads
@@ -1,7 +1,7 @@
1
1
  import threading
2
2
  import types
3
3
 
4
- from osbot_utils.base_classes.Type_Safe import Type_Safe
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
5
  from osbot_utils.helpers.cache_requests.Cache__Requests__Actions import Cache__Requests__Actions
6
6
  from osbot_utils.helpers.cache_requests.Cache__Requests__Config import Cache__Requests__Config
7
7
  from osbot_utils.helpers.cache_requests.Cache__Requests__Data import Cache__Requests__Data
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
  from osbot_utils.helpers.cache_requests.Cache__Requests__Config import Cache__Requests__Config
3
3
  from osbot_utils.helpers.cache_requests.Cache__Requests__Table import Cache__Requests__Table
4
4
  from osbot_utils.utils.Json import json_dumps
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
 
3
3
 
4
4
  class Cache__Requests__Table(Type_Safe):
@@ -3,7 +3,7 @@ import logging
3
3
  import typing
4
4
 
5
5
  from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
6
- from osbot_utils.base_classes.Type_Safe import Type_Safe
6
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
7
7
  from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_magenta, f_bold
8
8
  from osbot_utils.helpers.flows.models.Flow_Run__Config import Flow_Run__Config
9
9
  from osbot_utils.helpers.flows.Flow__Events import flow_events
@@ -1,6 +1,6 @@
1
1
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
2
2
  from osbot_utils.utils.Str import ansi_to_text
3
- from osbot_utils.base_classes.Type_Safe import Type_Safe
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
4
  from osbot_utils.helpers.flows.models.Flow_Run__Event import Flow_Run__Event
5
5
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Type import Flow_Run__Event_Type
6
6
 
@@ -8,7 +8,7 @@ from osbot_utils.helpers.Dependency_Manager import Dependency_Manager
8
8
  from osbot_utils.helpers.flows.Flow__Events import flow_events
9
9
  from osbot_utils.testing.Stdout import Stdout
10
10
  from osbot_utils.helpers.CFormat import CFormat, f_dark_grey, f_red, f_blue, f_bold
11
- from osbot_utils.base_classes.Type_Safe import Type_Safe
11
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
12
12
  from osbot_utils.helpers.flows.Flow import Flow
13
13
 
14
14
  TASK__RANDOM_ID__PREFIX = 'task_id__'
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
 
3
3
 
4
4
  class Flow_Run__Config(Type_Safe):
@@ -1,6 +1,6 @@
1
1
  from osbot_utils.helpers.Random_Guid import Random_Guid
2
2
 
3
- from osbot_utils.base_classes.Type_Safe import Type_Safe
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
4
  from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
5
5
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Data import Flow_Run__Event_Data
6
6
  from osbot_utils.helpers.flows.models.Flow_Run__Event_Type import Flow_Run__Event_Type
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
 
3
- from osbot_utils.base_classes.Type_Safe import Type_Safe
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
4
 
5
5
 
6
6
  class Flow_Run__Event_Data(Type_Safe):
@@ -1,6 +1,6 @@
1
1
  from enum import Enum
2
2
 
3
- from osbot_utils.base_classes.Type_Safe import Type_Safe
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
4
 
5
5
  class Flow_Run__Event_Type(Enum):
6
6
  FLOW_MESSAGE: str = 'flow_message'
@@ -3,7 +3,7 @@ from _thread import RLock
3
3
  from types import GeneratorType
4
4
  from typing import Dict # Typing imports for type hints
5
5
  from typing import Union
6
- from osbot_utils.base_classes.Type_Safe import Type_Safe # Type_Safe base class for type-safe attributes
6
+ from osbot_utils.type_safe.Type_Safe import Type_Safe # Type_Safe base class for type-safe attributes
7
7
  from osbot_utils.helpers.Random_Guid import Random_Guid # Helper for generating unique IDs
8
8
  from osbot_utils.helpers.generators.Generator_Context_Manager import Generator_Context_Manager
9
9
  from osbot_utils.helpers.generators.Model__Generator_State import Model__Generator_State
@@ -1,5 +1,5 @@
1
1
  from types import GeneratorType
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.Random_Guid import Random_Guid
4
4
  from osbot_utils.helpers.generators.Model__Generator_State import Model__Generator_State
5
5
 
@@ -1,7 +1,7 @@
1
1
  import time
2
2
  from queue import Queue, Empty
3
3
  from threading import Thread
4
- from osbot_utils.base_classes.Type_Safe import Type_Safe
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
5
  from osbot_utils.helpers.pubsub.schemas.Schema__Event import Schema__Event
6
6
  from osbot_utils.helpers.pubsub.schemas.Schema__Event__Message import Schema__Event__Message
7
7
  from osbot_utils.utils.Misc import random_text, timestamp_utc_now, random_guid
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
  from osbot_utils.decorators.methods.cache_on_self import cache_on_self
3
3
  from osbot_utils.utils.Files import current_temp_folder, path_combine, folder_create, file_exists, file_delete
4
4
  from osbot_utils.utils.Misc import random_filename
@@ -1,5 +1,5 @@
1
1
  import types
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.cache_requests.Cache__Requests__Actions import Cache__Requests__Actions
4
4
  from osbot_utils.helpers.cache_requests.Cache__Requests__Config import Cache__Requests__Config
5
5
  from osbot_utils.helpers.cache_requests.Cache__Requests__Data import Cache__Requests__Data
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
  from osbot_utils.helpers.cache_requests.Cache__Requests__Config import Cache__Requests__Config
3
3
  from osbot_utils.helpers.sqlite.cache.Sqlite__DB__Requests import Sqlite__DB__Requests
4
4
 
@@ -1,5 +1,5 @@
1
1
  from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.decorators.methods.cache_on_self import cache_on_self
4
4
  from osbot_utils.helpers.ssh.SCP import SCP
5
5
  from osbot_utils.helpers.ssh.SSH__Execute import SSH__Execute
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
  from osbot_utils.context_managers.capture_duration import capture_duration
3
3
  from osbot_utils.decorators.lists.group_by import group_by
4
4
  from osbot_utils.decorators.lists.index_by import index_by
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
  from osbot_utils.helpers.ssh.SSH__Execute import SSH__Execute
3
3
  from osbot_utils.helpers.ssh.SSH__Linux import SSH__Linux
4
4
  from osbot_utils.utils.Dev import pprint
@@ -1,5 +1,5 @@
1
1
 
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.utils.Dev import pprint # todo: fix test requirement of mock to use this method
4
4
 
5
5
 
@@ -0,0 +1,7 @@
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
+
3
+
4
+ class Xml__Attribute(Type_Safe):
5
+ name : str
6
+ value : str
7
+ namespace: str
@@ -1,5 +1,5 @@
1
1
  from typing import Dict, List, Union
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.xml.Xml__Attribute import Xml__Attribute
4
4
 
5
5
  class XML__Element(Type_Safe):
@@ -1,5 +1,5 @@
1
1
  from typing import Dict
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.xml.Xml__Element import XML__Element
4
4
 
5
5
  class Xml__File(Type_Safe):
@@ -1,7 +1,7 @@
1
1
  from io import StringIO
2
2
  from typing import List, Union, Dict
3
3
  from xml.etree.ElementTree import iterparse, Element, fromstring, ParseError
4
- from osbot_utils.base_classes.Type_Safe import Type_Safe
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
5
  from osbot_utils.helpers.xml.Xml__Attribute import Xml__Attribute
6
6
  from osbot_utils.helpers.xml.Xml__Element import XML__Element
7
7
  from osbot_utils.helpers.xml.Xml__File import Xml__File
@@ -1,5 +1,5 @@
1
1
  from typing import Dict, Any
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.xml.Xml__Element import XML__Element
4
4
  from osbot_utils.helpers.xml.Xml__File import Xml__File
5
5
 
@@ -1,7 +1,7 @@
1
1
  from typing import Optional
2
2
  from xml.etree.ElementTree import Element, SubElement, tostring
3
3
  from xml.dom import minidom
4
- from osbot_utils.base_classes.Type_Safe import Type_Safe
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
5
  from osbot_utils.helpers.xml.Xml__Element import XML__Element
6
6
  from osbot_utils.helpers.xml.Xml__File import Xml__File
7
7
 
@@ -1,5 +1,5 @@
1
1
  from typing import Any, Dict, List
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.xml.rss.RSS__Image import RSS__Image
4
4
  from osbot_utils.helpers.xml.rss.RSS__Item import RSS__Item
5
5
 
@@ -0,0 +1,7 @@
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
+
3
+
4
+ class RSS__Enclosure(Type_Safe):
5
+ url : str
6
+ type : str
7
+ length : int
@@ -1,5 +1,5 @@
1
1
  from typing import Dict, Any
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.xml.rss.RSS__Channel import RSS__Channel
4
4
 
5
5
  DEFAULT__RSS_FEED__VERSION = "2.0"
@@ -1,4 +1,4 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
1
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
2
2
 
3
3
  class RSS__Image(Type_Safe):
4
4
  url : str
@@ -1,5 +1,5 @@
1
1
  from typing import Dict, List, Any
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.helpers.Guid import Guid
4
4
  from osbot_utils.helpers.xml.rss.RSS__Enclosure import RSS__Enclosure
5
5
 
@@ -1,5 +1,5 @@
1
1
  import os
2
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
3
  from osbot_utils.utils.Env import del_env, set_env
4
4
 
5
5
 
@@ -84,11 +84,11 @@ class Type_Safe:
84
84
  raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'") # Raise error if attribute is not a valid getter/setter
85
85
 
86
86
  def __setattr__(self, name, value):
87
- from osbot_utils.utils.Objects import convert_dict_to_value_from_obj_annotation
88
- from osbot_utils.utils.Objects import convert_to_value_from_obj_annotation
89
- from osbot_utils.utils.Objects import value_type_matches_obj_annotation_for_attr
90
- from osbot_utils.utils.Objects import value_type_matches_obj_annotation_for_union_and_annotated
91
- from osbot_utils.helpers.type_safe.Type_Safe__Validator import Type_Safe__Validator
87
+ from osbot_utils.utils.Objects import convert_dict_to_value_from_obj_annotation
88
+ from osbot_utils.utils.Objects import convert_to_value_from_obj_annotation
89
+ from osbot_utils.utils.Objects import value_type_matches_obj_annotation_for_attr
90
+ from osbot_utils.utils.Objects import value_type_matches_obj_annotation_for_union_and_annotated
91
+ from osbot_utils.type_safe.Type_Safe__Validator import Type_Safe__Validator
92
92
 
93
93
  annotations = all_annotations(self)
94
94
  if not annotations: # can't do type safety checks if the class does not have annotations
@@ -184,8 +184,8 @@ class Type_Safe:
184
184
  @classmethod
185
185
  def __default__value__(cls, var_type):
186
186
  import typing
187
- from osbot_utils.base_classes.Type_Safe__List import Type_Safe__List
188
- from osbot_utils.base_classes.Type_Safe__Dict import Type_Safe__Dict
187
+ from osbot_utils.type_safe.Type_Safe__List import Type_Safe__List
188
+ from osbot_utils.type_safe.Type_Safe__Dict import Type_Safe__Dict
189
189
 
190
190
  if var_type is typing.Set: # todo: refactor the dict, set and list logic, since they are 90% the same
191
191
  return set()
@@ -324,7 +324,7 @@ class Type_Safe:
324
324
  return value
325
325
 
326
326
  def deserialize_dict__using_key_value_annotations(self, key, value):
327
- from osbot_utils.base_classes.Type_Safe__Dict import Type_Safe__Dict
327
+ from osbot_utils.type_safe.Type_Safe__Dict import Type_Safe__Dict
328
328
 
329
329
  dict_annotations_tuple = get_args(self.__annotations__[key])
330
330
  if not dict_annotations_tuple: # happens when the value is a dict/Dict with no annotations
@@ -353,7 +353,7 @@ class Type_Safe:
353
353
  def deserialize_from_dict(self, data, raise_on_not_found=False):
354
354
  from decimal import Decimal
355
355
  from enum import EnumMeta
356
- from osbot_utils.base_classes.Type_Safe__List import Type_Safe__List
356
+ from osbot_utils.type_safe.Type_Safe__List import Type_Safe__List
357
357
  from osbot_utils.helpers.Random_Guid import Random_Guid
358
358
  from osbot_utils.helpers.Random_Guid_Short import Random_Guid_Short
359
359
  from osbot_utils.utils.Objects import obj_is_attribute_annotation_of_type
@@ -85,6 +85,9 @@ class Type_Safe__Base:
85
85
  actual_type_name = type_str(type(item))
86
86
  raise TypeError(f"Expected '{expected_type_name}', but got '{actual_type_name}'")
87
87
 
88
+ def json(self):
89
+ raise NotImplemented
90
+
88
91
  # todo: see if we should/can move this to the Objects.py file
89
92
  def type_str(tp):
90
93
  origin = get_origin(tp)
@@ -0,0 +1,39 @@
1
+ from osbot_utils.type_safe.Type_Safe__Base import type_str, Type_Safe__Base
2
+
3
+ class Type_Safe__Dict(Type_Safe__Base, dict):
4
+ def __init__(self, expected_key_type, expected_value_type, *args, **kwargs):
5
+ super().__init__(*args, **kwargs)
6
+
7
+ self.expected_key_type = expected_key_type
8
+ self.expected_value_type = expected_value_type
9
+
10
+ for k, v in self.items(): # check type-safety of ctor arguments
11
+ self.is_instance_of_type(k, self.expected_key_type )
12
+ self.is_instance_of_type(v, self.expected_value_type)
13
+
14
+ def __setitem__(self, key, value): # Check type-safety before allowing assignment.
15
+ self.is_instance_of_type(key, self.expected_key_type)
16
+ self.is_instance_of_type(value, self.expected_value_type)
17
+ super().__setitem__(key, value)
18
+
19
+ def __repr__(self):
20
+ key_type_name = type_str(self.expected_key_type)
21
+ value_type_name = type_str(self.expected_value_type)
22
+ return f"dict[{key_type_name}, {value_type_name}] with {len(self)} entries"
23
+
24
+ def json(self): # Convert the dictionary to a JSON-serializable format.
25
+ from osbot_utils.type_safe.Type_Safe import Type_Safe # can only import this here to avoid circular imports
26
+
27
+ result = {}
28
+ for key, value in self.items():
29
+ if isinstance(value, Type_Safe): # Handle Type_Safe objects in values
30
+ result[key] = value.json()
31
+ elif isinstance(value, (list, tuple)): # Handle lists/tuples that might contain Type_Safe objects
32
+ result[key] = [item.json() if isinstance(item, Type_Safe) else item
33
+ for item in value]
34
+ elif isinstance(value, dict): # Handle nested dictionaries that might contain Type_Safe objects
35
+ result[key] = {k: v.json() if isinstance(v, Type_Safe) else v
36
+ for k, v in value.items()}
37
+ else: # Regular values can be used as-is
38
+ result[key] = value
39
+ return result
@@ -0,0 +1,34 @@
1
+ from osbot_utils.type_safe.Type_Safe__Base import Type_Safe__Base, type_str
2
+
3
+ class Type_Safe__List(Type_Safe__Base, list):
4
+
5
+ def __init__(self, expected_type, *args):
6
+ super().__init__(*args)
7
+ self.expected_type = expected_type
8
+
9
+ def __repr__(self):
10
+ expected_type_name = type_str(self.expected_type)
11
+ return f"list[{expected_type_name}] with {len(self)} elements"
12
+
13
+ def append(self, item):
14
+ try:
15
+ self.is_instance_of_type(item, self.expected_type)
16
+ except TypeError as e:
17
+ raise TypeError(f"In Type_Safe__List: Invalid type for item: {e}")
18
+ super().append(item)
19
+
20
+
21
+ def json(self): # Convert the list to a JSON-serializable format.
22
+ from osbot_utils.type_safe.Type_Safe import Type_Safe # Import here to avoid circular imports
23
+
24
+ result = []
25
+ for item in self:
26
+ if isinstance(item, Type_Safe):
27
+ result.append(item.json())
28
+ elif isinstance(item, (list, tuple)):
29
+ result.append([x.json() if isinstance(x, Type_Safe) else x for x in item])
30
+ elif isinstance(item, dict):
31
+ result.append({k: v.json() if isinstance(v, Type_Safe) else v for k, v in item.items()})
32
+ else:
33
+ result.append(item)
34
+ return result
@@ -1,5 +1,5 @@
1
1
  from typing import Any
2
- from osbot_utils.helpers.type_safe.Type_Safe__Validator import Type_Safe__Validator
2
+ from osbot_utils.type_safe.Type_Safe__Validator import Type_Safe__Validator
3
3
 
4
4
 
5
5
  class Validator__Max(Type_Safe__Validator): # Validates that a numeric value is at most the specified maximum."""
@@ -1,5 +1,5 @@
1
1
  from typing import Any
2
- from osbot_utils.helpers.type_safe.Type_Safe__Validator import Type_Safe__Validator
2
+ from osbot_utils.type_safe.Type_Safe__Validator import Type_Safe__Validator
3
3
 
4
4
  class Validator__Min(Type_Safe__Validator): # Validates that a value is at least the specified minimum. Works with any type that supports the < operator (numbers, strings, lists, etc.)
5
5
  min_value: Any
@@ -1,5 +1,5 @@
1
1
  from typing import Any
2
- from osbot_utils.helpers.type_safe.Type_Safe__Validator import Type_Safe__Validator
2
+ from osbot_utils.type_safe.Type_Safe__Validator import Type_Safe__Validator
3
3
 
4
4
 
5
5
  class Validator__One_Of(Type_Safe__Validator): # Validates that a value is one of a set of allowed values."""
@@ -1,5 +1,5 @@
1
1
  from typing import Any
2
- from osbot_utils.helpers.type_safe.Type_Safe__Validator import Type_Safe__Validator
2
+ from osbot_utils.type_safe.Type_Safe__Validator import Type_Safe__Validator
3
3
 
4
4
  class Validator__Regex(Type_Safe__Validator): # Validates that a string matches the specified regex pattern.
5
5
  pattern : str
@@ -4,10 +4,10 @@ import sys
4
4
  import types
5
5
  from logging import Logger, StreamHandler, FileHandler
6
6
  from logging.handlers import MemoryHandler
7
- from osbot_utils.base_classes.Type_Safe import Type_Safe
8
7
  from osbot_utils.decorators.lists.group_by import group_by
9
8
  from osbot_utils.decorators.lists.index_by import index_by
10
9
  from osbot_utils.decorators.methods.cache_on_function import cache_on_function
10
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
11
11
  from osbot_utils.utils.Misc import random_string
12
12
  from osbot_utils.utils.Files import temp_file
13
13
  from osbot_utils.utils.Objects import obj_dict
@@ -0,0 +1 @@
1
+ v2.1.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.95.0"
3
+ version = "v2.1.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,22 +0,0 @@
1
- from osbot_utils.base_classes.Type_Safe__Base import type_str, Type_Safe__Base
2
-
3
- class Type_Safe__Dict(Type_Safe__Base, dict):
4
- def __init__(self, expected_key_type, expected_value_type, *args, **kwargs):
5
- super().__init__(*args, **kwargs)
6
-
7
- self.expected_key_type = expected_key_type
8
- self.expected_value_type = expected_value_type
9
-
10
- for k, v in self.items(): # check type-safety of ctor arguments
11
- self.is_instance_of_type(k, self.expected_key_type )
12
- self.is_instance_of_type(v, self.expected_value_type)
13
-
14
- def __setitem__(self, key, value): # Check type-safety before allowing assignment.
15
- self.is_instance_of_type(key, self.expected_key_type)
16
- self.is_instance_of_type(value, self.expected_value_type)
17
- super().__setitem__(key, value)
18
-
19
- def __repr__(self):
20
- key_type_name = type_str(self.expected_key_type)
21
- value_type_name = type_str(self.expected_value_type)
22
- return f"dict[{key_type_name}, {value_type_name}] with {len(self)} entries"
@@ -1,22 +0,0 @@
1
- from osbot_utils.base_classes.Type_Safe__Base import Type_Safe__Base, type_str
2
-
3
-
4
- class Type_Safe__List(Type_Safe__Base, list):
5
-
6
- def __init__(self, expected_type, *args):
7
- super().__init__(*args)
8
- self.expected_type = expected_type
9
-
10
- def __repr__(self):
11
- expected_type_name = type_str(self.expected_type)
12
- return f"list[{expected_type_name}] with {len(self)} elements"
13
-
14
- def append(self, item):
15
- try:
16
- self.is_instance_of_type(item, self.expected_type)
17
- except TypeError as e:
18
- raise TypeError(f"In Type_Safe__List: Invalid type for item: {e}")
19
- super().append(item)
20
-
21
-
22
-