osbot-utils 1.69.0__tar.gz → 1.71.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 (314) hide show
  1. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/README.md +1 -1
  3. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/base_classes/Type_Safe.py +42 -33
  4. osbot_utils-1.71.0/osbot_utils/helpers/Safe_Id.py +9 -0
  5. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Zip_Bytes.py +6 -6
  6. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Objects.py +4 -1
  7. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Str.py +24 -3
  8. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Zip.py +2 -4
  9. osbot_utils-1.71.0/osbot_utils/version +1 -0
  10. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/pyproject.toml +1 -1
  11. osbot_utils-1.69.0/osbot_utils/version +0 -1
  12. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/LICENSE +0 -0
  13. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/__init__.py +0 -0
  14. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  15. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  16. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  17. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
  18. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/base_classes/__init__.py +0 -0
  19. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/context_managers/__init__.py +0 -0
  20. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/context_managers/async_invoke.py +0 -0
  21. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  22. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  23. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/context_managers/print_duration.py +0 -0
  24. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/__init__.py +0 -0
  25. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  26. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  27. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  28. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  29. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  30. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  31. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  32. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/cache.py +0 -0
  33. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  34. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  35. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  36. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  37. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  38. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/catch.py +0 -0
  39. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/context.py +0 -0
  40. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  41. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  42. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  43. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  44. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  45. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  46. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  47. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/fluent/__init__.py +0 -0
  48. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/__init__.py +0 -0
  49. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  50. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  51. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  52. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  53. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  54. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  55. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  56. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  57. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  58. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  59. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  60. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  61. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  62. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  63. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  64. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  65. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  66. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  67. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  68. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  69. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  70. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/CFormat.py +0 -0
  71. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/CPrint.py +0 -0
  72. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Dependency_Manager.py +0 -0
  73. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  74. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Hashicorp_Secrets.py +0 -0
  75. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  76. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  77. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Print_Table.py +0 -0
  78. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  79. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Random_Guid.py +0 -0
  80. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Random_Guid_Short.py +0 -0
  81. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  82. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Timestamp_Now.py +0 -0
  83. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  84. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/__init__.py +0 -0
  85. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  86. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  87. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  88. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  89. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  90. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  91. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  92. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  93. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  94. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  95. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  96. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  97. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  98. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  99. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  100. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  101. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  102. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  103. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  104. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  105. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  106. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  107. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  108. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  109. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  110. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  111. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  112. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  113. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  114. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  115. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  116. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  117. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  118. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  119. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  120. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  121. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  122. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  123. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  124. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  125. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  126. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  127. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  128. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  129. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  130. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  131. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  132. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  133. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  134. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  135. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  136. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  137. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  138. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  139. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  140. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  141. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  142. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  143. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  144. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  145. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  146. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  147. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  148. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  149. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  150. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  151. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  152. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  153. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  154. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  155. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  156. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  157. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  158. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  159. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  160. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  161. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  162. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  163. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  164. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  165. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  166. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  167. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  168. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  169. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  170. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/Flow__Events.py +0 -0
  171. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/Task.py +0 -0
  172. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  173. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/decorators/__init__.py +0 -0
  174. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/decorators/flow.py +0 -0
  175. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/decorators/task.py +0 -0
  176. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/models/Flow_Run__Config.py +0 -0
  177. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/models/Flow_Run__Event.py +0 -0
  178. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Data.py +0 -0
  179. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/models/Flow_Run__Event_Type.py +0 -0
  180. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/flows/models/__init__.py +0 -0
  181. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  182. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  183. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  184. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  185. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  186. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  187. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  188. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  189. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  190. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  191. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  192. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  193. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  194. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  195. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/html/__init__.py +0 -0
  196. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  197. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  198. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  199. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  200. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  201. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  202. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  203. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  204. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  205. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Execute_Method.py +0 -0
  206. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  207. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  208. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  209. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  210. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  211. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  212. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  213. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  214. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  215. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  216. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  217. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  218. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  219. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  220. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  221. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  222. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  223. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  224. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  225. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  226. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  227. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  228. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  229. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB.py +0 -0
  230. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  231. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  232. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  233. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  234. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  235. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  236. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  237. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  238. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  239. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  240. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  241. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  242. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  243. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  244. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  245. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  246. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  247. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  248. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  249. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  250. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  251. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  252. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  253. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  254. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  255. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  256. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  257. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  258. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  259. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  260. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  261. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  262. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  263. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  264. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  265. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  266. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  267. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  268. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  269. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  270. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Catch.py +0 -0
  271. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Custom_Handler_For_Http_Tests.py +0 -0
  272. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Duration.py +0 -0
  273. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Hook_Method.py +0 -0
  274. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  275. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Log_To_String.py +0 -0
  276. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Logging.py +0 -0
  277. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Patch_Print.py +0 -0
  278. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Profiler.py +0 -0
  279. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Pytest.py +0 -0
  280. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Stderr.py +0 -0
  281. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Stdout.py +0 -0
  282. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  283. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Temp_File.py +0 -0
  284. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Temp_Folder.py +0 -0
  285. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  286. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  287. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Temp_Zip.py +0 -0
  288. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +0 -0
  289. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Unit_Test.py +0 -0
  290. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/Unzip_File.py +0 -0
  291. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/testing/__init__.py +0 -0
  292. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Assert.py +0 -0
  293. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Call_Stack.py +0 -0
  294. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Csv.py +0 -0
  295. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Dev.py +0 -0
  296. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Env.py +0 -0
  297. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Exceptions.py +0 -0
  298. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Files.py +0 -0
  299. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Functions.py +0 -0
  300. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Http.py +0 -0
  301. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Int.py +0 -0
  302. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Json.py +0 -0
  303. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Json_Cache.py +0 -0
  304. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Lists.py +0 -0
  305. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Misc.py +0 -0
  306. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Png.py +0 -0
  307. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Process.py +0 -0
  308. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Python_Logger.py +0 -0
  309. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Regex.py +0 -0
  310. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Status.py +0 -0
  311. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Threads.py +0 -0
  312. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Toml.py +0 -0
  313. {osbot_utils-1.69.0 → osbot_utils-1.71.0}/osbot_utils/utils/Version.py +0 -0
  314. {osbot_utils-1.69.0 → osbot_utils-1.71.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.69.0
3
+ Version: 1.71.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  Powerful Python util methods and classes that simplify common apis and tasks.
25
25
 
26
- ![Current Release](https://img.shields.io/badge/release-v1.69.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v1.71.0-blue)
27
27
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
28
28
 
29
29
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Powerful Python util methods and classes that simplify common apis and tasks.
4
4
 
5
- ![Current Release](https://img.shields.io/badge/release-v1.69.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.71.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
 
@@ -54,22 +54,6 @@ immutable_types = (bool, int, float, complex, str, tuple, frozenset, bytes, None
54
54
  class Type_Safe:
55
55
 
56
56
  def __init__(self, **kwargs):
57
- """
58
- Initialize an instance of the derived class, strictly assigning provided keyword
59
- arguments to corresponding instance attributes.
60
-
61
- Parameters:
62
- **kwargs: Variable length keyword arguments.
63
-
64
- Raises:
65
- Exception: If a key from kwargs does not correspond to any attribute
66
- pre-defined in the class, an exception is raised to prevent
67
- setting an undefined attribute.
68
-
69
- """
70
- # if 'disable_type_safety' in kwargs: # special case
71
- # self.__type_safety__ = kwargs['disable_type_safety'] is False
72
- # del kwargs['disable_type_safety']
73
57
 
74
58
  for (key, value) in self.__cls_kwargs__().items(): # assign all default values to self
75
59
  if value is not None: # when the value is explicitly set to None on the class static vars, we can't check for type safety
@@ -264,28 +248,53 @@ class Type_Safe:
264
248
  setattr(self, key, value)
265
249
  return self
266
250
 
251
+ def deserialize_dict__using_key_value_annotations(self, key, value):
252
+ key_class = get_args(self.__annotations__[key])[0]
253
+ value_class = get_args(self.__annotations__[key])[1]
254
+ new_value = {}
255
+ for dict_key, dict_value in value.items():
256
+ if issubclass(key_class, Type_Safe):
257
+ new__dict_key = key_class().deserialize_from_dict(dict_key)
258
+ else:
259
+ new__dict_key = key_class(dict_key)
267
260
 
261
+ if issubclass(value_class, Type_Safe):
262
+ new__dict_value = value_class().deserialize_from_dict(dict_value)
263
+ else:
264
+ new__dict_value = value_class(dict_value)
265
+ new_value[new__dict_key] = new__dict_value
266
+
267
+ return new_value
268
+
269
+ # todo: this needs refactoring, since the logic and code is getting quite complex (to be inside methods like this)
268
270
  def deserialize_from_dict(self, data):
271
+
269
272
  for key, value in data.items():
270
273
  if hasattr(self, key) and isinstance(getattr(self, key), Type_Safe):
271
- getattr(self, key).deserialize_from_dict(value) # Recursive call for complex nested objects
274
+ getattr(self, key).deserialize_from_dict(value) # if the attribute is a Type_Safe object, then also deserialize it
272
275
  else:
273
- if hasattr(self, '__annotations__'): # can only do type safety checks if the class does not have annotations
274
- if obj_is_attribute_annotation_of_type(self, key, EnumMeta): # Handle the case when the value is an Enum
275
- enum_type = getattr(self, '__annotations__').get(key)
276
- if type(value) is not enum_type: # If the value is not already of the target type
277
- value = enum_from_value(enum_type, value) # Try to resolve the value into the enum
278
-
279
- # todo: refactor these special cases into a separate method to class
280
- elif obj_is_attribute_annotation_of_type(self, key, Decimal): # handle Decimals
281
- value = Decimal(value)
282
- elif obj_is_attribute_annotation_of_type(self, key, Random_Guid): # handle Random_Guid
283
- value = Random_Guid(value)
284
- elif obj_is_attribute_annotation_of_type(self, key, Random_Guid_Short): # handle Random_Guid_Short
285
- value = Random_Guid_Short(value)
286
- elif obj_is_attribute_annotation_of_type(self, key, Timestamp_Now): # handle Timestamp_Now
287
- value = Timestamp_Now(value)
288
- setattr(self, key, value) # Direct assignment for primitive types and other structures
276
+ if hasattr(self, '__annotations__'): # can only do type safety checks if the class does not have annotations
277
+ if hasattr(self, key) is False: # make sure we are now adding new attributes to the class
278
+ raise ValueError(f"Attribute '{key}' not found in '{self.__class__.__name__}'")
279
+ if obj_is_attribute_annotation_of_type(self, key, dict): # handle the case when the value is a dict
280
+ value = self.deserialize_dict__using_key_value_annotations(key, value)
281
+ else:
282
+ if value is not None:
283
+ if obj_is_attribute_annotation_of_type(self, key, EnumMeta): # Handle the case when the value is an Enum
284
+ enum_type = getattr(self, '__annotations__').get(key)
285
+ if type(value) is not enum_type: # If the value is not already of the target type
286
+ value = enum_from_value(enum_type, value) # Try to resolve the value into the enum
287
+
288
+ # todo: refactor these special cases into a separate method to class
289
+ elif obj_is_attribute_annotation_of_type(self, key, Decimal): # handle Decimals
290
+ value = Decimal(value)
291
+ elif obj_is_attribute_annotation_of_type(self, key, Random_Guid): # handle Random_Guid
292
+ value = Random_Guid(value)
293
+ elif obj_is_attribute_annotation_of_type(self, key, Random_Guid_Short): # handle Random_Guid_Short
294
+ value = Random_Guid_Short(value)
295
+ elif obj_is_attribute_annotation_of_type(self, key, Timestamp_Now): # handle Timestamp_Now
296
+ value = Timestamp_Now(value)
297
+ setattr(self, key, value) # Direct assignment for primitive types and other structures
289
298
 
290
299
  return self
291
300
 
@@ -0,0 +1,9 @@
1
+ from osbot_utils.utils.Str import safe_id
2
+
3
+ class Safe_Id(str):
4
+ def __new__(cls, value):
5
+ sanitized_value = safe_id(value)
6
+ return str.__new__(cls, sanitized_value)
7
+
8
+ def __str__(self):
9
+ return self
@@ -1,9 +1,9 @@
1
- from osbot_utils.base_classes.Type_Safe import Type_Safe
2
- from osbot_utils.utils.Dev import pprint
3
- from osbot_utils.utils.Files import files_list, file_create_from_bytes, temp_file, parent_folder, parent_folder_create
4
- from osbot_utils.utils.Misc import random_text
5
- from osbot_utils.utils.Regex import list__match_regex, list__match_regexes
6
- from osbot_utils.utils.Zip import zip_bytes_empty, zip_bytes__files, zip_bytes__add_file, zip_bytes__add_files, \
1
+ from osbot_utils.base_classes.Type_Safe import Type_Safe
2
+ from osbot_utils.utils.Dev import pprint
3
+ from osbot_utils.utils.Files import files_list, file_create_from_bytes, temp_file, parent_folder, parent_folder_create
4
+ from osbot_utils.utils.Misc import random_text
5
+ from osbot_utils.utils.Regex import list__match_regex, list__match_regexes
6
+ from osbot_utils.utils.Zip import zip_bytes_empty, zip_bytes__files, zip_bytes__add_file, zip_bytes__add_files, \
7
7
  zip_bytes__replace_files, zip_bytes__replace_file, zip_bytes__file_list, zip_bytes__file, \
8
8
  zip_bytes__add_file__from_disk, zip_bytes__add_files__from_disk, zip_files, zip_file__files, zip_bytes__remove_files
9
9
 
@@ -8,12 +8,13 @@ import typing
8
8
  from collections.abc import Mapping
9
9
  from typing import Union
10
10
  from types import SimpleNamespace
11
+ from osbot_utils.helpers.Safe_Id import Safe_Id
11
12
  from osbot_utils.helpers.Timestamp_Now import Timestamp_Now
12
13
  from osbot_utils.helpers.Random_Guid import Random_Guid
13
14
  from osbot_utils.utils.Misc import list_set
14
15
  from osbot_utils.utils.Str import str_unicode_escape, str_max_width
15
16
 
16
- TYPE_SAFE__CONVERT_VALUE__SUPPORTED_TYPES = [Random_Guid, Timestamp_Now]
17
+ TYPE_SAFE__CONVERT_VALUE__SUPPORTED_TYPES = [Safe_Id, Random_Guid, Timestamp_Now]
17
18
 
18
19
  # Backport implementations of get_origin and get_args for Python 3.7
19
20
  if sys.version_info < (3, 8):
@@ -352,6 +353,8 @@ def obj_is_attribute_annotation_of_type(target, attr_name, expected_type):
352
353
  return True
353
354
  if expected_type is type(attribute_annotation):
354
355
  return True
356
+ if expected_type is get_origin(attribute_annotation): # handle genericAlias
357
+ return True
355
358
  return False
356
359
 
357
360
  def obj_is_type_union_compatible(var_type, compatible_types):
@@ -5,17 +5,18 @@ from osbot_utils.utils.Files import safe_file_name
5
5
 
6
6
  # todo: refactor this this class all str related methods (mainly from the Misc class)
7
7
 
8
- ANSI_ESCAPE_PATTERN = re.compile(r'\x1b\[[0-9;]*m')
8
+ REGEX__ANSI_ESCAPE_PATTERN = re.compile(r'\x1b\[[0-9;]*m')
9
+ REGEX__SAFE_ID_REGEX = re.compile(r'[^a-zA-Z0-9_-]')
9
10
 
10
11
  def ansi_text_visible_length(ansi_text):
11
12
  if type(ansi_text) is str:
12
- ansi_escape = re.compile(ANSI_ESCAPE_PATTERN) # This regex matches the escape sequences used for text formatting
13
+ ansi_escape = re.compile(REGEX__ANSI_ESCAPE_PATTERN) # This regex matches the escape sequences used for text formatting
13
14
  visible_text = ansi_escape.sub('', ansi_text) # Remove the escape sequences
14
15
  return len(visible_text) # Return the length of the remaining text
15
16
 
16
17
  def ansi_to_text(ansi_text: str):
17
18
  if type(ansi_text) is str:
18
- return ANSI_ESCAPE_PATTERN.sub('', ansi_text)
19
+ return REGEX__ANSI_ESCAPE_PATTERN.sub('', ansi_text)
19
20
 
20
21
  def ansis_to_texts(ansis_texts: list): # todo: find a better name for this method :)
21
22
  if type(ansis_texts) is list:
@@ -33,6 +34,23 @@ def strip_quotes(value: str): # Remove surrounding quo
33
34
  return value[1:-1]
34
35
  return value
35
36
 
37
+ def safe_id(value):
38
+ if value is None or value == "":
39
+ raise ValueError("Invalid ID: The ID must not be empty.")
40
+
41
+ if not isinstance(value, str):
42
+ value = str(value)
43
+
44
+ if len(value) > 36:
45
+ raise ValueError(f"Invalid ID: The ID must not exceed 36 characters (was {len(value)}).")
46
+
47
+ sanitized_value = REGEX__SAFE_ID_REGEX.sub('_', value)
48
+
49
+ if set(sanitized_value) == {'_'}:
50
+ raise ValueError("Invalid ID: The sanitized ID must not consist entirely of underscores.")
51
+
52
+ return sanitized_value
53
+
36
54
  def str_dedent(value, strip=True):
37
55
  result = textwrap.dedent(value)
38
56
  if strip:
@@ -54,6 +72,9 @@ def str_max_width(target, value):
54
72
  def str_safe(value):
55
73
  return safe_file_name(value)
56
74
 
75
+ def str_safe_id(value):
76
+ return safe_id(value)
77
+
57
78
  def str_starts_with(source, prefix):
58
79
  if source is None or prefix is None:
59
80
  return False
@@ -4,10 +4,8 @@ import os
4
4
  import shutil
5
5
  import tarfile
6
6
  import zipfile
7
- from os.path import abspath
8
-
9
- from osbot_utils.utils.Misc import list_set
10
-
7
+ from os.path import abspath
8
+ from osbot_utils.utils.Misc import list_set
11
9
  from osbot_utils.utils.Files import temp_folder, folder_files, temp_file, is_file, file_copy, file_move, file_exists, \
12
10
  file_contents_as_bytes
13
11
 
@@ -0,0 +1 @@
1
+ v1.71.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.69.0"
3
+ version = "v1.71.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1 +0,0 @@
1
- v1.69.0
File without changes