osbot-utils 2.76.0__tar.gz → 2.78.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/PKG-INFO +3 -3
  2. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/README.md +2 -2
  3. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Ast_Load.py +5 -5
  4. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/Tag__Base.py +1 -1
  5. osbot_utils-2.78.0/osbot_utils/helpers/html/tags/Tag__Body.py +5 -0
  6. osbot_utils-2.78.0/osbot_utils/helpers/html/tags/Tag__Div.py +5 -0
  7. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/Tag__H.py +1 -1
  8. osbot_utils-2.78.0/osbot_utils/helpers/html/tags/Tag__HR.py +5 -0
  9. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/Tag__Head.py +3 -3
  10. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/Tag__Html.py +3 -3
  11. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/Tag__Link.py +1 -1
  12. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/Tag__Style.py +2 -2
  13. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/Tag__Text.py +1 -1
  14. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/Html_Dict__To__Html.py +1 -1
  15. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/Html_Dict__To__Html_Document.py +1 -1
  16. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/Html_Dict__To__Html_Tags.py +8 -8
  17. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/Html_Document__To__Html_Dict.py +1 -1
  18. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/Html__To__Html_Document.py +4 -4
  19. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/Html__To__Html_Tag.py +2 -2
  20. osbot_utils-2.78.0/osbot_utils/helpers/html/utils/Html__Query.py +226 -0
  21. osbot_utils-2.78.0/osbot_utils/testing/test_data/const__test__data__html.py +45 -0
  22. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/methods/Type_Safe__Method.py +25 -6
  23. osbot_utils-2.78.0/osbot_utils/type_safe/type_safe_core/shared/__init__.py +0 -0
  24. osbot_utils-2.78.0/osbot_utils/type_safe/type_safe_core/steps/__init__.py +0 -0
  25. osbot_utils-2.78.0/osbot_utils/type_safe/validators/__init__.py +0 -0
  26. osbot_utils-2.78.0/osbot_utils/utils/__init__.py +0 -0
  27. osbot_utils-2.78.0/osbot_utils/version +1 -0
  28. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/pyproject.toml +1 -1
  29. osbot_utils-2.76.0/osbot_utils/helpers/html/Tag__Body.py +0 -5
  30. osbot_utils-2.76.0/osbot_utils/helpers/html/Tag__Div.py +0 -5
  31. osbot_utils-2.76.0/osbot_utils/helpers/html/Tag__HR.py +0 -5
  32. osbot_utils-2.76.0/osbot_utils/version +0 -1
  33. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/LICENSE +0 -0
  34. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/__init__.py +0 -0
  35. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  36. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  37. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  38. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/base_classes/__init__.py +0 -0
  39. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/context_managers/__init__.py +0 -0
  40. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  41. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  42. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/__init__.py +0 -0
  43. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  44. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  45. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  46. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  47. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  48. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  49. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  50. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/cache.py +0 -0
  51. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  52. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  53. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  54. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  55. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  56. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/catch.py +0 -0
  57. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/context.py +0 -0
  58. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  59. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  60. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  61. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  62. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  63. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  64. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  65. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/fluent/__init__.py +0 -0
  66. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/CFormat.py +0 -0
  67. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/CPrint.py +0 -0
  68. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  69. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  70. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  71. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  72. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  73. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  74. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Print_Table.py +0 -0
  75. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  76. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  77. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  78. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  79. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  80. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/__init__.py +0 -0
  81. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  82. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  83. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  84. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  85. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  86. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  87. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  88. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  89. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  90. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  91. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  92. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  93. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  94. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  95. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  96. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  97. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  98. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  99. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  100. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  101. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  102. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  103. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  104. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  105. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  106. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  107. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  108. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  109. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  110. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  111. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  112. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  113. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  114. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  115. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  116. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  117. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  118. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  119. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  120. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  121. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  122. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  123. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  124. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  125. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  126. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  127. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  128. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  129. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  130. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  131. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  132. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  133. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  134. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  135. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  136. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  137. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  138. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  139. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  140. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  141. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  142. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  143. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  144. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  145. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  146. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  147. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  148. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  149. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  150. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  151. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  152. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  153. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  154. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  155. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  156. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_on_self/Cache_Controller.py +0 -0
  157. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_on_self/Cache_Key_Generator.py +0 -0
  158. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_on_self/Cache_Metrics.py +0 -0
  159. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_on_self/Cache_On_Self.py +0 -0
  160. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_on_self/Cache_Storage.py +0 -0
  161. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_on_self/__init__.py +0 -0
  162. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  163. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  164. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  165. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  166. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  167. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  168. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  169. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/Duration.py +0 -0
  170. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/__init__.py +0 -0
  171. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/decorators/__init__.py +0 -0
  172. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/decorators/capture_duration.py +0 -0
  173. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/decorators/duration.py +0 -0
  174. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/decorators/print_duration.py +0 -0
  175. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/schemas/Schema__Duration.py +0 -0
  176. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/duration/schemas/__init__.py +0 -0
  177. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  178. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/Task.py +0 -0
  179. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  180. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -0
  181. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
  182. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +0 -0
  183. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +0 -0
  184. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/actions/__init__.py +0 -0
  185. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  186. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  187. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  188. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  189. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  190. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  191. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  192. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
  193. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
  194. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  195. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
  196. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
  197. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
  198. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
  199. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
  200. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +0 -0
  201. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +0 -0
  202. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
  203. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +0 -0
  204. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/flows/schemas/__init__.py +0 -0
  205. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  206. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  207. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  208. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  209. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  210. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/html/__init__.py +0 -0
  211. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/html/schemas/Schema__Html_Document.py +0 -0
  212. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node.py +0 -0
  213. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data.py +0 -0
  214. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +0 -0
  215. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/html/schemas/__init__.py +0 -0
  216. {osbot_utils-2.76.0/osbot_utils/helpers/llms → osbot_utils-2.78.0/osbot_utils/helpers/html/tags}/__init__.py +0 -0
  217. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/CSS_Dict__To__Css.py +0 -0
  218. {osbot_utils-2.76.0/osbot_utils/helpers/html → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/Html__To__Html_Dict.py +0 -0
  219. {osbot_utils-2.76.0/osbot_utils/helpers/llms/actions → osbot_utils-2.78.0/osbot_utils/helpers/html/transformers}/__init__.py +0 -0
  220. {osbot_utils-2.76.0/osbot_utils/helpers/llms/builders → osbot_utils-2.78.0/osbot_utils/helpers/html/utils}/__init__.py +0 -0
  221. {osbot_utils-2.76.0/osbot_utils/helpers/llms/cache → osbot_utils-2.78.0/osbot_utils/helpers/llms}/__init__.py +0 -0
  222. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/actions/LLM_Request__Execute.py +0 -0
  223. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py +0 -0
  224. {osbot_utils-2.76.0/osbot_utils/helpers/llms/platforms → osbot_utils-2.78.0/osbot_utils/helpers/llms/actions}/__init__.py +0 -0
  225. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder.py +0 -0
  226. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py +0 -0
  227. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/builders/LLM_Request__Factory.py +0 -0
  228. {osbot_utils-2.76.0/osbot_utils/helpers/llms/platforms/open_ai → osbot_utils-2.78.0/osbot_utils/helpers/llms/builders}/__init__.py +0 -0
  229. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py +0 -0
  230. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache.py +0 -0
  231. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__File_System.py +0 -0
  232. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__Storage.py +0 -0
  233. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Local__Folder.py +0 -0
  234. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Sqlite.py +0 -0
  235. {osbot_utils-2.76.0/osbot_utils/helpers/llms/schemas → osbot_utils-2.78.0/osbot_utils/helpers/llms/cache}/__init__.py +0 -0
  236. {osbot_utils-2.76.0/osbot_utils/helpers/pubsub → osbot_utils-2.78.0/osbot_utils/helpers/llms/platforms}/__init__.py +0 -0
  237. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/platforms/open_ai/API__LLM__Open_AI.py +0 -0
  238. {osbot_utils-2.76.0/osbot_utils/helpers/pubsub/schemas → osbot_utils-2.78.0/osbot_utils/helpers/llms/platforms/open_ai}/__init__.py +0 -0
  239. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Safe_Str__LLM__Model_Name.py +0 -0
  240. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Cache__Index.py +0 -0
  241. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request.py +0 -0
  242. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Data.py +0 -0
  243. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Function_Call.py +0 -0
  244. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Content.py +0 -0
  245. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Role.py +0 -0
  246. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response.py +0 -0
  247. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response__Cache.py +0 -0
  248. {osbot_utils-2.76.0/osbot_utils/helpers/python_compatibility → osbot_utils-2.78.0/osbot_utils/helpers/llms/schemas}/__init__.py +0 -0
  249. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  250. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  251. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  252. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  253. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  254. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite → osbot_utils-2.78.0/osbot_utils/helpers/pubsub}/__init__.py +0 -0
  255. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  256. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  257. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  258. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  259. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  260. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  261. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  262. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  263. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite/cache → osbot_utils-2.78.0/osbot_utils/helpers/pubsub/schemas}/__init__.py +0 -0
  264. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite/domains → osbot_utils-2.78.0/osbot_utils/helpers/python_compatibility}/__init__.py +0 -0
  265. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  266. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  267. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  268. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  269. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  270. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  271. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  272. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  273. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  274. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  275. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite/domains/schemas → osbot_utils-2.78.0/osbot_utils/helpers/sqlite}/__init__.py +0 -0
  276. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  277. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  278. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  279. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  280. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  281. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  282. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  283. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite/models → osbot_utils-2.78.0/osbot_utils/helpers/sqlite/cache}/__init__.py +0 -0
  284. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  285. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  286. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  287. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  288. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  289. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite/sample_data → osbot_utils-2.78.0/osbot_utils/helpers/sqlite/domains}/__init__.py +0 -0
  290. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite/sql_builder → osbot_utils-2.78.0/osbot_utils/helpers/sqlite/domains/schemas}/__init__.py +0 -0
  291. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  292. {osbot_utils-2.76.0/osbot_utils/helpers/sqlite/tables → osbot_utils-2.78.0/osbot_utils/helpers/sqlite/models}/__init__.py +0 -0
  293. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  294. {osbot_utils-2.76.0/osbot_utils/helpers/ssh → osbot_utils-2.78.0/osbot_utils/helpers/sqlite/sample_data}/__init__.py +0 -0
  295. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  296. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  297. {osbot_utils-2.76.0/osbot_utils/helpers/trace → osbot_utils-2.78.0/osbot_utils/helpers/sqlite/sql_builder}/__init__.py +0 -0
  298. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  299. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  300. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  301. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  302. {osbot_utils-2.76.0/osbot_utils/helpers/xml → osbot_utils-2.78.0/osbot_utils/helpers/sqlite/tables}/__init__.py +0 -0
  303. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  304. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  305. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  306. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  307. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  308. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  309. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  310. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  311. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  312. {osbot_utils-2.76.0/osbot_utils/testing → osbot_utils-2.78.0/osbot_utils/helpers/ssh}/__init__.py +0 -0
  313. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  314. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  315. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  316. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  317. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  318. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  319. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  320. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  321. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  322. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  323. {osbot_utils-2.76.0/osbot_utils/testing/performance → osbot_utils-2.78.0/osbot_utils/helpers/trace}/__init__.py +0 -0
  324. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  325. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  326. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  327. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  328. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  329. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  330. {osbot_utils-2.76.0/osbot_utils/testing/performance/models → osbot_utils-2.78.0/osbot_utils/helpers/xml}/__init__.py +0 -0
  331. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  332. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  333. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  334. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  335. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  336. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  337. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Catch.py +0 -0
  338. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  339. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Hook_Method.py +0 -0
  340. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  341. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Log_To_String.py +0 -0
  342. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Logging.py +0 -0
  343. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Patch_Print.py +0 -0
  344. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Profiler.py +0 -0
  345. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Pytest.py +0 -0
  346. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Stderr.py +0 -0
  347. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Stdout.py +0 -0
  348. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  349. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Temp_File.py +0 -0
  350. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  351. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  352. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  353. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  354. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  355. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Unit_Test.py +0 -0
  356. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/Unzip_File.py +0 -0
  357. {osbot_utils-2.76.0/osbot_utils/type_safe → osbot_utils-2.78.0/osbot_utils/testing}/__init__.py +0 -0
  358. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  359. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives → osbot_utils-2.78.0/osbot_utils/testing/performance}/__init__.py +0 -0
  360. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  361. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  362. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_float → osbot_utils-2.78.0/osbot_utils/testing/performance/models}/__init__.py +0 -0
  363. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str → osbot_utils-2.78.0/osbot_utils/testing/test_data}/__init__.py +0 -0
  364. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/Type_Safe.py +0 -0
  365. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  366. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/Type_Safe__Primitive.py +0 -0
  367. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/cryptography → osbot_utils-2.78.0/osbot_utils/type_safe}/__init__.py +0 -0
  368. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes → osbot_utils-2.78.0/osbot_utils/type_safe/primitives}/__init__.py +0 -0
  369. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float.py +0 -0
  370. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Engineering.py +0 -0
  371. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Money.py +0 -0
  372. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_float/Safe_Float__Percentage_Exact.py +0 -0
  373. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_float}/__init__.py +0 -0
  374. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_int/Safe_Int.py +0 -0
  375. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_int/Timestamp_Now.py +0 -0
  376. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_int/__init__.py +0 -0
  377. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/Enum__Safe_Str__Regex_Mode.py +0 -0
  378. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/Safe_Str.py +0 -0
  379. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/filesystem → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str}/__init__.py +0 -0
  380. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/git → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/cryptography}/__init__.py +0 -0
  381. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__Hash.py +0 -0
  382. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1.py +0 -0
  383. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes/Safe_Str__SHA1__Short.py +0 -0
  384. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/github → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/cryptography/hashes}/__init__.py +0 -0
  385. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Private_Key.py +0 -0
  386. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Safe_Str__NaCl__Public_Key.py +0 -0
  387. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl/Schema__NaCl__Keys.py +0 -0
  388. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/http → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/cryptography/nacl}/__init__.py +0 -0
  389. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Name.py +0 -0
  390. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/filesystem/Safe_Str__File__Path.py +0 -0
  391. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/identifiers → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/filesystem}/__init__.py +0 -0
  392. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Branch.py +0 -0
  393. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref.py +0 -0
  394. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Ref_Base.py +0 -0
  395. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Git__Tag.py +0 -0
  396. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/git/Safe_Str__Version.py +0 -0
  397. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/text → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/git}/__init__.py +0 -0
  398. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo.py +0 -0
  399. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Name.py +0 -0
  400. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/github/Safe_Str__GitHub__Repo_Owner.py +0 -0
  401. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_str/web → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/github}/__init__.py +0 -0
  402. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Content_Type.py +0 -0
  403. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__ETag.py +0 -0
  404. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Last_Modified.py +0 -0
  405. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/http/Safe_Str__Http__Text.py +0 -0
  406. {osbot_utils-2.76.0/osbot_utils/type_safe/primitives/safe_uint → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/http}/__init__.py +0 -0
  407. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Guid.py +0 -0
  408. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid.py +0 -0
  409. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Random_Guid_Short.py +0 -0
  410. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/identifiers/Safe_Id.py +0 -0
  411. {osbot_utils-2.76.0/osbot_utils/type_safe/type_safe_core → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/identifiers}/__init__.py +0 -0
  412. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text.py +0 -0
  413. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/text/Safe_Str__Text__Dangerous.py +0 -0
  414. {osbot_utils-2.76.0/osbot_utils/type_safe/type_safe_core/collections → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/text}/__init__.py +0 -0
  415. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Html.py +0 -0
  416. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__IP_Address.py +0 -0
  417. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_str/web/Safe_Str__Url.py +0 -0
  418. {osbot_utils-2.76.0/osbot_utils/type_safe/type_safe_core/decorators → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_str/web}/__init__.py +0 -0
  419. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt.py +0 -0
  420. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Byte.py +0 -0
  421. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__FileSize.py +0 -0
  422. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Percentage.py +0 -0
  423. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/primitives/safe_uint/Safe_UInt__Port.py +0 -0
  424. {osbot_utils-2.76.0/osbot_utils/type_safe/type_safe_core/methods → osbot_utils-2.78.0/osbot_utils/type_safe/primitives/safe_uint}/__init__.py +0 -0
  425. {osbot_utils-2.76.0/osbot_utils/type_safe/type_safe_core/shared → osbot_utils-2.78.0/osbot_utils/type_safe/type_safe_core}/__init__.py +0 -0
  426. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Dict.py +0 -0
  427. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__List.py +0 -0
  428. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Set.py +0 -0
  429. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/collections/Type_Safe__Tuple.py +0 -0
  430. {osbot_utils-2.76.0/osbot_utils/type_safe/type_safe_core/steps → osbot_utils-2.78.0/osbot_utils/type_safe/type_safe_core/collections}/__init__.py +0 -0
  431. {osbot_utils-2.76.0/osbot_utils/type_safe/validators → osbot_utils-2.78.0/osbot_utils/type_safe/type_safe_core/decorators}/__init__.py +0 -0
  432. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/decorators/type_safe.py +0 -0
  433. {osbot_utils-2.76.0/osbot_utils/utils → osbot_utils-2.78.0/osbot_utils/type_safe/type_safe_core/methods}/__init__.py +0 -0
  434. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/methods/type_safe_property.py +0 -0
  435. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Annotations.py +0 -0
  436. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Cache.py +0 -0
  437. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Convert.py +0 -0
  438. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor.py +0 -0
  439. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
  440. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Not_Cached.py +0 -0
  441. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Raise_Exception.py +0 -0
  442. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Shared__Variables.py +0 -0
  443. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/shared/Type_Safe__Validation.py +0 -0
  444. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
  445. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  446. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Default_Value.py +0 -0
  447. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__From_Json.py +0 -0
  448. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Init.py +0 -0
  449. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/type_safe_core/steps/Type_Safe__Step__Set_Attr.py +0 -0
  450. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  451. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  452. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  453. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  454. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  455. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Assert.py +0 -0
  456. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Call_Stack.py +0 -0
  457. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Csv.py +0 -0
  458. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Dev.py +0 -0
  459. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Env.py +0 -0
  460. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Exceptions.py +0 -0
  461. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Files.py +0 -0
  462. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Functions.py +0 -0
  463. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Http.py +0 -0
  464. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Int.py +0 -0
  465. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Json.py +0 -0
  466. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Json_Cache.py +0 -0
  467. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Lists.py +0 -0
  468. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Misc.py +0 -0
  469. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Objects.py +0 -0
  470. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Png.py +0 -0
  471. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Process.py +0 -0
  472. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Python_Logger.py +0 -0
  473. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Regex.py +0 -0
  474. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Status.py +0 -0
  475. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Str.py +0 -0
  476. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Threads.py +0 -0
  477. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Toml.py +0 -0
  478. {osbot_utils-2.76.0 → osbot_utils-2.78.0}/osbot_utils/utils/Version.py +0 -0
  479. {osbot_utils-2.76.0 → osbot_utils-2.78.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.76.0
3
+ Version: 2.78.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.76.0-blue)
24
+ ![Current Release](https://img.shields.io/badge/release-v2.78.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)
@@ -93,7 +93,7 @@ fetcher.fetch(10) # Returns cached result
93
93
  ### HTML Parsing
94
94
 
95
95
  ```python
96
- from osbot_utils.helpers.html.Html__To__Html_Dict import html_to_dict
96
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import html_to_dict
97
97
 
98
98
  html_code = "<html><body><h1>Hello</h1></body></html>"
99
99
  print(html_to_dict(html_code))
@@ -1,6 +1,6 @@
1
1
  # OSBot-Utils
2
2
 
3
- ![Current Release](https://img.shields.io/badge/release-v2.76.0-blue)
3
+ ![Current Release](https://img.shields.io/badge/release-v2.78.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)
@@ -72,7 +72,7 @@ fetcher.fetch(10) # Returns cached result
72
72
  ### HTML Parsing
73
73
 
74
74
  ```python
75
- from osbot_utils.helpers.html.Html__To__Html_Dict import html_to_dict
75
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import html_to_dict
76
76
 
77
77
  html_code = "<html><body><h1>Hello</h1></body></html>"
78
78
  print(html_to_dict(html_code))
@@ -1,11 +1,11 @@
1
1
  import ast
2
2
 
3
- from osbot_utils.helpers.Type_Registry import type_registry
4
- from osbot_utils.utils.Files import file_contents, file_exists
5
- from osbot_utils.utils.Functions import python_file
6
- from osbot_utils.helpers.ast.Ast_Node import Ast_Node
3
+ from osbot_utils.helpers.Type_Registry import type_registry
4
+ from osbot_utils.utils.Files import file_contents, file_exists
5
+ from osbot_utils.utils.Functions import python_file
6
+ from osbot_utils.helpers.ast.Ast_Node import Ast_Node
7
7
 
8
- #todo: check if this is stll needed since it Ast_Visit does it similar
8
+ #todo: check if this is still needed since it Ast_Visit does it similar
9
9
  class Ast_Load(ast.NodeVisitor):
10
10
 
11
11
  def __init__(self):
@@ -1,6 +1,6 @@
1
1
  from collections import defaultdict
2
2
 
3
- from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT
3
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import STRING__SCHEMA_TEXT
4
4
  from osbot_utils.type_safe.Type_Safe import Type_Safe
5
5
  from osbot_utils.utils.Files import file_create
6
6
 
@@ -0,0 +1,5 @@
1
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
2
+
3
+
4
+ class Tag__Body(Tag__Base):
5
+ tag_name = 'body'
@@ -0,0 +1,5 @@
1
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
2
+
3
+
4
+ class Tag__Div(Tag__Base):
5
+ tag_name = 'div'
@@ -1,4 +1,4 @@
1
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
1
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
2
2
 
3
3
 
4
4
  class Tag__H(Tag__Base):
@@ -0,0 +1,5 @@
1
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
2
+
3
+
4
+ class Tag__HR(Tag__Base):
5
+ tag_name = 'hr'
@@ -1,8 +1,8 @@
1
1
  from typing import List
2
2
 
3
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
4
- from osbot_utils.helpers.html.Tag__Link import Tag__Link
5
- from osbot_utils.helpers.html.Tag__Style import Tag__Style
3
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
4
+ from osbot_utils.helpers.html.tags.Tag__Link import Tag__Link
5
+ from osbot_utils.helpers.html.tags.Tag__Style import Tag__Style
6
6
  from osbot_utils.utils.Dev import pprint
7
7
 
8
8
 
@@ -1,6 +1,6 @@
1
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
2
- from osbot_utils.helpers.html.Tag__Body import Tag__Body
3
- from osbot_utils.helpers.html.Tag__Head import Tag__Head
1
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
2
+ from osbot_utils.helpers.html.tags.Tag__Body import Tag__Body
3
+ from osbot_utils.helpers.html.tags.Tag__Head import Tag__Head
4
4
  from osbot_utils.utils.Misc import str_to_bytes
5
5
 
6
6
  ATTRIBUTES_NAMES__LINK = ['lang']
@@ -1,4 +1,4 @@
1
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
1
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
2
2
 
3
3
  ATTRIBUTES_NAMES__LINK = ['href', 'rel', 'integrity', 'crossorigin']
4
4
 
@@ -1,5 +1,5 @@
1
- from osbot_utils.helpers.html.CSS_Dict__To__Css import CSS_Dict__To__Css
2
- from osbot_utils.helpers.html.Tag__Base import Tag__Base, INDENT_SIZE
1
+ from osbot_utils.helpers.html.transformers.CSS_Dict__To__Css import CSS_Dict__To__Css
2
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base, INDENT_SIZE
3
3
 
4
4
 
5
5
  class Tag__Style(Tag__Base):
@@ -1,4 +1,4 @@
1
- from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT
1
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import STRING__SCHEMA_TEXT
2
2
 
3
3
 
4
4
  class Tag__Text:
@@ -1,4 +1,4 @@
1
- from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
1
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
2
2
 
3
3
  HTML_SELF_CLOSING_TAGS = {'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta',
4
4
  'param', 'source', 'track', 'wbr'}
@@ -1,5 +1,5 @@
1
1
  from typing import Dict, Any
2
- from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
2
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
3
3
  from osbot_utils.helpers.html.schemas.Schema__Html_Document import Schema__Html_Document
4
4
  from osbot_utils.helpers.html.schemas.Schema__Html_Node import Schema__Html_Node
5
5
  from osbot_utils.helpers.html.schemas.Schema__Html_Node__Data import Schema__Html_Node__Data
@@ -1,11 +1,11 @@
1
- from osbot_utils.helpers.html.Html_Dict__To__Html import HTML_SELF_CLOSING_TAGS
2
- from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
3
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
4
- from osbot_utils.helpers.html.Tag__Body import Tag__Body
5
- from osbot_utils.helpers.html.Tag__Head import Tag__Head
6
- from osbot_utils.helpers.html.Tag__Html import Tag__Html
7
- from osbot_utils.helpers.html.Tag__Link import Tag__Link
8
- from osbot_utils.helpers.html.Tag__Text import Tag__Text
1
+ from osbot_utils.helpers.html.transformers.Html_Dict__To__Html import HTML_SELF_CLOSING_TAGS
2
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
3
+ from osbot_utils.helpers.html.tags.Tag__Base import Tag__Base
4
+ from osbot_utils.helpers.html.tags.Tag__Body import Tag__Body
5
+ from osbot_utils.helpers.html.tags.Tag__Head import Tag__Head
6
+ from osbot_utils.helpers.html.tags.Tag__Html import Tag__Html
7
+ from osbot_utils.helpers.html.tags.Tag__Link import Tag__Link
8
+ from osbot_utils.helpers.html.tags.Tag__Text import Tag__Text
9
9
 
10
10
 
11
11
  class Html_Dict__To__Html_Tags:
@@ -1,5 +1,5 @@
1
1
  from typing import Dict, Any, List, Union
2
- from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES, STRING__SCHEMA_TAG, STRING__SCHEMA_ATTRS
2
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES, STRING__SCHEMA_TAG, STRING__SCHEMA_ATTRS
3
3
  from osbot_utils.helpers.html.schemas.Schema__Html_Document import Schema__Html_Document
4
4
  from osbot_utils.helpers.html.schemas.Schema__Html_Node import Schema__Html_Node
5
5
  from osbot_utils.type_safe.Type_Safe import Type_Safe
@@ -1,7 +1,7 @@
1
- from osbot_utils.helpers.html.Html_Dict__To__Html_Document import Html_Dict__To__Html_Document
2
- from osbot_utils.helpers.html.Html__To__Html_Dict import Html__To__Html_Dict
3
- from osbot_utils.helpers.html.schemas.Schema__Html_Document import Schema__Html_Document
4
- from osbot_utils.type_safe.Type_Safe import Type_Safe
1
+ from osbot_utils.helpers.html.transformers.Html_Dict__To__Html_Document import Html_Dict__To__Html_Document
2
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import Html__To__Html_Dict
3
+ from osbot_utils.helpers.html.schemas.Schema__Html_Document import Schema__Html_Document
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
5
 
6
6
  class Html__To__Html_Document(Type_Safe):
7
7
  html: str
@@ -1,5 +1,5 @@
1
- from osbot_utils.helpers.html.Html_Dict__To__Html_Tags import Html_Dict__To__Html_Tags
2
- from osbot_utils.helpers.html.Html__To__Html_Dict import Html__To__Html_Dict
1
+ from osbot_utils.helpers.html.transformers.Html_Dict__To__Html_Tags import Html_Dict__To__Html_Tags
2
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Dict import Html__To__Html_Dict
3
3
 
4
4
 
5
5
  class Html__To__Html_Tag:
@@ -0,0 +1,226 @@
1
+ from typing import List, Optional, Dict, Any
2
+ from osbot_utils.helpers.html.transformers.Html__To__Html_Document import Html__To__Html_Document
3
+ from osbot_utils.helpers.html.schemas.Schema__Html_Document import Schema__Html_Document
4
+ from osbot_utils.helpers.html.schemas.Schema__Html_Node import Schema__Html_Node
5
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
6
+
7
+
8
+ class Html__Query(Type_Safe):
9
+ html : str
10
+ document : Schema__Html_Document
11
+
12
+ def __enter__(self):
13
+ self.document = Html__To__Html_Document(html=self.html).convert()
14
+ return self
15
+
16
+ def __exit__(self, exc_type, exc_val, exc_tb):
17
+ pass
18
+
19
+ @property
20
+ def root(self) -> Schema__Html_Node: # Get the root node
21
+ return self.document.root_node
22
+
23
+ @property
24
+ def head(self) -> Optional[Schema__Html_Node]: # Get the head node
25
+ return self.find_child_by_tag(self.root, 'head')
26
+
27
+ @property
28
+ def body(self) -> Optional[Schema__Html_Node]: # Get the body node
29
+ return self.find_child_by_tag(self.root, 'body')
30
+
31
+ @property
32
+ def title(self) -> Optional[str]: # Get the page title text
33
+ if not self.head:
34
+ return None
35
+ title_node = self.find_child_by_tag(self.head, 'title')
36
+ if title_node:
37
+ return self.get_text_content(title_node).strip()
38
+ return None
39
+
40
+ @property
41
+ def links(self) -> List[Dict[str, str]]: # Get all link tags as list of attribute dicts
42
+ if not self.head:
43
+ return []
44
+ return [node.attrs for node in self.head.child_nodes if node.tag == 'link']
45
+
46
+ @property
47
+ def link_hrefs(self) -> List[str]: # Get all link hrefs
48
+ return [link.get('href', '') for link in self.links if 'href' in link]
49
+
50
+ @property
51
+ def css_links(self) -> List[str]: # Get all stylesheet link hrefs
52
+ result = []
53
+ for link in self.links:
54
+ if link.get('rel') == 'stylesheet' and 'href' in link:
55
+ result.append(link['href'])
56
+ return result
57
+
58
+ @property
59
+ def script_sources(self) -> List[str]: # Get all external script src URLs
60
+ scripts = self.find_all_by_tag('script')
61
+ return [s.attrs.get('src') for s in scripts if 'src' in s.attrs]
62
+
63
+ @property
64
+ def inline_scripts(self) -> List[str]: # Get all inline script contents
65
+ scripts = self.find_all_by_tag('script')
66
+ result = []
67
+ for script in scripts:
68
+ if 'src' not in script.attrs: # Only inline scripts
69
+ content = self.get_text_content(script)
70
+ if content:
71
+ result.append(content)
72
+ return result
73
+
74
+ @property
75
+ def meta_tags(self) -> List[Dict[str, str]]: # Get all meta tags as list of attribute dicts
76
+ if not self.head:
77
+ return []
78
+ return [node.attrs for node in self.head.child_nodes if node.tag == 'meta']
79
+
80
+ @property
81
+ def favicon(self) -> Optional[str]: # Get favicon URL if present
82
+ return (self.find_link_by_rel('shortcut icon') or
83
+ self.find_link_by_rel('icon'))
84
+
85
+ @property
86
+ def stylesheets(self) -> List[str]: # Alias for css_links
87
+ return self.css_links
88
+
89
+ # Query methods
90
+ def has_link(self, href : str = None , # Check if link exists with attributes
91
+ rel : str = None ,
92
+ **attrs
93
+ ) -> bool:
94
+ for link in self.links:
95
+ if href and link.get('href') != href:
96
+ continue
97
+ if rel and link.get('rel') != rel:
98
+ continue
99
+ if all(link.get(k) == v for k, v in attrs.items()): # Check any additional attributes
100
+ return True
101
+ return False
102
+
103
+ def has_script(self, src : str = None , # Check if script exists with src or text
104
+ contains : str = None
105
+ ) -> bool:
106
+ scripts = self.find_all_by_tag('script')
107
+ for script in scripts:
108
+ if src and script.attrs.get('src') == src:
109
+ return True
110
+ if contains:
111
+ content = self.get_text_content(script)
112
+ if contains in content:
113
+ return True
114
+ return False
115
+
116
+ def has_meta(self, name : str = None , # Check if meta tag exists with attributes
117
+ content : str = None ,
118
+ **attrs
119
+ ) -> bool:
120
+ for meta in self.meta_tags:
121
+ if name and meta.get('name') != name:
122
+ continue
123
+ if content and meta.get('content') != content:
124
+ continue
125
+ if all(meta.get(k) == v for k, v in attrs.items()):
126
+ return True
127
+ return False
128
+
129
+ def find_by_id(self, element_id : str # Find element by id attribute
130
+ ) -> Optional[Schema__Html_Node]:
131
+ return self.find_by_attribute('id', element_id)
132
+
133
+ def find_by_class(self, class_name : str # Find all elements with a specific class
134
+ ) -> List[Schema__Html_Node]:
135
+ result = []
136
+ for node in self.find_all():
137
+ classes = node.attrs.get('class', '').split()
138
+ if class_name in classes:
139
+ result.append(node)
140
+ return result
141
+
142
+ def find_by_tag(self, tag_name : str # Find all elements with a specific tag
143
+ ) -> List[Schema__Html_Node]:
144
+ return self.find_all_by_tag(tag_name)
145
+
146
+ def get_attribute(self, element : Schema__Html_Node , # Get attribute value from an element
147
+ attr_name : str
148
+ ) -> Optional[str]:
149
+ return element.attrs.get(attr_name)
150
+
151
+ def get_text(self, element : Optional[Schema__Html_Node] = None # Get text content of element or document
152
+ ) -> str:
153
+ if element is None:
154
+ element = self.root
155
+ return self.get_text_content(element)
156
+
157
+
158
+ # other helper methods
159
+ def find_child_by_tag(self, parent : Schema__Html_Node, # Find first direct child with tag
160
+ tag : str
161
+ ) -> Optional[Schema__Html_Node]:
162
+ for child in parent.child_nodes:
163
+ if child.tag == tag:
164
+ return child
165
+ return None
166
+
167
+ def find_all_by_tag(self, tag : str, # Recursively find all nodes with tag
168
+ node : Optional[Schema__Html_Node] = None
169
+ ) -> List[Schema__Html_Node]:
170
+ if node is None:
171
+ node = self.root
172
+
173
+ result = []
174
+ if node.tag == tag:
175
+ result.append(node)
176
+
177
+ for child in node.child_nodes:
178
+ result.extend(self.find_all_by_tag(tag, child))
179
+
180
+ return result
181
+
182
+ def find_by_attribute(self, attr_name : str , # Find first node with attribute value
183
+ attr_value : str ,
184
+ node : Optional[Schema__Html_Node] = None
185
+ ) -> Optional[Schema__Html_Node]:
186
+ if node is None:
187
+ node = self.root
188
+
189
+ if node.attrs.get(attr_name) == attr_value:
190
+ return node
191
+
192
+ for child in node.child_nodes:
193
+ result = self.find_by_attribute(attr_name, attr_value, child)
194
+ if result:
195
+ return result
196
+
197
+ return None
198
+
199
+ def find_all(self, node : Optional[Schema__Html_Node] = None # Get all nodes in the tree
200
+ ) -> List[Schema__Html_Node]:
201
+ if node is None:
202
+ node = self.root
203
+
204
+ result = [node]
205
+ for child in node.child_nodes:
206
+ result.extend(self.find_all(child))
207
+
208
+ return result
209
+
210
+ def find_link_by_rel(self, rel_value: str) -> Optional[str]:
211
+ for link in self.links:
212
+ if link.get('rel') == rel_value:
213
+ return link.get('href')
214
+ return None
215
+
216
+ def get_text_content(self, node : Schema__Html_Node # Get all text content from node
217
+ ) -> str:
218
+ texts = []
219
+
220
+ for text_node in node.text_nodes: # Get text from this node's text_nodes
221
+ texts.append(text_node.data)
222
+
223
+ for child in node.child_nodes: # Recursively get text from children
224
+ texts.append(self.get_text_content(child))
225
+
226
+ return ''.join(texts)
@@ -0,0 +1,45 @@
1
+ TEST__DATA__HTML__SIMPLE = """
2
+ <html>
3
+ <head>
4
+ <title>Test Page</title>
5
+ <link rel="stylesheet" href="/css/main.css">
6
+ <link rel="shortcut icon" href="/favicon.ico">
7
+ <meta name="description" content="Test description">
8
+ </head>
9
+ <body>
10
+ <div id="main">Content</div>
11
+ <script src="/js/app.js"></script>
12
+ <script>console.log('inline');</script>
13
+ </body>
14
+ </html>
15
+ """
16
+ TEST__DATA__HTML__SWAGGER = """
17
+ <!DOCTYPE html>
18
+ <html>
19
+ <head>
20
+ <link type="text/css" rel="stylesheet" href="/static/swagger-ui/swagger-ui.css">
21
+ <link rel="shortcut icon" href="/static/swagger-ui/favicon.png">
22
+ <title>Fast_API - Swagger UI</title>
23
+ </head>
24
+ <body>
25
+ <div id="swagger-ui"></div>
26
+ <script src="/static/swagger-ui/swagger-ui-bundle.js"></script>
27
+ <script>
28
+ const ui = SwaggerUIBundle({
29
+ url: '/openapi.json',
30
+ "dom_id": "#swagger-ui"
31
+ })
32
+ </script>
33
+ </body>
34
+ </html>
35
+ """
36
+
37
+ TEST__DATA__HTML__MIXED_CONTENT = """
38
+ <div class="container">
39
+ Text before
40
+ <p class="paragraph">Paragraph content</p>
41
+ Text middle
42
+ <span class="highlight">Highlighted</span>
43
+ Text after
44
+ </div>
45
+ """
@@ -1,3 +1,4 @@
1
+ import collections
1
2
  import inspect # For function introspection
2
3
  from enum import Enum
3
4
  from typing import get_args, get_origin, Union, List, Any, Dict # For type hinting utilities
@@ -105,14 +106,32 @@ class Type_Safe__Method:
105
106
  if not isinstance(param_value, list): # Check if value is a list
106
107
  raise ValueError(f"Parameter '{param_name}' expected a list but got {type(param_value)}") # Raise error if not list
107
108
 
108
- item_type = get_args(expected_type)[0] # Get list item type
109
- if get_origin(item_type) is not None: # Handle the case when item_type is a subscripted type (which is not supported at the moment)
109
+ item_type = get_args(expected_type)[0] # Get list item type
110
+ item_origin = get_origin(item_type) # Get origin of item type
111
+
112
+ if item_origin is dict or item_origin is Dict: # Handle Dict[K, V] items
113
+ key_type, value_type = get_args(item_type) # Extract key and value types
114
+ for i, item in enumerate(param_value): # Validate each dict in list
115
+ if not isinstance(item, dict): # Check item is a dict
116
+ raise ValueError(f"List item at index {i} expected dict but got {type(item)}") # Raise error if not dict
117
+ for k, v in item.items(): # Validate dict contents
118
+ if not isinstance(k, key_type): # Check key type
119
+ raise ValueError(f"Dict key '{k}' at index {i} expected type {key_type}, but got {type(k)}") # Raise error for invalid key
120
+ if not isinstance(v, value_type): # Check value type
121
+ raise ValueError(f"Dict value for key '{k}' at index {i} expected type {value_type}, but got {type(v)}") # Raise error for invalid value
122
+ elif item_origin is collections.abc.Callable: # Handle Callable[[...], ...] items
123
+ for i, item in enumerate(param_value): # Validate each callable in list
124
+ if not callable(item): # Check item is callable
125
+ raise ValueError(f"List item at index {i} expected callable but got {type(item)}") # Raise error if not callable
126
+ # Note: Full signature validation would require is_callable_compatible method
127
+ elif item_origin is not None: # Handle other subscripted types
110
128
  raise NotImplementedError(f"Validation for list items with subscripted type"
111
129
  f" '{item_type}' is not yet supported "
112
- f"in parameter '{param_name}'.") # todo: add support for checking for subscripted types
113
- for i, item in enumerate(param_value): # Check each list item
114
- if not isinstance(item, item_type): # Validate item type
115
- raise ValueError(f"List item at index {i} expected type {item_type}, but got {type(item)}") # Raise error for invalid item
130
+ f"in parameter '{param_name}'.") # todo: add support for checking for subscripted types
131
+ else: # Handle non-subscripted types
132
+ for i, item in enumerate(param_value): # Check each list item
133
+ if not isinstance(item, item_type): # Validate item type
134
+ raise ValueError(f"List item at index {i} expected type {item_type}, but got {type(item)}") # Raise error for invalid item
116
135
 
117
136
  def validate_type_parameter(self, param_name: str, param_value: Any, expected_type: Any): # Validate a Type[T] parameter
118
137
  if not isinstance(param_value, type):
File without changes
@@ -0,0 +1 @@
1
+ v2.78.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v2.76.0"
3
+ version = "v2.78.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,5 +0,0 @@
1
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
2
-
3
-
4
- class Tag__Body(Tag__Base):
5
- tag_name = 'body'
@@ -1,5 +0,0 @@
1
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
2
-
3
-
4
- class Tag__Div(Tag__Base):
5
- tag_name = 'div'
@@ -1,5 +0,0 @@
1
- from osbot_utils.helpers.html.Tag__Base import Tag__Base
2
-
3
-
4
- class Tag__HR(Tag__Base):
5
- tag_name = 'hr'
@@ -1 +0,0 @@
1
- v2.76.0
File without changes