osbot-utils 1.30.0__tar.gz → 1.32.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 (295) hide show
  1. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/README.md +1 -1
  3. osbot_utils-1.32.0/osbot_utils/base_classes/Kwargs_To_Self.py +4 -0
  4. osbot_utils-1.30.0/osbot_utils/base_classes/Kwargs_To_Self.py → osbot_utils-1.32.0/osbot_utils/base_classes/Type_Safe.py +14 -17
  5. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Catch.py +1 -1
  6. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Env.py +25 -7
  7. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Files.py +16 -0
  8. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Http.py +7 -0
  9. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Objects.py +14 -0
  10. osbot_utils-1.32.0/osbot_utils/version +1 -0
  11. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/pyproject.toml +1 -1
  12. osbot_utils-1.30.0/osbot_utils/base_classes/Type_Safe.py +0 -6
  13. osbot_utils-1.30.0/osbot_utils/version +0 -1
  14. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/LICENSE +0 -0
  15. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/__init__.py +0 -0
  16. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  17. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  18. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
  19. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/base_classes/__init__.py +0 -0
  20. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/context_managers/__init__.py +0 -0
  21. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  22. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  23. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/__init__.py +0 -0
  24. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  25. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  26. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  27. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  28. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  29. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  30. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  31. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/cache.py +0 -0
  32. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  33. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  34. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  35. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  36. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  37. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/catch.py +0 -0
  38. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/context.py +0 -0
  39. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  40. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  41. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  42. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  43. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  44. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  45. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  46. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/fluent/__init__.py +0 -0
  47. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/__init__.py +0 -0
  48. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  49. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  50. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  51. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  52. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  53. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  54. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  55. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  56. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  57. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  58. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  59. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  60. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  61. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  62. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  63. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  64. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  65. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  66. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  67. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  68. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  69. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/CFormat.py +0 -0
  70. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/CPrint.py +0 -0
  71. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  72. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  73. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  74. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  75. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Print_Table.py +0 -0
  76. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  77. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  78. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  79. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/Zip_Bytes.py +0 -0
  80. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/__init__.py +0 -0
  81. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  82. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  83. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  84. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  85. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  86. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  87. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  88. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  89. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  90. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  91. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  92. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  93. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  94. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  95. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  96. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  97. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  98. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  99. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  100. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  101. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  102. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  103. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  104. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  105. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  106. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  107. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  108. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  109. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  110. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  111. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  112. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  113. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  114. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  115. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  116. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  117. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  118. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  119. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  120. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  121. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  122. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  123. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  124. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  125. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  126. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  127. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  128. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  129. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  130. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  131. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  132. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  133. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  134. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  135. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  136. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  137. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  138. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  139. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  140. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  141. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  142. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  143. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  144. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  145. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  146. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  147. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  148. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  149. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  150. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  151. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  152. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  153. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  154. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  155. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  156. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  157. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  158. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  159. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  160. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  161. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  162. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  163. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  164. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  165. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  166. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/flows/Task.py +0 -0
  167. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  168. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  169. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  170. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  171. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  172. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  173. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  174. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  175. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  176. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  177. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  178. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  179. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  180. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  181. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  182. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/html/__init__.py +0 -0
  183. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  184. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  185. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  186. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  187. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  188. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  189. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  190. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  191. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  192. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  193. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  194. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  195. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  196. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  197. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  198. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  199. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  200. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  201. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  202. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  203. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  204. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  205. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  206. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  207. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  208. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  209. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  210. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  211. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  212. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  213. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  214. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  215. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  216. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  217. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  218. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  219. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  220. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  221. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  222. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  223. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  224. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  225. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  226. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  227. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  228. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  229. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  230. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  231. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  232. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  233. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  234. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  235. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  236. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  237. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  238. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  239. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  240. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  241. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  242. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  243. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  244. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  245. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  246. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  247. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  248. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  249. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  250. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  251. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  252. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  253. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  254. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  255. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Duration.py +0 -0
  256. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Hook_Method.py +0 -0
  257. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  258. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Log_To_String.py +0 -0
  259. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Logging.py +0 -0
  260. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Patch_Print.py +0 -0
  261. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Profiler.py +0 -0
  262. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Pytest.py +0 -0
  263. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Stderr.py +0 -0
  264. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Stdout.py +0 -0
  265. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  266. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Temp_File.py +0 -0
  267. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  268. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  269. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  270. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  271. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  272. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Unit_Test.py +0 -0
  273. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/Unzip_File.py +0 -0
  274. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/testing/__init__.py +0 -0
  275. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Assert.py +0 -0
  276. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Call_Stack.py +0 -0
  277. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Csv.py +0 -0
  278. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Dev.py +0 -0
  279. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Exceptions.py +0 -0
  280. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Functions.py +0 -0
  281. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Int.py +0 -0
  282. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Json.py +0 -0
  283. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Json_Cache.py +0 -0
  284. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Lists.py +0 -0
  285. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Misc.py +0 -0
  286. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Png.py +0 -0
  287. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Process.py +0 -0
  288. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Python_Logger.py +0 -0
  289. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Regex.py +0 -0
  290. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Status.py +0 -0
  291. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Str.py +0 -0
  292. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Toml.py +0 -0
  293. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Version.py +0 -0
  294. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/Zip.py +0 -0
  295. {osbot_utils-1.30.0 → osbot_utils-1.32.0}/osbot_utils/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.30.0
