osbot-utils 2.55.0__tar.gz → 2.57.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 (420) hide show
  1. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/PKG-INFO +2 -2
  2. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/README.md +1 -1
  3. osbot_utils-2.55.0/osbot_utils/helpers/html/Dict_To_Css.py → osbot_utils-2.57.0/osbot_utils/helpers/html/CSS_Dict__To__Css.py +1 -2
  4. osbot_utils-2.57.0/osbot_utils/helpers/html/Html_Dict__To__Html.py +97 -0
  5. osbot_utils-2.57.0/osbot_utils/helpers/html/Html_Dict__To__Html_Document.py +37 -0
  6. osbot_utils-2.57.0/osbot_utils/helpers/html/Html_Dict__To__Html_Tags.py +138 -0
  7. osbot_utils-2.57.0/osbot_utils/helpers/html/Html__To__Html_Dict.py +105 -0
  8. osbot_utils-2.57.0/osbot_utils/helpers/html/Html__To__Html_Document.py +19 -0
  9. osbot_utils-2.57.0/osbot_utils/helpers/html/Html__To__Html_Tag.py +19 -0
  10. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__Base.py +43 -11
  11. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__Html.py +1 -1
  12. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__Style.py +3 -3
  13. osbot_utils-2.57.0/osbot_utils/helpers/html/Tag__Text.py +10 -0
  14. osbot_utils-2.57.0/osbot_utils/helpers/html/schemas/Schema__Html_Document.py +7 -0
  15. osbot_utils-2.57.0/osbot_utils/helpers/html/schemas/Schema__Html_Node.py +10 -0
  16. osbot_utils-2.57.0/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data.py +6 -0
  17. osbot_utils-2.57.0/osbot_utils/helpers/html/schemas/Schema__Html_Node__Data__Type.py +4 -0
  18. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache.py +10 -10
  19. osbot_utils-2.55.0/osbot_utils/helpers/safe_str/Safe_Str__HTML.py → osbot_utils-2.57.0/osbot_utils/helpers/safe_str/Safe_Str__Html.py +1 -1
  20. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Validation.py +6 -6
  21. osbot_utils-2.57.0/osbot_utils/utils/__init__.py +0 -0
  22. osbot_utils-2.57.0/osbot_utils/version +1 -0
  23. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/pyproject.toml +1 -1
  24. osbot_utils-2.55.0/osbot_utils/helpers/html/Dict_To_Html.py +0 -59
  25. osbot_utils-2.55.0/osbot_utils/helpers/html/Dict_To_Tags.py +0 -87
  26. osbot_utils-2.55.0/osbot_utils/helpers/html/Html_To_Dict.py +0 -85
  27. osbot_utils-2.55.0/osbot_utils/helpers/html/Html_To_Tag.py +0 -20
  28. osbot_utils-2.55.0/osbot_utils/version +0 -1
  29. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/LICENSE +0 -0
  30. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/__init__.py +0 -0
  31. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  32. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  33. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  34. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/base_classes/__init__.py +0 -0
  35. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/context_managers/__init__.py +0 -0
  36. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  37. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  38. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/__init__.py +0 -0
  39. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  40. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  41. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  42. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  43. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  44. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  45. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  46. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/cache.py +0 -0
  47. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  48. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  49. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  50. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  51. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  52. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/catch.py +0 -0
  53. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/context.py +0 -0
  54. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  55. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  56. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  57. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  58. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  59. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  60. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  61. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/fluent/__init__.py +0 -0
  62. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/CFormat.py +0 -0
  63. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/CPrint.py +0 -0
  64. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  65. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  66. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Guid.py +0 -0
  67. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  68. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  69. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  70. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Obj_Id.py +0 -0
  71. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Print_Table.py +0 -0
  72. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  73. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  74. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  75. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  76. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Safe_Id.py +0 -0
  77. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Str_ASCII.py +0 -0
  78. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  79. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  80. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  81. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/__init__.py +0 -0
  82. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  83. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  84. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  85. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  86. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  87. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  88. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  89. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  90. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  91. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  92. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  93. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  94. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  95. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  96. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  97. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  98. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  99. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  100. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  101. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  102. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  103. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  104. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  105. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  106. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  107. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  108. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  109. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  110. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  111. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  112. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  113. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  114. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  115. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  116. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  117. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  118. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  119. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  120. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  121. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  122. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  123. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  124. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  125. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  126. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  127. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  128. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  129. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  130. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  131. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  132. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  133. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  134. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  135. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  136. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  137. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  138. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  139. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  140. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  141. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  142. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  143. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  144. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  145. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  146. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  147. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  148. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  149. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  150. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  151. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  152. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  153. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  154. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  155. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  156. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  157. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  158. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  159. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  160. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  161. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  162. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  163. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  164. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  165. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/Duration.py +0 -0
  166. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/__init__.py +0 -0
  167. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/decorators/__init__.py +0 -0
  168. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/decorators/capture_duration.py +0 -0
  169. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/decorators/duration.py +0 -0
  170. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/decorators/print_duration.py +0 -0
  171. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/schemas/Schema__Duration.py +0 -0
  172. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/duration/schemas/__init__.py +0 -0
  173. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  174. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/Task.py +0 -0
  175. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  176. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/actions/Flow__Data.py +0 -0
  177. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/actions/Flow__Events.py +0 -0
  178. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/actions/Flow__Stats__Collector.py +0 -0
  179. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/actions/Task__Stats__Collector.py +0 -0
  180. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/actions/__init__.py +0 -0
  181. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  182. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  183. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  184. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  185. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  186. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  187. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  188. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/models/Schema__Flow__Artifact.py +0 -0
  189. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/models/Schema__Flow__Result.py +0 -0
  190. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  191. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow.py +0 -0
  192. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Data.py +0 -0
  193. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event.py +0 -0
  194. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Event__Data.py +0 -0
  195. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Log.py +0 -0
  196. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Stats.py +0 -0
  197. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Status.py +0 -0
  198. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Flow__Task__Data.py +0 -0
  199. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/Schema__Task__Stats.py +0 -0
  200. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/flows/schemas/__init__.py +0 -0
  201. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/generators/Generator_Context_Manager.py +0 -0
  202. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/generators/Generator_Manager.py +0 -0
  203. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/generators/Model__Generator_State.py +0 -0
  204. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/generators/Model__Generator_Target.py +0 -0
  205. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/generators/__init__.py +0 -0
  206. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  207. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  208. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  209. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  210. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  211. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  212. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/html/__init__.py +0 -0
  213. {osbot_utils-2.55.0/osbot_utils/helpers/llms → osbot_utils-2.57.0/osbot_utils/helpers/html/schemas}/__init__.py +0 -0
  214. {osbot_utils-2.55.0/osbot_utils/helpers/llms/actions → osbot_utils-2.57.0/osbot_utils/helpers/llms}/__init__.py +0 -0
  215. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/actions/LLM_Request__Execute.py +0 -0
  216. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py +0 -0
  217. {osbot_utils-2.55.0/osbot_utils/helpers/llms/builders → osbot_utils-2.57.0/osbot_utils/helpers/llms/actions}/__init__.py +0 -0
  218. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder.py +0 -0
  219. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py +0 -0
  220. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/builders/LLM_Request__Factory.py +0 -0
  221. {osbot_utils-2.55.0/osbot_utils/helpers/llms/cache → osbot_utils-2.57.0/osbot_utils/helpers/llms/builders}/__init__.py +0 -0
  222. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py +0 -0
  223. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__File_System.py +0 -0
  224. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/cache/LLM_Request__Cache__Storage.py +0 -0
  225. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Local__Folder.py +0 -0
  226. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/cache/Virtual_Storage__Sqlite.py +0 -0
  227. {osbot_utils-2.55.0/osbot_utils/helpers/llms/platforms → osbot_utils-2.57.0/osbot_utils/helpers/llms/cache}/__init__.py +0 -0
  228. {osbot_utils-2.55.0/osbot_utils/helpers/llms/platforms/open_ai → osbot_utils-2.57.0/osbot_utils/helpers/llms/platforms}/__init__.py +0 -0
  229. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/platforms/open_ai/API__LLM__Open_AI.py +0 -0
  230. {osbot_utils-2.55.0/osbot_utils/helpers/llms/schemas → osbot_utils-2.57.0/osbot_utils/helpers/llms/platforms/open_ai}/__init__.py +0 -0
  231. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Cache__Index.py +0 -0
  232. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request.py +0 -0
  233. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Data.py +0 -0
  234. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Function_Call.py +0 -0
  235. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Content.py +0 -0
  236. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Request__Message__Role.py +0 -0
  237. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response.py +0 -0
  238. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/llms/schemas/Schema__LLM_Response__Cache.py +0 -0
  239. {osbot_utils-2.55.0/osbot_utils/helpers/pubsub → osbot_utils-2.57.0/osbot_utils/helpers/llms/schemas}/__init__.py +0 -0
  240. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  241. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  242. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  243. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  244. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  245. {osbot_utils-2.55.0/osbot_utils/helpers/pubsub/schemas → osbot_utils-2.57.0/osbot_utils/helpers/pubsub}/__init__.py +0 -0
  246. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  247. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  248. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  249. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  250. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  251. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  252. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  253. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  254. {osbot_utils-2.55.0/osbot_utils/helpers/python_compatibility → osbot_utils-2.57.0/osbot_utils/helpers/pubsub/schemas}/__init__.py +0 -0
  255. {osbot_utils-2.55.0/osbot_utils/helpers/safe_str → osbot_utils-2.57.0/osbot_utils/helpers/python_compatibility}/__init__.py +0 -0
  256. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/python_compatibility/python_3_8.py +0 -0
  257. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/safe_str/Safe_Str.py +0 -0
  258. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/safe_str/Safe_Str__File__Name.py +0 -0
  259. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/safe_str/Safe_Str__File__Path.py +0 -0
  260. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/safe_str/Safe_Str__Hash.py +0 -0
  261. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/safe_str/Safe_Str__Text.py +0 -0
  262. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/safe_str/Safe_Str__Text__Dangerous.py +0 -0
  263. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/safe_str/Safe_Str__Url.py +0 -0
  264. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite → osbot_utils-2.57.0/osbot_utils/helpers/safe_str}/__init__.py +0 -0
  265. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  266. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  267. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  268. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  269. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  270. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  271. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  272. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  273. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  274. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite/cache → osbot_utils-2.57.0/osbot_utils/helpers/sqlite}/__init__.py +0 -0
  275. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  276. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  277. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  278. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  279. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  280. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  281. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  282. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite/domains → osbot_utils-2.57.0/osbot_utils/helpers/sqlite/cache}/__init__.py +0 -0
  283. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  284. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  285. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  286. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  287. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  288. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite/domains/schemas → osbot_utils-2.57.0/osbot_utils/helpers/sqlite/domains}/__init__.py +0 -0
  289. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite/models → osbot_utils-2.57.0/osbot_utils/helpers/sqlite/domains/schemas}/__init__.py +0 -0
  290. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  291. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite/sample_data → osbot_utils-2.57.0/osbot_utils/helpers/sqlite/models}/__init__.py +0 -0
  292. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  293. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite/sql_builder → osbot_utils-2.57.0/osbot_utils/helpers/sqlite/sample_data}/__init__.py +0 -0
  294. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  295. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  296. {osbot_utils-2.55.0/osbot_utils/helpers/sqlite/tables → osbot_utils-2.57.0/osbot_utils/helpers/sqlite/sql_builder}/__init__.py +0 -0
  297. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  298. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  299. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  300. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  301. {osbot_utils-2.55.0/osbot_utils/helpers/ssh → osbot_utils-2.57.0/osbot_utils/helpers/sqlite/tables}/__init__.py +0 -0
  302. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  303. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  304. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  305. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  306. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  307. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  308. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  309. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  310. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  311. {osbot_utils-2.55.0/osbot_utils/helpers/trace → osbot_utils-2.57.0/osbot_utils/helpers/ssh}/__init__.py +0 -0
  312. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  313. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  314. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  315. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  316. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  317. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  318. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  319. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  320. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  321. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  322. {osbot_utils-2.55.0/osbot_utils/helpers/xml → osbot_utils-2.57.0/osbot_utils/helpers/trace}/__init__.py +0 -0
  323. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/Xml__Attribute.py +0 -0
  324. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/Xml__Element.py +0 -0
  325. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/Xml__File.py +0 -0
  326. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/Xml__File__Load.py +0 -0
  327. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/Xml__File__To_Dict.py +0 -0
  328. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/Xml__File__To_Xml.py +0 -0
  329. {osbot_utils-2.55.0/osbot_utils/testing → osbot_utils-2.57.0/osbot_utils/helpers/xml}/__init__.py +0 -0
  330. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/rss/RSS__Channel.py +0 -0
  331. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/rss/RSS__Enclosure.py +0 -0
  332. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/rss/RSS__Feed.py +0 -0
  333. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/rss/RSS__Feed__Parser.py +0 -0
  334. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/rss/RSS__Image.py +0 -0
  335. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/helpers/xml/rss/RSS__Item.py +0 -0
  336. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Catch.py +0 -0
  337. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  338. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Hook_Method.py +0 -0
  339. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  340. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Log_To_String.py +0 -0
  341. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Logging.py +0 -0
  342. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Patch_Print.py +0 -0
  343. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Profiler.py +0 -0
  344. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Pytest.py +0 -0
  345. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Stderr.py +0 -0
  346. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Stdout.py +0 -0
  347. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  348. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Temp_File.py +0 -0
  349. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  350. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  351. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  352. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  353. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  354. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Unit_Test.py +0 -0
  355. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/Unzip_File.py +0 -0
  356. {osbot_utils-2.55.0/osbot_utils/testing/performance → osbot_utils-2.57.0/osbot_utils/testing}/__init__.py +0 -0
  357. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/performance/Performance_Measure__Session.py +0 -0
  358. {osbot_utils-2.55.0/osbot_utils/testing/performance/models → osbot_utils-2.57.0/osbot_utils/testing/performance}/__init__.py +0 -0
  359. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Measurement.py +0 -0
  360. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/testing/performance/models/Model__Performance_Measure__Result.py +0 -0
  361. {osbot_utils-2.55.0/osbot_utils/type_safe → osbot_utils-2.57.0/osbot_utils/testing/performance/models}/__init__.py +0 -0
  362. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/Type_Safe.py +0 -0
  363. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/Type_Safe__Base.py +0 -0
  364. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/Type_Safe__Dict.py +0 -0
  365. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/Type_Safe__List.py +0 -0
  366. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/Type_Safe__Method.py +0 -0
  367. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/Type_Safe__Set.py +0 -0
  368. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/Type_Safe__Tuple.py +0 -0
  369. {osbot_utils-2.55.0/osbot_utils/type_safe/decorators → osbot_utils-2.57.0/osbot_utils/type_safe}/__init__.py +0 -0
  370. {osbot_utils-2.55.0/osbot_utils/type_safe/methods → osbot_utils-2.57.0/osbot_utils/type_safe/decorators}/__init__.py +0 -0
  371. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/decorators/type_safe.py +0 -0
  372. {osbot_utils-2.55.0/osbot_utils/type_safe/shared → osbot_utils-2.57.0/osbot_utils/type_safe/methods}/__init__.py +0 -0
  373. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/methods/type_safe_property.py +0 -0
  374. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Annotations.py +0 -0
  375. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Cache.py +0 -0
  376. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Convert.py +0 -0
  377. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Json_Compressor.py +0 -0
  378. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Json_Compressor__Type_Registry.py +0 -0
  379. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Not_Cached.py +0 -0
  380. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Raise_Exception.py +0 -0
  381. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/shared/Type_Safe__Shared__Variables.py +0 -0
  382. {osbot_utils-2.55.0/osbot_utils/type_safe/steps → osbot_utils-2.57.0/osbot_utils/type_safe/shared}/__init__.py +0 -0
  383. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Class_Kwargs.py +0 -0
  384. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Kwargs.py +0 -0
  385. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Default_Value.py +0 -0
  386. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/steps/Type_Safe__Step__From_Json.py +0 -0
  387. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Init.py +0 -0
  388. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/steps/Type_Safe__Step__Set_Attr.py +0 -0
  389. {osbot_utils-2.55.0/osbot_utils/type_safe/validators → osbot_utils-2.57.0/osbot_utils/type_safe/steps}/__init__.py +0 -0
  390. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/validators/Type_Safe__Validator.py +0 -0
  391. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/validators/Validator__Max.py +0 -0
  392. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/validators/Validator__Min.py +0 -0
  393. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/validators/Validator__One_Of.py +0 -0
  394. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/type_safe/validators/Validator__Regex.py +0 -0
  395. {osbot_utils-2.55.0/osbot_utils/utils → osbot_utils-2.57.0/osbot_utils/type_safe/validators}/__init__.py +0 -0
  396. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Assert.py +0 -0
  397. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Call_Stack.py +0 -0
  398. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Csv.py +0 -0
  399. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Dev.py +0 -0
  400. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Env.py +0 -0
  401. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Exceptions.py +0 -0
  402. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Files.py +0 -0
  403. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Functions.py +0 -0
  404. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Http.py +0 -0
  405. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Int.py +0 -0
  406. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Json.py +0 -0
  407. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Json_Cache.py +0 -0
  408. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Lists.py +0 -0
  409. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Misc.py +0 -0
  410. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Objects.py +0 -0
  411. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Png.py +0 -0
  412. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Process.py +0 -0
  413. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Python_Logger.py +0 -0
  414. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Regex.py +0 -0
  415. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Status.py +0 -0
  416. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Str.py +0 -0
  417. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Threads.py +0 -0
  418. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Toml.py +0 -0
  419. {osbot_utils-2.55.0 → osbot_utils-2.57.0}/osbot_utils/utils/Version.py +0 -0
  420. {osbot_utils-2.55.0 → osbot_utils-2.57.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.55.0
3
+ Version: 2.57.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  License: MIT
6
6
  Author: Dinis Cruz
@@ -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-v2.55.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v2.57.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-v2.55.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v2.57.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,7 +1,6 @@
1
1
  from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
2
2
 
3
-
4
- class Dict_To_Css(Kwargs_To_Self):
3
+ class CSS_Dict__To__Css(Kwargs_To_Self):
5
4
  css: dict
6
5
 
7
6
 
@@ -0,0 +1,97 @@
1
+ from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
2
+
3
+ HTML_SELF_CLOSING_TAGS = {'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'}
4
+ HTML_DEFAULT_DOCTYPE_VALUE = "<!DOCTYPE html>\n"
5
+
6
+ class Html_Dict__To__Html:
7
+ def __init__(self, root, include_doctype=True, doctype=HTML_DEFAULT_DOCTYPE_VALUE):
8
+ self.self_closing_tags = HTML_SELF_CLOSING_TAGS # Define a list of self-closing tags
9
+ self.root = root
10
+ self.include_doctype = include_doctype
11
+ self.doctype = doctype
12
+
13
+ def convert(self):
14
+ html = self.convert_element(self.root, 0)
15
+ if self.include_doctype:
16
+ return self.doctype + html
17
+ return html
18
+
19
+ def convert_attrs(self, attrs):
20
+ attrs_str_parts = [] # List to hold each attribute's string representation
21
+ for key, value in attrs.items():
22
+ if value is None: # Handle None values
23
+ attr_str = f'{key}'
24
+ elif '"' in str(value): # Check if the attribute value contains double quotes
25
+ escaped_value = "&quot;".join(str(value).split("\"")) # If so, escape double quotes and format the attribute string
26
+ attr_str = f'{key}="{escaped_value}"'
27
+ else:
28
+ attr_str = f'{key}="{value}"' # If not, simply format the attribute string
29
+ attrs_str_parts.append(attr_str)
30
+
31
+ attrs_str = ' '.join(attrs_str_parts) # Join the parts into the final attributes string
32
+
33
+ if attrs_str:
34
+ attrs_str = " " + attrs_str # Prepend a space if there are attributes
35
+ return attrs_str
36
+
37
+ def convert_element(self, element, indent_level):
38
+ """Recursively converts a dictionary to an HTML string with indentation."""
39
+ # Check if this is a text node
40
+ if element.get("type") == STRING__SCHEMA_TEXT:
41
+ return element.get("data", "") # Return text content directly for text nodes
42
+
43
+ tag = element.get("tag")
44
+ attrs = element.get("attrs", {})
45
+ nodes = element.get(STRING__SCHEMA_NODES, [])
46
+
47
+ attrs_str = self.convert_attrs(attrs) # Convert attributes dictionary to a string
48
+ indent = " " * indent_level # Indentation for the current level, assuming 4 spaces per indent level
49
+
50
+ # Handle self-closing tags
51
+ if tag in self.self_closing_tags and not nodes: # Check if the tag is self-closing and has no nodes
52
+ return f"{indent}<{tag}{attrs_str} />\n"
53
+
54
+ # Start building the HTML
55
+ html = f"{indent}<{tag}{attrs_str}>" # Opening tag with indentation
56
+
57
+ # Separate nodes into text nodes and element nodes
58
+ text_nodes = [node for node in nodes if node.get("type") == STRING__SCHEMA_TEXT]
59
+ element_nodes = [node for node in nodes if node.get("type") != STRING__SCHEMA_TEXT]
60
+
61
+ # If there are only element nodes, add a newline after the opening tag
62
+ if element_nodes and not text_nodes:
63
+ html += "\n"
64
+
65
+ # Process nodes, maintaining the original order but with proper formatting
66
+ if nodes:
67
+ # Track if we're currently in a text section or element section
68
+ # This helps us add newlines only between elements, not text
69
+ previous_was_element = False
70
+
71
+ for node in nodes:
72
+ if node.get("type") == STRING__SCHEMA_TEXT:
73
+ # Text node - directly append content
74
+ html += node.get("data", "")
75
+ previous_was_element = False
76
+ else:
77
+ # Element node - format with proper indentation
78
+ if previous_was_element:
79
+ # If previous child was also an element, we may already have a newline
80
+ if not html.endswith("\n"):
81
+ html += "\n"
82
+
83
+ html += self.convert_element(node, indent_level + 1)
84
+ previous_was_element = True
85
+
86
+ # Handle closing tag based on content
87
+ if element_nodes and not text_nodes:
88
+ # If only element nodes, add indented closing tag
89
+ html += f"{indent}</{tag}>\n"
90
+ elif nodes: # Any type of nodes
91
+ # If mixed content or only text, add closing tag without indentation
92
+ html += f"</{tag}>\n"
93
+ else:
94
+ # Empty tag, replace with self-contained format
95
+ html = f"{indent}<{tag}{attrs_str}></{tag}>\n"
96
+
97
+ return html
@@ -0,0 +1,37 @@
1
+ from typing import Dict, Union, Any
2
+ from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT, STRING__SCHEMA_NODES
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.helpers.html.schemas.Schema__Html_Node__Data import Schema__Html_Node__Data
6
+ from osbot_utils.helpers.html.schemas.Schema__Html_Node__Data__Type import Schema__Html_Node__Data__Type
7
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
8
+
9
+
10
+ class Html_Dict__To__Html_Document(Type_Safe):
11
+ html__dict : dict = None
12
+ html__document: Schema__Html_Document = None
13
+
14
+ def convert(self):
15
+ self.html__document = self.parse_html_dict(self.html__dict)
16
+ return self.html__document
17
+
18
+ def parse_html_dict(self, target: Dict[str, Any]) -> Schema__Html_Document:
19
+ if not target or not isinstance(target, dict):
20
+ raise ValueError("Invalid HTML dictionary structure")
21
+
22
+ root_node = self.parse_node(target)
23
+ return Schema__Html_Document(root_node=root_node)
24
+
25
+ def parse_node(self, target: Dict[str, Any]) -> Union[Schema__Html_Node, Schema__Html_Node__Data]:
26
+
27
+ if target.get('type') == STRING__SCHEMA_TEXT: # Handle text nodes
28
+ return Schema__Html_Node__Data(data = target.get('data', ''),
29
+ type = Schema__Html_Node__Data__Type.TEXT)
30
+ else: # Handle element nodes
31
+ nodes = []
32
+ for node in target.get(STRING__SCHEMA_NODES, []):
33
+ nodes.append(self.parse_node(node))
34
+
35
+ return Schema__Html_Node(attrs = target.get('attrs', {}) ,
36
+ nodes = nodes ,
37
+ tag = target.get('tag', ''))
@@ -0,0 +1,138 @@
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
9
+
10
+
11
+ class Html_Dict__To__Html_Tags:
12
+
13
+ def __init__(self, root):
14
+ self.root = root
15
+
16
+ def convert(self):
17
+ return self.convert_element(self.root)
18
+
19
+ def convert_element(self, element):
20
+ tag_name = element.get("tag")
21
+
22
+ # Handle special tag types with dedicated conversion methods
23
+ if tag_name == 'html':
24
+ return self.convert_to__tag__html(element)
25
+ elif tag_name == 'head':
26
+ return self.convert_to__tag__head(element, 0) # Default indent 0
27
+ elif tag_name == 'link':
28
+ return self.convert_to__tag__link(element)
29
+ else:
30
+ # Default case: convert to a generic Tag__Base
31
+ return self.convert_to__tag(Tag__Base, element, 0) # Default indent 0
32
+
33
+ def collect_inner_text(self, element):
34
+ """Extract all text from an element's text node nodes."""
35
+ inner_text = ""
36
+ for node in element.get(STRING__SCHEMA_NODES, []):
37
+ if node.get("type") == STRING__SCHEMA_TEXT:
38
+ inner_text += node.get("data", "")
39
+ return inner_text
40
+
41
+ def convert_to__tag(self, target_tag, element, indent):
42
+ if element.get("type") == STRING__SCHEMA_TEXT:
43
+ # Handle text nodes directly
44
+ return Tag__Text(element.get("data", ""))
45
+
46
+ tag_name = element.get("tag")
47
+ attrs = element.get("attrs", {})
48
+ nodes = element.get(STRING__SCHEMA_NODES, [])
49
+ end_tag = tag_name not in HTML_SELF_CLOSING_TAGS
50
+ tag_indent = indent + 1
51
+
52
+ # Collect inner text from all text node nodes
53
+ inner_html = self.collect_inner_text(element)
54
+
55
+ tag_kwargs = dict(
56
+ tag_name = tag_name,
57
+ attributes = attrs,
58
+ end_tag = end_tag,
59
+ indent = tag_indent,
60
+ inner_html = inner_html
61
+ )
62
+
63
+ tag = target_tag(**tag_kwargs)
64
+
65
+ # Process only element nodes as nodes (text is already handled via inner_html)
66
+ for node in nodes:
67
+ if node.get("type") != STRING__SCHEMA_TEXT: # Skip text nodes, they're in inner_html
68
+ child_tag = self.convert_to__tag(Tag__Base, node, tag_indent)
69
+ tag.elements.append(child_tag)
70
+
71
+ return tag
72
+
73
+ def convert_to__tag__head(self, element, indent):
74
+ attrs = element.get("attrs", {})
75
+ nodes = element.get(STRING__SCHEMA_NODES, [])
76
+
77
+ head_indent = indent + 1
78
+ tag_head = Tag__Head(indent=head_indent, **attrs)
79
+
80
+ for node in nodes:
81
+ tag_name = node.get("tag")
82
+
83
+ if tag_name == 'title':
84
+ # Extract title text from text node nodes
85
+ tag_head.title = self.collect_inner_text(node)
86
+ elif tag_name == 'link':
87
+ tag_head.links.append(self.convert_to__tag__link(node))
88
+ elif tag_name == 'meta':
89
+ tag_head.elements.append(self.convert_to__tag(Tag__Base, node, head_indent))
90
+ elif tag_name == 'style':
91
+ # For style tags, collect the CSS content from text nodes
92
+ style_element = self.convert_to__tag(Tag__Base, node, head_indent)
93
+ tag_head.elements.append(style_element)
94
+ else:
95
+ # Handle any other head elements
96
+ tag_head.elements.append(self.convert_to__tag(Tag__Base, node, head_indent))
97
+
98
+ return tag_head
99
+
100
+ def convert_to__tag__html(self, element):
101
+ attrs = element.get("attrs", {})
102
+ nodes = element.get(STRING__SCHEMA_NODES, [])
103
+ lang = attrs.get("lang")
104
+
105
+ tag_html = Tag__Html(attributes=attrs, lang=lang, doc_type=False)
106
+
107
+ # Initialize head and body if not found
108
+ head_found = False
109
+ body_found = False
110
+
111
+ for node in nodes:
112
+ tag_name = node.get("tag")
113
+
114
+ if tag_name == 'head':
115
+ tag_html.head = self.convert_to__tag__head(node, tag_html.indent)
116
+ head_found = True
117
+ elif tag_name == 'body':
118
+ tag_html.body = self.convert_to__tag(Tag__Body, node, tag_html.indent)
119
+ body_found = True
120
+ else:
121
+ # Log unexpected child elements of html
122
+ print(f'Unexpected child of html tag: {tag_name}')
123
+
124
+ # Handle missing head or body (required for valid HTML structure)
125
+ if not head_found:
126
+ #print("Warning: No head element found, creating empty one")
127
+ tag_html.head = Tag__Head(indent=tag_html.indent + 1)
128
+
129
+ if not body_found:
130
+ #print("Warning: No body element found, creating empty one")
131
+ tag_html.body = Tag__Body(indent=tag_html.indent + 1)
132
+
133
+ return tag_html
134
+
135
+ def convert_to__tag__link(self, element):
136
+ attrs = element.get("attrs", {})
137
+ tag_link = Tag__Link(**attrs)
138
+ return tag_link
@@ -0,0 +1,105 @@
1
+ from html.parser import HTMLParser
2
+
3
+ HTML_SELF_CLOSING_TAGS = {'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'}
4
+ STRING__SCHEMA_TEXT = 'TEXT'
5
+ STRING__SCHEMA_NODES = 'nodes'
6
+ STRING__DATA_TEXT = f'{STRING__SCHEMA_TEXT}:'
7
+
8
+
9
+ class Html__To__Html_Dict(HTMLParser):
10
+ def __init__(self, html):
11
+ super().__init__()
12
+ self.root = None # No root initially
13
+ self.current = None # No current node at the start
14
+ self.stack = [] # Empty stack for hierarchy management
15
+ self.html = html or ''
16
+ self.void_elements = HTML_SELF_CLOSING_TAGS # List of void elements that are self-closing by nature
17
+ self.strip_text_data = True
18
+
19
+ def convert(self):
20
+ self.feed(self.html)
21
+ return self.root
22
+
23
+ def handle_starttag(self, tag, attrs):
24
+ new_tag = {"tag": tag, "attrs": dict(attrs), STRING__SCHEMA_NODES: []}
25
+
26
+ if self.current is None:
27
+ # When the first tag is encountered, it becomes the root
28
+ self.root = new_tag
29
+ self.current = new_tag
30
+ else:
31
+ # Otherwise, append the new tag as a child of the current tag
32
+ self.current[STRING__SCHEMA_NODES].append(new_tag)
33
+
34
+ # If this tag is not a void element, push it onto the stack
35
+ if tag.lower() not in self.void_elements:
36
+ self.stack.append(new_tag)
37
+ self.current = new_tag
38
+
39
+ def handle_endtag(self, tag):
40
+ # Find and pop the matching start tag
41
+ if tag.lower() not in self.void_elements and len(self.stack) > 1:
42
+ # Look for the matching start tag in the stack
43
+ for i in range(len(self.stack) - 1, 0, -1):
44
+ if self.stack[i]["tag"].lower() == tag.lower():
45
+ # Pop all tags up to and including the matching start tag
46
+ self.stack = self.stack[:i]
47
+ break
48
+ # Update current to the top of stack
49
+ self.current = self.stack[-1]
50
+
51
+ def handle_data(self, data):
52
+ if data.strip(): # Ignore whitespace
53
+ # Create a text node as a child
54
+ text_node = {"type": STRING__SCHEMA_TEXT, "data": data}
55
+ self.current[STRING__SCHEMA_NODES].append(text_node)
56
+
57
+ def print__generate_lines(self, node, indent="", last=True, is_root=True):
58
+ lines = []
59
+
60
+ prefix = "" if is_root else ("└── " if last else "├── ")
61
+
62
+ if node.get("type") == STRING__SCHEMA_TEXT:
63
+ text_data = node.get('data')
64
+ if self.strip_text_data:
65
+ text_data = text_data.strip()
66
+ lines.append(f"{indent}{prefix}{STRING__DATA_TEXT} {text_data}")
67
+ else:
68
+ tag = node.get("tag")
69
+ attrs = node.get("attrs", {})
70
+ nodes = node.get(STRING__SCHEMA_NODES, [])
71
+ attrs_str = ' '.join(f'{key}="{value}"' for key, value in attrs.items())
72
+ attrs_str = f' ({attrs_str})' if attrs_str else ''
73
+
74
+ lines.append(f"{indent}{prefix}{tag}{attrs_str}")
75
+
76
+ child_indent = indent + (" " if last else "│ ")
77
+
78
+ for i, node in enumerate(nodes):
79
+ is_last = i == len(nodes) - 1
80
+ child_lines = self.print__generate_lines(node, indent=child_indent, last=is_last, is_root=False)
81
+ lines.extend(child_lines if isinstance(child_lines, list) else [child_lines])
82
+
83
+ return lines if is_root else "\n".join(lines)
84
+
85
+ def print(self, just_return_lines=False):
86
+ if self.root:
87
+ lines = self.print__generate_lines(self.root, is_root=True)
88
+ if just_return_lines:
89
+ return lines
90
+ else:
91
+ self.print__lines(lines)
92
+ return self
93
+
94
+ def print__lines(self, lines):
95
+ for line in lines:
96
+ print(line)
97
+
98
+
99
+ def html_to_dict(html_code: str) -> dict:
100
+ try:
101
+ html_to_dict = Html__To__Html_Dict(html_code)
102
+ html_dict = html_to_dict.convert()
103
+ return html_dict
104
+ except: # todo: see if there is a better Exception to capture
105
+ return None # if we couldn't parse the html, just return None
@@ -0,0 +1,19 @@
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
5
+
6
+
7
+ class Html__To__Html_Document(Type_Safe):
8
+ html: str
9
+ html__dict : dict
10
+ html__document: Schema__Html_Document
11
+
12
+ def convert(self):
13
+ if self.html:
14
+ html__dict = Html__To__Html_Dict(self.html).convert()
15
+ if html__dict:
16
+ with Html_Dict__To__Html_Document(html__dict=html__dict).convert() as html__document:
17
+ if html__document:
18
+ self.html__document = html__document
19
+ return html__document
@@ -0,0 +1,19 @@
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
3
+
4
+
5
+ class Html__To__Html_Tag:
6
+
7
+ def __init__(self,html):
8
+ self.html_to_dict = Html__To__Html_Dict(html)
9
+
10
+ def __enter__(self):
11
+ return self.convert()
12
+
13
+ def __exit__(self, exc_type, exc_val, exc_tb):
14
+ return
15
+
16
+ def convert(self):
17
+ html_dict = self.html_to_dict.convert()
18
+ html_tag = Html_Dict__To__Html_Tags(html_dict).convert()
19
+ return html_tag
@@ -1,11 +1,12 @@
1
- from collections import defaultdict
1
+ from collections import defaultdict
2
2
 
3
- from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
4
- from osbot_utils.utils.Files import file_create
3
+ from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT
4
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
5
+ from osbot_utils.utils.Files import file_create
5
6
 
6
7
  INDENT_SIZE = 4
7
8
 
8
- class Tag__Base(Kwargs_To_Self):
9
+ class Tag__Base(Type_Safe):
9
10
  attributes : dict
10
11
  elements : list
11
12
  end_tag : bool = True
@@ -54,23 +55,43 @@ class Tag__Base(Kwargs_To_Self):
54
55
 
55
56
  def render_element(self):
56
57
  html_attributes = self.render_attributes()
57
- html_elements = self.render_elements()
58
- element_indent = " " * self.indent * INDENT_SIZE
58
+ element_indent = " " * self.indent * INDENT_SIZE
59
59
 
60
60
  html = f"{element_indent}<{self.tag_name}"
61
61
  if html_attributes:
62
62
  html += f" {html_attributes}"
63
+
63
64
  if self.end_tag:
64
65
  html += ">"
66
+
67
+ # Check for text nodes and regular element nodes
68
+ text_nodes = [e for e in self.elements if hasattr(e, 'type') and e.type == STRING__SCHEMA_TEXT]
69
+ element_nodes = [e for e in self.elements if not hasattr(e, 'type') or e.type != STRING__SCHEMA_TEXT]
70
+
71
+ has_text = bool(text_nodes) or bool(self.inner_html)
72
+ has_elements = bool(element_nodes)
73
+
74
+ # Add inner_html if it exists
65
75
  if self.inner_html:
66
76
  html += self.inner_html
77
+
78
+ # Get the rendered element HTML
79
+ html_elements = self.render_elements()
80
+
81
+ # Add element nodes with proper formatting
67
82
  if html_elements:
68
- if self.new_line_before_elements:
83
+ # Only add newlines if we have element nodes and no text nodes,
84
+ # or if we explicitly want newlines before elements
85
+ if (has_elements and not has_text) or (self.new_line_before_elements and not has_text):
69
86
  html += "\n"
70
- html += f"{html_elements}"
71
- if self.new_line_before_elements:
87
+
88
+ html += html_elements
89
+
90
+ # Add closing newline and indent only for pure element content
91
+ if (has_elements and not has_text) or (self.new_line_before_elements and not has_text):
72
92
  html += "\n"
73
- html += element_indent
93
+ html += element_indent
94
+
74
95
  html += f"</{self.tag_name}>"
75
96
  else:
76
97
  html += "/>"
@@ -79,12 +100,23 @@ class Tag__Base(Kwargs_To_Self):
79
100
 
80
101
  def render_elements(self):
81
102
  html_elements = ""
103
+ has_element_nodes = False
104
+
82
105
  for index, element in enumerate(self.elements):
83
- if index:
106
+ # Handle text nodes
107
+ if hasattr(element, 'type') and element.type == STRING__SCHEMA_TEXT:
108
+ html_elements += element.data
109
+ continue
110
+
111
+ # Only add newlines between element nodes (not text nodes)
112
+ if has_element_nodes:
84
113
  html_elements += '\n'
114
+
115
+ has_element_nodes = True
85
116
  element.indent = self.indent + 1 # set the indent of the child element based on the current one
86
117
  html_element = element.render()
87
118
  html_elements += html_element
119
+
88
120
  return html_elements
89
121
 
90
122
  def render(self):
@@ -1,7 +1,7 @@
1
1
  from osbot_utils.helpers.html.Tag__Base import Tag__Base
2
2
  from osbot_utils.helpers.html.Tag__Body import Tag__Body
3
3
  from osbot_utils.helpers.html.Tag__Head import Tag__Head
4
- from osbot_utils.utils.Misc import str_to_bytes
4
+ from osbot_utils.utils.Misc import str_to_bytes
5
5
 
6
6
  ATTRIBUTES_NAMES__LINK = ['lang']
7
7
 
@@ -1,10 +1,10 @@
1
- from osbot_utils.helpers.html.Dict_To_Css import Dict_To_Css
2
- from osbot_utils.helpers.html.Tag__Base import Tag__Base, INDENT_SIZE
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
3
3
 
4
4
 
5
5
  class Tag__Style(Tag__Base):
6
6
  tag_name : str = 'style'
7
- dict_to_css : Dict_To_Css
7
+ dict_to_css : CSS_Dict__To__Css
8
8
 
9
9
  def add_css_entry(self, selector, data):
10
10
  self.dict_to_css.add_css_entry(selector,data)
@@ -0,0 +1,10 @@
1
+ from osbot_utils.helpers.html.Html__To__Html_Dict import STRING__SCHEMA_TEXT
2
+
3
+
4
+ class Tag__Text:
5
+ def __init__(self, data=""):
6
+ self.type = STRING__SCHEMA_TEXT
7
+ self.data = data
8
+
9
+ def render(self):
10
+ return self.data
@@ -0,0 +1,7 @@
1
+ from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
2
+ from osbot_utils.helpers.html.schemas.Schema__Html_Node import Schema__Html_Node
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
+
5
+ class Schema__Html_Document(Type_Safe):
6
+ root_node : Schema__Html_Node # Top-level child nodes
7
+ timestamp: Timestamp_Now
@@ -0,0 +1,10 @@
1
+ from typing import Union, List, Dict, Optional
2
+ from osbot_utils.helpers.html.schemas.Schema__Html_Node__Data import Schema__Html_Node__Data
3
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
4
+
5
+
6
+ class Schema__Html_Node(Type_Safe):
7
+ attrs : Dict[str, Optional[str]] # HTML attributes (e.g., {'class': 'container'})
8
+ nodes : List[Union['Schema__Html_Node', Schema__Html_Node__Data]] # Child nodes (recursive structure)
9
+ tag : str # HTML tag name (e.g., 'div', 'meta', 'title')
10
+
@@ -0,0 +1,6 @@
1
+ from osbot_utils.helpers.html.schemas.Schema__Html_Node__Data__Type import Schema__Html_Node__Data__Type
2
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
3
+
4
+ class Schema__Html_Node__Data(Type_Safe):
5
+ data : str # Text content
6
+ type : Schema__Html_Node__Data__Type = Schema__Html_Node__Data__Type.TEXT # Always 'text' for text nodes
@@ -0,0 +1,4 @@
1
+ from enum import Enum
2
+
3
+ class Schema__Html_Node__Data__Type(Enum):
4
+ TEXT : str = 'text'
@@ -1,13 +1,13 @@
1
- from typing import Dict, Optional, List
2
- from osbot_utils.helpers.Obj_Id import Obj_Id
3
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Cache__Index import Schema__LLM_Cache__Index
4
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Request import Schema__LLM_Request
5
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Response import Schema__LLM_Response
6
- from osbot_utils.helpers.llms.schemas.Schema__LLM_Response__Cache import Schema__LLM_Response__Cache
7
- from osbot_utils.helpers.safe_str.Safe_Str__Hash import Safe_Str__Hash
8
- from osbot_utils.type_safe.Type_Safe import Type_Safe
9
- from osbot_utils.type_safe.decorators.type_safe import type_safe
10
- from osbot_utils.utils.Json import json_md5
1
+ from typing import Dict, Optional, List
2
+ from osbot_utils.helpers.Obj_Id import Obj_Id
3
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Cache__Index import Schema__LLM_Cache__Index
4
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request import Schema__LLM_Request
5
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Response import Schema__LLM_Response
6
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Response__Cache import Schema__LLM_Response__Cache
7
+ from osbot_utils.helpers.safe_str.Safe_Str__Hash import Safe_Str__Hash
8
+ from osbot_utils.type_safe.Type_Safe import Type_Safe
9
+ from osbot_utils.type_safe.decorators.type_safe import type_safe
10
+ from osbot_utils.utils.Json import json_md5
11
11
 
12
12
  SIZE__VALUE_HASH = 10
13
13
 
@@ -12,6 +12,6 @@ TYPE_SAFE_STR__HTML__MAX_LENGTH = 1048576 # 1 megabyte in bytes
12
12
  # - All other Unicode characters
13
13
  TYPE_SAFE_STR__HTML__REGEX = re.compile(r'[\x00\x01-\x08\x0B\x0C\x0E-\x1F]')
14
14
 
15
- class Safe_Str__HTML(Safe_Str):
15
+ class Safe_Str__Html(Safe_Str):
16
16
  max_length = TYPE_SAFE_STR__HTML__MAX_LENGTH
17
17
  regex = TYPE_SAFE_STR__HTML__REGEX