3
+ Version: 1.32.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -22,7 +22,7 @@ Description-Content-Type: text/markdown
22
22
 
23
23
  Powerful Python util methods and classes that simplify common apis and tasks.
24
24
 
25
- ![Current Release](https://img.shields.io/badge/release-v1.30.0-blue)
25
+ ![Current Release](https://img.shields.io/badge/release-v1.32.0-blue)
26
26
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
27
27
 
28
28
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Powerful Python util methods and classes that simplify common apis and tasks.
4
4
 
5
- ![Current Release](https://img.shields.io/badge/release-v1.30.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.32.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
 
@@ -0,0 +1,4 @@
1
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+
3
+ # todo: refactor all of Kwargs_To_Self to use Type_Safe
4
+ Kwargs_To_Self = Type_Safe
@@ -13,9 +13,10 @@ from osbot_utils.base_classes.Type_Safe__List import Type_Safe__List
13
13
  from osbot_utils.utils.Dev import pprint
14
14
  from osbot_utils.utils.Json import json_parse
15
15
  from osbot_utils.utils.Misc import list_set
16
- from osbot_utils.utils.Objects import default_value, value_type_matches_obj_annotation_for_attr, \
16
+ from osbot_utils.utils.Objects import default_value, value_type_matches_obj_annotation_for_attr, \
17
17
  raise_exception_on_obj_type_annotation_mismatch, obj_is_attribute_annotation_of_type, enum_from_value, \
18
- obj_is_type_union_compatible, value_type_matches_obj_annotation_for_union_attr
18
+ obj_is_type_union_compatible, value_type_matches_obj_annotation_for_union_attr, \
19
+ convert_dict_to_value_from_obj_annotation
19
20
 
20
21
  # Backport implementations of get_origin and get_args for Python 3.7
21
22
  if sys.version_info < (3, 8):
@@ -47,7 +48,7 @@ immutable_types = (bool, int, float, complex, str, tuple, frozenset, bytes, None
47
48
  # for example if we have an method like def add_node(self, title: str, call_index: int):
48
49
  # throw an exception if the type of the value passed in is not the same as the one defined in the method
49
50
 
50
- class Kwargs_To_Self:
51
+ class Type_Safe:
51
52
 
52
53
  def __init__(self, **kwargs):
53
54
  """
@@ -82,8 +83,8 @@ class Kwargs_To_Self:
82
83
  if value is not None: # prevent None values from overwriting existing values, which is quite common in default constructors
83
84
  setattr(self, key, value)
84
85
  else:
85
- raise Exception(f"{self.__class__.__name__} has no attribute '{key}' and cannot be assigned the value '{value}'. "
86
- f"Use {self.__class__.__name__}.__default_kwargs__() see what attributes are available")
86
+ raise ValueError(f"{self.__class__.__name__} has no attribute '{key}' and cannot be assigned the value '{value}'. "
87
+ f"Use {self.__class__.__name__}.__default_kwargs__() see what attributes are available")
87
88
 
88
89
  def __enter__(self): return self
89
90
  def __exit__(self, exc_type, exc_val, exc_tb): pass
@@ -92,23 +93,19 @@ class Kwargs_To_Self:
92
93
  if not hasattr(self, '__annotations__'): # can't do type safety checks if the class does not have annotations
93
94
  return super().__setattr__(name, value)
94
95
 
95
- # if self.__type_safety__:
96
- # if self.__lock_attributes__:
97
- # todo: this can't work on all, current hypothesis is that this will work for the values that are explicitly set
98
- # if not hasattr(self, name):
99
- # raise AttributeError(f"'[Object Locked] Current object is locked (with __lock_attributes__=True) which prevents new attributes allocations (i.e. setattr calls). In this case {type(self).__name__}' object has no attribute '{name}'") from None
100
-
101
96
  if value is not None:
97
+ if type(value) is dict:
98
+ value = convert_dict_to_value_from_obj_annotation(self, name, value)
102
99
  check_1 = value_type_matches_obj_annotation_for_attr (self, name, value)
103
100
  check_2 = value_type_matches_obj_annotation_for_union_attr(self, name, value)
104
101
  if (check_1 is False and check_2 is None or
105
102
  check_1 is None and check_2 is False or
106
103
  check_1 is False and check_2 is False ): # fix for type safety assigment on Union vars
107
- raise Exception(f"Invalid type for attribute '{name}'. Expected '{self.__annotations__.get(name)}' but got '{type(value)}'")
104
+ raise ValueError(f"Invalid type for attribute '{name}'. Expected '{self.__annotations__.get(name)}' but got '{type(value)}'")
108
105
  else:
109
106
  if hasattr(self, name) and self.__annotations__.get(name) : # don't allow previously set variables to be set to None
110
107
  if getattr(self, name) is not None: # unless it is already set to None
111
- raise Exception(f"Can't set None, to a variable that is already set. Invalid type for attribute '{name}'. Expected '{self.__annotations__.get(name)}' but got '{type(value)}'")
108
+ raise ValueError(f"Can't set None, to a variable that is already set. Invalid type for attribute '{name}'. Expected '{self.__annotations__.get(name)}' but got '{type(value)}'")
112
109
 
113
110
  super().__setattr__(name, value)
114
111
 
@@ -145,13 +142,13 @@ class Kwargs_To_Self:
145
142
  if var_value is not None: # allow None assignments on ctor since that is a valid use case
146
143
  if var_type and not isinstance(var_value, var_type): # check type
147
144
  exception_message = f"variable '{var_name}' is defined as type '{var_type}' but has value '{var_value}' of type '{type(var_value)}'"
148
- raise Exception(exception_message)
145
+ raise ValueError(exception_message)
149
146
  if var_type not in immutable_types and var_name.startswith('__') is False: # if var_type is not one of the immutable_types or is an __ internal
150
147
  #todo: fix type safety bug that I believe is caused here
151
148
  if obj_is_type_union_compatible(var_type, immutable_types) is False: # if var_type is not something like Optional[Union[int, str]]
152
149
  if type(var_type) not in immutable_types:
153
150
  exception_message = f"variable '{var_name}' is defined as type '{var_type}' which is not supported by Kwargs_To_Self, with only the following immutable types being supported: '{immutable_types}'"
154
- raise Exception(exception_message)
151
+ raise ValueError(exception_message)
155
152
  if include_base_classes is False:
156
153
  break
157
154
  return kwargs
@@ -251,14 +248,14 @@ class Kwargs_To_Self:
251
248
  if value is not None:
252
249
  if hasattr(self,'__annotations__'): # can only do type safety checks if the class does not have annotations
253
250
  if value_type_matches_obj_annotation_for_attr(self, key, value) is False:
254
- raise Exception(f"Invalid type for attribute '{key}'. Expected '{self.__annotations__.get(key)}' but got '{type(value)}'")
251
+ raise ValueError(f"Invalid type for attribute '{key}'. Expected '{self.__annotations__.get(key)}' but got '{type(value)}'")
255
252
  setattr(self, key, value)
256
253
  return self
257
254
 
258
255
 
259
256
  def deserialize_from_dict(self, data):
260
257
  for key, value in data.items():
261
- if hasattr(self, key) and isinstance(getattr(self, key), Kwargs_To_Self):
258
+ if hasattr(self, key) and isinstance(getattr(self, key), Type_Safe):
262
259
  getattr(self, key).deserialize_from_dict(value) # Recursive call for complex nested objects
263
260
  else:
264
261
  if hasattr(self, '__annotations__'): # can only do type safety checks if the class does not have annotations
@@ -42,7 +42,7 @@ class Catch:
42
42
  if self.expected_error:
43
43
  self.assert_error_is(self.expected_error)
44
44
  if self.expect_exception and exception_type is None:
45
- raise Exception(f'Expected exception: {self.expected_error} but no exception was raised')
45
+ raise ValueError(f'Expected exception: {self.expected_error} but no exception was raised')
46
46
  if self.catch_exception:
47
47
  return True # returning true here will prevent the exception to be propagated (which is the objective of this class :) )
48
48
  return False
@@ -6,14 +6,28 @@ from osbot_utils.utils.Files import all_parent_folders, file_exists
6
6
  from osbot_utils.utils.Misc import list_set
7
7
  from osbot_utils.utils.Str import strip_quotes
8
8
 
9
- def env__home_root(): # todo: this should be refatored to be env__home__is__root
9
+
10
+ def env__home():
11
+ return get_env('HOME', '')
12
+
13
+ def env__home__is__root():
10
14
  return os.getenv('HOME') == '/root'
11
15
 
12
- def env__terminal_xterm(): # todo: this should be refatored to be env__terminal__is__xterm
16
+ def env__old_pwd():
17
+ return get_env('OLDPWD', '')
18
+
19
+ def env__pwd():
20
+ return get_env('PWD', '')
21
+
22
+ def env__old_pwd__remove(value):
23
+ return value.replace(env__old_pwd(), '')
24
+
25
+ def env__terminal__is__xterm():
13
26
  return os.getenv('TERM') == 'xterm'
14
27
 
15
- def env__not_terminal_xterm():
16
- return not env__terminal_xterm()
28
+ def env__terminal__is_not__xterm():
29
+ return not env__terminal__is__xterm()
30
+
17
31
 
18
32
  def platform_darwin():
19
33
  return platform == 'darwin'
@@ -21,6 +35,10 @@ def platform_darwin():
21
35
  def env_value(var_name):
22
36
  return env_vars().get(var_name, None)
23
37
 
38
+ def env_var_set(var_name):
39
+ value = os.getenv(var_name)
40
+ return value is not None and value != ''
41
+
24
42
  def env_vars_list():
25
43
  return list_set(env_vars())
26
44
 
@@ -109,6 +127,6 @@ def unload_dotenv(dotenv_path=None):
109
127
  env_unload_from_file(env_path) # Process it
110
128
  break # Stop after unloading the first .env file
111
129
 
112
-
113
- env_load = load_dotenv
114
- get_env = os.getenv
130
+ is_env_var_set = env_var_set
131
+ env_load = load_dotenv
132
+ get_env = os.getenv
@@ -340,6 +340,8 @@ class Files:
340
340
  def parent_folder_combine(file, path):
341
341
  return Files.path_combine(os.path.dirname(file),path)
342
342
 
343
+
344
+
343
345
  @staticmethod
344
346
  def pickle_save_to_file(object_to_save, path=None):
345
347
  path = path or temp_file(extension=".pickle")
@@ -491,12 +493,26 @@ def folders_names_in_folder(target):
491
493
  folders = folders_in_folder(target)
492
494
  return folders_names(folders)
493
495
 
496
+ def path_combine_safe(base_path, file_location, raise_exception=False): # handle possible directory transversal attacks
497
+ full_path = os.path.join(base_path, file_location) # Combine and normalize paths
498
+ normalised_base_path = os.path.normpath(base_path)
499
+ normalised_full_path = os.path.normpath(full_path)
500
+
501
+ if os.path.commonpath([normalised_base_path, normalised_full_path]) == normalised_base_path: # Check for directory traversal
502
+ return normalised_full_path
503
+ if raise_exception:
504
+ raise ValueError("Invalid file location: directory traversal attempt detected.")
505
+ return None
506
+
494
507
  def parent_folder_create(target):
495
508
  return folder_create(parent_folder(target))
496
509
 
497
510
  def parent_folder_exists(target):
498
511
  return folder_exists(parent_folder(target))
499
512
 
513
+ def parent_folder_name(target):
514
+ return folder_name(parent_folder(target))
515
+
500
516
  def parent_folder_not_exists(target):
501
517
  return parent_folder_exists(target) is False
502
518
 
@@ -22,6 +22,13 @@ def current_host_online(url_to_use=URL_CHECK_HOST_ONLINE):
22
22
  def dns_ip_address(host):
23
23
  return socket.gethostbyname(host)
24
24
 
25
+ def is_url_online(target):
26
+ try:
27
+ http_request(target, method='HEAD')
28
+ return True
29
+ except:
30
+ return False
31
+
25
32
  def is_port_open(host, port, timeout=0.5):
26
33
  return port_is_open(host=host, port=port, timeout=timeout)
27
34
 
@@ -69,6 +69,9 @@ def base_classes(cls):
69
69
  target = type(cls)
70
70
  return type_base_classes(target)
71
71
 
72
+ def base_classes_names(cls):
73
+ return [cls.__name__ for cls in base_classes(cls)]
74
+
72
75
  def class_functions_names(target):
73
76
  return list_set(class_functions(target))
74
77
 
@@ -89,6 +92,17 @@ def class_full_name(target):
89
92
  type_name = type_target.__name__
90
93
  return f'{type_module}.{type_name}'
91
94
 
95
+ def convert_dict_to_value_from_obj_annotation(target, attr_name, value):
96
+ if target is not None and attr_name is not None:
97
+ if hasattr(target, '__annotations__'):
98
+ obj_annotations = target.__annotations__
99
+ if hasattr(obj_annotations,'get'):
100
+ attribute_annotation = obj_annotations.get(attr_name)
101
+ if 'Type_Safe' in base_classes_names(attribute_annotation):
102
+ return attribute_annotation(**value)
103
+ return value
104
+
105
+
92
106
  def default_value(target : type):
93
107
  try:
94
108
  return target() # try to create the object using the default constructor
@@ -0,0 +1 @@
1
+ v1.32.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.30.0"
3
+ version = "v1.32.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,6 +0,0 @@
1
- from osbot_utils.base_classes.Kwargs_To_Self import Kwargs_To_Self
2
-
3
- # todo: refactor all of Kwargs_To_Self into this class (in a way to minimize the side effects, since
4
- # Kwargs_To_Self is used in many places in the codebase)
5
-
6
- Type_Safe = Kwargs_To_Self
@@ -1 +0,0 @@
1
- v1.30.0
File without changes