osbot-utils 1.27.0__tar.gz → 1.29.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 (294) hide show
  1. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/PKG-INFO +2 -2
  2. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/README.md +1 -1
  3. osbot_utils-1.29.0/osbot_utils/helpers/Zip_Bytes.py +105 -0
  4. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Folder.py +7 -0
  5. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Zip.py +2 -2
  6. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +4 -4
  7. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Files.py +17 -3
  8. osbot_utils-1.29.0/osbot_utils/utils/Regex.py +25 -0
  9. osbot_utils-1.29.0/osbot_utils/utils/Zip.py +238 -0
  10. osbot_utils-1.29.0/osbot_utils/version +1 -0
  11. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/pyproject.toml +1 -1
  12. osbot_utils-1.27.0/osbot_utils/utils/Zip.py +0 -141
  13. osbot_utils-1.27.0/osbot_utils/version +0 -1
  14. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/LICENSE +0 -0
  15. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/__init__.py +0 -0
  16. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
  17. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
  18. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
  19. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Type_Safe.py +0 -0
  20. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
  21. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/__init__.py +0 -0
  22. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/context_managers/__init__.py +0 -0
  23. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/context_managers/capture_duration.py +0 -0
  24. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
  25. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/__init__.py +0 -0
  26. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/classes/__init__.py +0 -0
  27. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/classes/singleton.py +0 -0
  28. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/__init__.py +0 -0
  29. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
  30. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/group_by.py +0 -0
  31. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/index_by.py +0 -0
  32. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/__init__.py +0 -0
  33. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache.py +0 -0
  34. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
  35. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
  36. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
  37. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
  38. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
  39. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/catch.py +0 -0
  40. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/context.py +0 -0
  41. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
  42. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
  43. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
  44. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
  45. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
  46. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
  47. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/fluent/Fluent_List.py +0 -0
  48. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/fluent/__init__.py +0 -0
  49. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/__init__.py +0 -0
  50. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
  51. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
  52. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
  53. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
  54. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
  55. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
  56. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
  57. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
  58. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
  59. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
  60. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
  61. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
  62. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
  63. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
  64. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
  65. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
  66. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
  67. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
  68. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
  69. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
  70. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
  71. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/CFormat.py +0 -0
  72. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/CPrint.py +0 -0
  73. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
  74. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Local_Cache.py +0 -0
  75. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Local_Caches.py +0 -0
  76. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Print_Table.py +0 -0
  77. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Python_Audit.py +0 -0
  78. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Random_Seed.py +0 -0
  79. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Type_Registry.py +0 -0
  80. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/__init__.py +0 -0
  81. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast.py +0 -0
  82. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
  83. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
  84. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
  85. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
  86. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
  87. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
  88. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
  89. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/__init__.py +0 -0
  90. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
  91. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
  92. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
  93. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
  94. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
  95. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
  96. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
  97. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
  98. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
  99. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
  100. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
  101. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
  102. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
  103. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
  104. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
  105. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
  106. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
  107. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
  108. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
  109. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
  110. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
  111. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
  112. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
  113. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
  114. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
  115. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
  116. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
  117. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
  118. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
  119. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
  120. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
  121. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
  122. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
  123. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
  124. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
  125. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
  126. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
  127. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
  128. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
  129. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
  130. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
  131. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
  132. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
  133. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
  134. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
  135. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
  136. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
  137. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
  138. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
  139. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
  140. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
  141. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
  142. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
  143. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
  144. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
  145. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
  146. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
  147. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
  148. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
  149. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
  150. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
  151. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
  152. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
  153. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
  154. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
  155. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
  156. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
  157. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
  158. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
  159. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
  160. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
  161. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
  162. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
  163. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
  164. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
  165. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/flows/Flow.py +0 -0
  166. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/flows/Task.py +0 -0
  167. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/flows/__init__.py +0 -0
  168. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
  169. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
  170. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
  171. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
  172. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
  173. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
  174. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
  175. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
  176. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
  177. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
  178. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
  179. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
  180. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
  181. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
  182. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/__init__.py +0 -0
  183. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
  184. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
  185. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
  186. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
  187. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
  188. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
  189. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
  190. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
  191. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
  192. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
  193. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
  194. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
  195. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
  196. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
  197. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
  198. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
  199. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
  200. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
  201. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
  202. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
  203. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
  204. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
  205. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
  206. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
  207. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
  208. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
  209. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
  210. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
  211. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
  212. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
  213. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
  214. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
  215. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
  216. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
  217. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
  218. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
  219. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
  220. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
  221. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
  222. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
  223. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
  224. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
  225. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
  226. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
  227. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
  228. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
  229. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
  230. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
  231. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
  232. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
  233. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
  234. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
  235. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
  236. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
  237. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
  238. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
  239. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
  240. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
  241. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
  242. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
  243. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
  244. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
  245. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
  246. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
  247. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
  248. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
  249. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
  250. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
  251. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
  252. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
  253. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
  254. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/__init__.py +0 -0
  255. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Catch.py +0 -0
  256. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Duration.py +0 -0
  257. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Hook_Method.py +0 -0
  258. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
  259. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Log_To_String.py +0 -0
  260. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Logging.py +0 -0
  261. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Patch_Print.py +0 -0
  262. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Profiler.py +0 -0
  263. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Pytest.py +0 -0
  264. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Stderr.py +0 -0
  265. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Stdout.py +0 -0
  266. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
  267. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_File.py +0 -0
  268. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
  269. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
  270. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Unit_Test.py +0 -0
  271. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Unzip_File.py +0 -0
  272. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/__init__.py +0 -0
  273. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Assert.py +0 -0
  274. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Call_Stack.py +0 -0
  275. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Csv.py +0 -0
  276. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Dev.py +0 -0
  277. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Env.py +0 -0
  278. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Exceptions.py +0 -0
  279. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Functions.py +0 -0
  280. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Http.py +0 -0
  281. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Int.py +0 -0
  282. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Json.py +0 -0
  283. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Json_Cache.py +0 -0
  284. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Lists.py +0 -0
  285. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Misc.py +0 -0
  286. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Objects.py +0 -0
  287. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Png.py +0 -0
  288. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Process.py +0 -0
  289. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Python_Logger.py +0 -0
  290. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Status.py +0 -0
  291. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Str.py +0 -0
  292. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Toml.py +0 -0
  293. {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Version.py +0 -0
  294. {osbot_utils-1.27.0 → osbot_utils-1.29.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.27.0
3
+ Version: 1.29.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.27.0-blue)
25
+ ![Current Release](https://img.shields.io/badge/release-v1.29.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.27.0-blue)
5
+ ![Current Release](https://img.shields.io/badge/release-v1.29.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,105 @@
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.Regex import list__match_regex, list__match_regexes
5
+ from osbot_utils.utils.Zip import zip_bytes_empty, zip_bytes__files, zip_bytes__add_file, zip_bytes__add_files, \
6
+ zip_bytes__replace_files, zip_bytes__replace_file, zip_bytes__file_list, zip_bytes__file, \
7
+ zip_bytes__add_file__from_disk, zip_bytes__add_files__from_disk, zip_files, zip_file__files, zip_bytes__remove_files
8
+
9
+
10
+ class Zip_Bytes(Type_Safe):
11
+ zip_bytes : bytes = None
12
+
13
+ def __init__(self):
14
+ super().__init__()
15
+ self.zip_bytes = zip_bytes_empty()
16
+
17
+ def __enter__(self):
18
+ return self
19
+
20
+ def __exit__(self, exc_type, exc_val, exc_tb):
21
+ pass
22
+
23
+ def add_file(self, file_path, file_contents):
24
+ self.zip_bytes = zip_bytes__add_file(self.zip_bytes, file_path, file_contents)
25
+ return self
26
+
27
+ def add_file__from_disk(self, file_to_add, base_path=None):
28
+ if base_path is None:
29
+ base_path = parent_folder(file_to_add)
30
+ self.zip_bytes = zip_bytes__add_file__from_disk(self.zip_bytes, base_path, file_to_add)
31
+ return self
32
+
33
+ def add_files(self, files_to_add):
34
+ self.zip_bytes = zip_bytes__add_files(self.zip_bytes, files_to_add)
35
+ return self
36
+
37
+ def add_files__from_disk(self, base_path, files_to_add, path_prefix=None):
38
+ self.zip_bytes = zip_bytes__add_files__from_disk(self.zip_bytes, base_path, files_to_add, path_prefix=path_prefix)
39
+ return self
40
+
41
+ def add_folder__from_disk(self, folder_to_add, *patterns):
42
+ base_path = folder_to_add
43
+ all_files_in_folder = files_list(folder_to_add)
44
+ files_to_add = list__match_regexes(all_files_in_folder, *patterns)
45
+ return self.add_files__from_disk(base_path, files_to_add)
46
+
47
+ def add_folder__from_disk__with_prefix(self, folder_to_add, path_prefix, *patterns):
48
+ base_path = folder_to_add
49
+ all_files_in_folder = files_list(folder_to_add)
50
+ files_to_add = list__match_regexes(all_files_in_folder, *patterns)
51
+ return self.add_files__from_disk(base_path, files_to_add, path_prefix=path_prefix)
52
+
53
+ def add_from_zip_file(self, path_zip_file):
54
+ files_to_add = zip_file__files(path_zip_file)
55
+ self.add_files(files_to_add)
56
+ return self
57
+
58
+ def empty(self):
59
+ return self.size() == 0
60
+
61
+ def file(self, file_path):
62
+ return zip_bytes__file(self.zip_bytes, file_path)
63
+
64
+ def file_paths(self):
65
+ return self.files_list()
66
+
67
+ def files(self):
68
+ return zip_bytes__files(self.zip_bytes)
69
+
70
+ def files_list(self):
71
+ return zip_bytes__file_list(self.zip_bytes)
72
+
73
+ def list(self):
74
+ return self.files_list()
75
+
76
+ def print_files_list(self):
77
+ pprint(self.files_list())
78
+ return self
79
+
80
+ def remove_files(self, *patterns):
81
+ files_to_remove = list__match_regexes(self.files_list(), *patterns)
82
+ self.zip_bytes = zip_bytes__remove_files(self.zip_bytes, files_to_remove)
83
+ return self
84
+
85
+ def replace_files(self, files_to_replace):
86
+ self.zip_bytes = zip_bytes__replace_files(self.zip_bytes, files_to_replace)
87
+ return self
88
+
89
+ def replace_file(self, file_path, file_contents):
90
+ self.zip_bytes = zip_bytes__replace_file(self.zip_bytes, file_path, file_contents)
91
+ return self
92
+
93
+ def save(self, path=None):
94
+ if path is None:
95
+ path = temp_file(extension='.zip')
96
+ zip_file = file_create_from_bytes(bytes=self.zip_bytes, path=path)
97
+ return zip_file
98
+
99
+ def save_to(self, path):
100
+ parent_folder_create(path) # make sure the parent folder exists
101
+ return self.save(path)
102
+
103
+
104
+ def size(self):
105
+ return len(self.files_list())
@@ -96,6 +96,13 @@ class Temp_Folder:
96
96
  file_path = path_combine(self.full_path, target_file)
97
97
  return file_contents(file_path)
98
98
 
99
+ def files_contents(self):
100
+ result = {}
101
+ for file_path in self.files():
102
+ full_path = path_combine(self.full_path, file_path)
103
+ result[file_path] = file_contents(full_path)
104
+ return result
105
+
99
106
  def files(self, show_parent_folder=False, include_folders=False):
100
107
  all_files = files_recursive(self.path(), include_folders=include_folders)
101
108
  if show_parent_folder:
@@ -1,7 +1,7 @@
1
1
  from osbot_utils.testing.Temp_Folder import Temp_Folder
2
2
  from osbot_utils.utils.Files import Files, is_folder, file_exists, file_name, file_move_to_folder, file_move, \
3
3
  file_move_to
4
- from osbot_utils.utils.Zip import zip_folder, zip_file_list
4
+ from osbot_utils.utils.Zip import zip_folder, zip_file__list
5
5
 
6
6
 
7
7
  class Temp_Zip():
@@ -35,7 +35,7 @@ class Temp_Zip():
35
35
  return self.zip_file
36
36
 
37
37
  def files(self):
38
- return zip_file_list(self.zip_file)
38
+ return zip_file__list(self.zip_file)
39
39
 
40
40
  def print_path(self):
41
41
  print()
@@ -3,7 +3,7 @@ import io
3
3
  from osbot_utils.testing.Temp_File import Temp_File
4
4
  from osbot_utils.testing.Temp_Folder import Temp_Folder
5
5
  from osbot_utils.utils.Files import is_file, is_folder, files_recursive, filter_parent_folder, temp_file
6
- from osbot_utils.utils.Zip import zip_files_to_bytes, zip_bytes_file_list, zip_bytes_add_file, zip_bytes_get_file
6
+ from osbot_utils.utils.Zip import zip_files_to_bytes, zip_bytes__file_list, zip_bytes__add_file, zip_bytes__get_file
7
7
 
8
8
 
9
9
  class Temp_Zip_In_Memory:
@@ -76,14 +76,14 @@ class Temp_Zip_In_Memory:
76
76
  for items in self.targets_as_content:
77
77
  file_path = items.get('file_path')
78
78
  file_contents = items.get('file_contents')
79
- zip_bytes = zip_bytes_add_file(zip_bytes, file_path, file_contents)
79
+ zip_bytes = zip_bytes__add_file(zip_bytes, file_path, file_contents)
80
80
  return zip_bytes
81
81
 
82
82
  def zip_bytes_file_content(self, file_path):
83
- return zip_bytes_get_file(self.zip_bytes(), file_path)
83
+ return zip_bytes__get_file(self.zip_bytes(), file_path)
84
84
 
85
85
  def zip_bytes_files(self):
86
- return zip_bytes_file_list(self.zip_bytes())
86
+ return zip_bytes__file_list(self.zip_bytes())
87
87
 
88
88
  def zip_buffer(self):
89
89
  targets = self.target_files_with_root_folder()
@@ -81,10 +81,12 @@ class Files:
81
81
  return glob.glob(path_pattern, recursive=recursive)
82
82
 
83
83
  @staticmethod
84
- def files(path, pattern= '*.*'): # todo: check behaviour and improve ability to detect file (vs folders)
84
+ def files(path, pattern= '*', only_files=True):
85
85
  result = []
86
86
  for file in Path(path).rglob(pattern):
87
- result.append(str(file)) # todo: see if there is a better way to do this conversion to string
87
+ if only_files and is_not_file(file):
88
+ continue
89
+ result.append(str(file)) # todo: see if there is a better way to do this conversion to string
88
90
  return sorted(result)
89
91
 
90
92
  @staticmethod
@@ -196,7 +198,7 @@ class Files:
196
198
  return path
197
199
 
198
200
  @staticmethod
199
- def folder_create_in_parent(path, name):
201
+ def folder_create_in_parent(path, name): # todo: revise the naming of this method, since it really doesn't have to do with 'parent' (it will depend on value of name)
200
202
  folder_path = path_combine(path, name)
201
203
  return folder_create(folder_path)
202
204
 
@@ -466,6 +468,9 @@ def all_parent_folders(path=None, include_path=False):
466
468
  break
467
469
  return parent_directories
468
470
 
471
+ def is_not_file(target):
472
+ return is_file(target) is False
473
+
469
474
  def file_move(source_file, target_file):
470
475
  if file_exists(source_file):
471
476
  file_copy(source_file, target_file)
@@ -486,6 +491,15 @@ def folders_names_in_folder(target):
486
491
  folders = folders_in_folder(target)
487
492
  return folders_names(folders)
488
493
 
494
+ def parent_folder_create(target):
495
+ return folder_create(parent_folder(target))
496
+
497
+ def parent_folder_exists(target):
498
+ return folder_exists(parent_folder(target))
499
+
500
+ def parent_folder_not_exists(target):
501
+ return parent_folder_exists(target) is False
502
+
489
503
  def stream_to_bytes(stream):
490
504
  return stream.read()
491
505
 
@@ -0,0 +1,25 @@
1
+ import re
2
+
3
+ from osbot_utils.utils.Status import status_error
4
+
5
+
6
+ def list__match_regex(target, pattern):
7
+ return list__match_regexes(target, [pattern])
8
+
9
+ def list__match_regexes(target, *patterns):
10
+ if len (patterns) == 0:
11
+ return target
12
+ compiled_patterns = []
13
+ for pattern in patterns:
14
+ try:
15
+ compiled_patterns.append(re.compile(pattern)) # todo: find better way to handle regex errors
16
+ except Exception as error:
17
+ return status_error(message='Error compiling pattern: {pattern}', error=error)
18
+ matched_files = []
19
+ if target and type(target) is list:
20
+ for file in target:
21
+ for compiled_pattern in compiled_patterns:
22
+ if compiled_pattern.match(file):
23
+ matched_files.append(file)
24
+ break
25
+ return matched_files
@@ -0,0 +1,238 @@
1
+ import gzip
2
+ import io
3
+ import os
4
+ import shutil
5
+ import tarfile
6
+ import zipfile
7
+ from os.path import abspath
8
+
9
+ from osbot_utils.utils.Files import temp_folder, folder_files, temp_file, is_file, file_copy, file_move, file_exists, \
10
+ file_contents_as_bytes
11
+
12
+ #########################
13
+ # actions on gz_tar_bytes
14
+
15
+ def gz_tar_bytes__file_list(gz_bytes):
16
+ gz_buffer_from_bytes = io.BytesIO(gz_bytes)
17
+ with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
18
+ decompressed_data = gz.read()
19
+ tar_buffer_from_bytes = io.BytesIO(decompressed_data) # Assuming the decompressed data is a tag file, process it
20
+ with tarfile.open(fileobj=tar_buffer_from_bytes, mode='r:') as tar:
21
+ return sorted(tar.getnames())
22
+
23
+ def gz_tar_bytes__get_file(gz_bytes, tar_file_path):
24
+ gz_buffer_from_bytes = io.BytesIO(gz_bytes)
25
+ with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
26
+ decompressed_data = gz.read()
27
+ tar_buffer_from_bytes = io.BytesIO(decompressed_data)
28
+ with tarfile.open(fileobj=tar_buffer_from_bytes, mode='r:') as tar:
29
+ extracted_file = tar.extractfile(tar_file_path)
30
+ if extracted_file:
31
+ return extracted_file.read()
32
+ else:
33
+ raise FileNotFoundError(f"The file {tar_file_path} was not found in the tar archive.")
34
+
35
+ #########################
36
+ # actions on gz_zip_bytes
37
+
38
+ def gz_zip_bytes__file_list(gz_bytes):
39
+ gz_buffer_from_bytes = io.BytesIO(gz_bytes)
40
+ with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
41
+ decompressed_data = gz.read()
42
+ zip_buffer_from_bytes = io.BytesIO(decompressed_data) # Assuming the decompressed data is a zip file, process it
43
+ with zipfile.ZipFile(zip_buffer_from_bytes, 'r') as zf:
44
+ return sorted(zf.namelist())
45
+
46
+ #########################
47
+ # actions on zipped bytes
48
+
49
+ def zip_bytes__add_file(zip_bytes, zip_file_path, file_contents): # todo: see if this is actually a valid use case (or if we should be using replace in all scenarios)
50
+ return zip_bytes__add_files(zip_bytes, {zip_file_path: file_contents})
51
+
52
+ def zip_bytes__add_file__from_disk(zip_bytes, base_path, file_to_add):
53
+ return zip_bytes__add_files__from_disk(zip_bytes, base_path, files_to_add=[file_to_add])
54
+
55
+ def zip_bytes__add_files__from_disk(zip_bytes, base_path, files_to_add, replace_files=True, path_prefix=None):
56
+ zip_files_to_add = {}
57
+ if base_path[:-1] != '/':
58
+ base_path += "/"
59
+
60
+ for file_to_add in files_to_add:
61
+ if file_exists(file_to_add):
62
+ file_contents = file_contents_as_bytes(file_to_add)
63
+ zip_file_path = file_to_add.replace(base_path, '')
64
+ if path_prefix:
65
+ zip_file_path = path_prefix + zip_file_path
66
+ zip_files_to_add[zip_file_path] = file_contents
67
+
68
+ if replace_files:
69
+ return zip_bytes__replace_files(zip_bytes, zip_files_to_add)
70
+ else:
71
+ return zip_bytes__add_files(zip_bytes, zip_files_to_add) # todo: see if this is actually a valid use case (or if we should be using replace in all scenarios)
72
+
73
+ def zip_bytes__add_files(zip_bytes, files_to_add): # todo: see if this is actually a valid use case (or if we should be using replace in all scenarios)
74
+ zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the input zip bytes
75
+
76
+ with zipfile.ZipFile(zip_buffer, 'a', zipfile.ZIP_DEFLATED) as zf:
77
+ for file_path, file_contents in files_to_add.items():
78
+ if isinstance(file_contents, str):
79
+ file_contents = file_contents.encode('utf-8')
80
+ elif not isinstance(file_contents, bytes):
81
+ continue
82
+ zf.writestr(file_path, file_contents)
83
+
84
+ return zip_buffer.getvalue()
85
+
86
+ def zip_bytes__file(zip_bytes, zip_file_path):
87
+ zip_buffer = io.BytesIO(zip_bytes)
88
+ with zipfile.ZipFile(zip_buffer, 'r') as zf:
89
+ if zip_file_path in zf.namelist():
90
+ return zf.read(zip_file_path)
91
+
92
+ def zip_bytes__files(zip_bytes):
93
+ zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the input zip bytes
94
+ files_dict = {} # Create a dictionary to store file contents
95
+
96
+ with zipfile.ZipFile(zip_buffer, 'r') as zf: # Open the zip file in read mode
97
+ for file_name in zf.namelist(): # Iterate over each file in the zip archive
98
+ files_dict[file_name] = zf.read(file_name) # Read the content of the file
99
+
100
+ return files_dict # Return the dictionary with file contents
101
+
102
+ def zip_bytes__file_list(zip_bytes):
103
+ zip_buffer_from_bytes = io.BytesIO(zip_bytes)
104
+ with zipfile.ZipFile(zip_buffer_from_bytes, 'r') as zf:
105
+ return sorted(zf.namelist())
106
+
107
+ def zip_bytes__remove_file(zip_bytes, file_to_remove):
108
+ return zip_bytes__remove_files(zip_bytes, [file_to_remove])
109
+
110
+ def zip_bytes__remove_files(zip_bytes, files_to_remove):
111
+ files_to_remove = set(files_to_remove) # Convert files_to_remove to a set for faster lookup
112
+ zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the input zip bytes
113
+ new_zip_buffer = io.BytesIO() # Create a new BytesIO buffer for the updated zip
114
+
115
+ with zipfile.ZipFile(zip_buffer, 'r') as original_zip:
116
+ with zipfile.ZipFile(new_zip_buffer, 'w') as new_zip:
117
+ for item in original_zip.infolist(): # Iterate over each item in the original zip file
118
+ if item.filename not in files_to_remove: # Read the original content and write it to the new zip file
119
+ new_zip.writestr(item, original_zip.read(item.filename))
120
+ return new_zip_buffer.getvalue() # Get the updated zip content as bytes
121
+
122
+ def zip_bytes__replace_file(zip_bytes, zip_file_path, file_contents):
123
+ files_to_replace = {zip_file_path: file_contents }
124
+ return zip_bytes__replace_files(zip_bytes, files_to_replace)
125
+
126
+ def zip_bytes__replace_files(zip_bytes, files_to_replace):
127
+ zip_bytes__without_files = zip_bytes__remove_files(zip_bytes , set(files_to_replace))
128
+ zip_bytes__with_replaced_files = zip_bytes__add_files (zip_bytes__without_files, files_to_replace )
129
+ return zip_bytes__with_replaced_files
130
+
131
+
132
+ def zip_bytes__unzip(zip_bytes, target_folder=None):
133
+ target_folder = target_folder or temp_folder() # Use the provided target folder or create a temporary one
134
+ zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the zip bytes
135
+ with zipfile.ZipFile(zip_buffer, 'r') as zf: # Open the zip file from the buffer
136
+ zf.extractall(target_folder) # Extract all files to the target folder
137
+ return target_folder # Return the path of the target folder
138
+
139
+
140
+ ########################
141
+ # actions on zipped file
142
+
143
+ def zip_file__list(path_zip_file):
144
+ if is_file(path_zip_file):
145
+ with zipfile.ZipFile(path_zip_file) as zip_file:
146
+ return sorted(zip_file.namelist())
147
+ return []
148
+
149
+ def zip_file__files(path_zip_file):
150
+ if is_file(path_zip_file):
151
+ zip_bytes = file_contents_as_bytes(path_zip_file)
152
+ return zip_bytes__files(zip_bytes)
153
+ return []
154
+
155
+ def zip_file__unzip(path_zip_file, target_folder=None, format='zip'):
156
+ target_folder = target_folder or temp_folder()
157
+ shutil.unpack_archive(path_zip_file, extract_dir=target_folder, format=format)
158
+ return target_folder
159
+
160
+ # zip creation actions
161
+ def zip_bytes_empty():
162
+
163
+ zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zip file
164
+ with zipfile.ZipFile(zip_buffer, mode='w') as _: # Use the zipfile.ZipFile class to create an empty zip file
165
+ pass # No files to add, so we just create the zip structure
166
+ return zip_buffer.getvalue() # Get the zip file content as bytes
167
+
168
+ def zip_bytes_to_file(zip_bytes, target_file=None):
169
+ if target_file is None:
170
+ target_file = temp_file(extension='.zip')
171
+ with open(target_file, 'wb') as f:
172
+ f.write(zip_bytes)
173
+ return target_file
174
+
175
+ def zip_files_to_bytes(target_files, root_folder=None):
176
+ zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zipped file
177
+ with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: # Create a ZipFile object with the buffer as the target
178
+ for entry in target_files:
179
+ if type(entry) is str: # if entry is a string, assume it's a file path
180
+ file_path = entry
181
+ file_root_folder = root_folder
182
+ else:
183
+ file_path = entry.get('file')
184
+ file_root_folder = entry.get('root_folder') or root_folder
185
+ if file_root_folder:
186
+ arcname = file_path.replace(file_root_folder,'') # Define the arcname, which is the name inside the zip file
187
+ else:
188
+ arcname = file_path # if root_path is not provided, use the full file path
189
+ zf.write(file_path, arcname) # Add the file to the zip file
190
+ zip_buffer.seek(0)
191
+ return zip_buffer
192
+
193
+ def zip_folder(root_dir, format='zip'):
194
+ return shutil.make_archive(base_name=root_dir, format=format, root_dir=root_dir)
195
+
196
+ def zip_folder_to_file (root_dir, target_file):
197
+ zip_file = zip_folder(root_dir)
198
+ return file_move(zip_file, target_file)
199
+
200
+ def zip_folder_to_bytes(root_dir): # todo add unit test
201
+ zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zipped file
202
+ with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: # Create a ZipFile object with the buffer as the target
203
+ for foldername, subfolders, filenames in os.walk(root_dir): # Walk the root_dir and add all files and folders to the zip file
204
+ for filename in filenames:
205
+ absolute_path = os.path.join(foldername, filename) # Create the complete filepath
206
+ arcname = os.path.relpath(absolute_path, root_dir) # Define the arcname, which is the name inside the zip file
207
+ zf.write(absolute_path, arcname) # Add the file to the zip file
208
+ zip_buffer.seek(0) # Reset buffer position
209
+ return zip_buffer
210
+
211
+ def zip_files(base_folder, file_pattern="*.*", target_file=None):
212
+ base_folder = abspath(base_folder)
213
+ file_list = folder_files(base_folder, file_pattern)
214
+
215
+ if len(file_list): # if there were files found
216
+ target_file = target_file or temp_file(extension='zip')
217
+ with zipfile.ZipFile(target_file,'w') as zip:
218
+ for file_name in file_list:
219
+ zip_file_path = file_name.replace(base_folder,'')
220
+ zip.write(file_name, zip_file_path)
221
+
222
+ return target_file
223
+
224
+ ###########################
225
+ # extra function's mappings
226
+
227
+ file_unzip = zip_file__unzip
228
+ folder_zip = zip_folder
229
+
230
+ unzip_file = zip_file__unzip
231
+
232
+ zip_bytes__extract_to_folder = zip_bytes__unzip
233
+ zip_bytes__file_contents = zip_bytes__file
234
+ zip_bytes__get_file = zip_bytes__file
235
+ zip_bytes__unzip_to_folder = zip_bytes__unzip
236
+
237
+ zip_list_files = zip_file__list
238
+ zip_file__file_list = zip_file__list
@@ -0,0 +1 @@
1
+ v1.29.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "osbot_utils"
3
- version = "v1.27.0"
3
+ version = "v1.29.0"
4
4
  description = "OWASP Security Bot - Utils"
5
5
  authors = ["Dinis Cruz <dinis.cruz@owasp.org>"]
6
6
  license = "MIT"
@@ -1,141 +0,0 @@
1
- import gzip
2
- import io
3
- import os
4
- import shutil
5
- import tarfile
6
- import zipfile
7
- from os.path import abspath
8
-
9
- from osbot_utils.utils.Files import temp_folder, folder_files, temp_file, is_file, file_copy, file_move
10
-
11
-
12
- def gz_tar_bytes_file_list(gz_bytes):
13
- gz_buffer_from_bytes = io.BytesIO(gz_bytes)
14
- with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
15
- decompressed_data = gz.read()
16
- tar_buffer_from_bytes = io.BytesIO(decompressed_data) # Assuming the decompressed data is a tag file, process it
17
- with tarfile.open(fileobj=tar_buffer_from_bytes, mode='r:') as tar:
18
- return sorted(tar.getnames())
19
-
20
- def gz_tar_bytes_get_file(gz_bytes, tar_file_path):
21
- gz_buffer_from_bytes = io.BytesIO(gz_bytes)
22
- with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
23
- decompressed_data = gz.read()
24
- tar_buffer_from_bytes = io.BytesIO(decompressed_data)
25
- with tarfile.open(fileobj=tar_buffer_from_bytes, mode='r:') as tar:
26
- extracted_file = tar.extractfile(tar_file_path)
27
- if extracted_file:
28
- return extracted_file.read()
29
- else:
30
- raise FileNotFoundError(f"The file {tar_file_path} was not found in the tar archive.")
31
-
32
- def gz_zip_bytes_file_list(gz_bytes):
33
- gz_buffer_from_bytes = io.BytesIO(gz_bytes)
34
- with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
35
- decompressed_data = gz.read()
36
- zip_buffer_from_bytes = io.BytesIO(decompressed_data) # Assuming the decompressed data is a zip file, process it
37
- with zipfile.ZipFile(zip_buffer_from_bytes, 'r') as zf:
38
- return sorted(zf.namelist())
39
-
40
- def unzip_file(zip_file, target_folder=None, format='zip'):
41
- target_folder = target_folder or temp_folder()
42
- shutil.unpack_archive(zip_file, extract_dir=target_folder, format=format)
43
- return target_folder
44
-
45
- def zip_bytes_add_file(zip_bytes, zip_file_path, file_contents):
46
- if type(file_contents) is str:
47
- file_contents = file_contents.encode('utf-8')
48
- elif type(file_contents) is not bytes:
49
- return None
50
- zip_buffer = io.BytesIO(zip_bytes)
51
- with zipfile.ZipFile(zip_buffer, 'a', zipfile.ZIP_DEFLATED) as zf:
52
- zf.writestr(zip_file_path, file_contents)
53
-
54
- return zip_buffer.getvalue()
55
-
56
- def zip_bytes_get_file(zip_bytes, zip_file_path):
57
- zip_buffer = io.BytesIO(zip_bytes)
58
- with zipfile.ZipFile(zip_buffer, 'r') as zf:
59
- return zf.read(zip_file_path)
60
-
61
- def zip_bytes_extract_to_folder(zip_bytes, target_folder=None):
62
- target_folder = target_folder or temp_folder() # Use the provided target folder or create a temporary one
63
- zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the zip bytes
64
- with zipfile.ZipFile(zip_buffer, 'r') as zf: # Open the zip file from the buffer
65
- zf.extractall(target_folder) # Extract all files to the target folder
66
- return target_folder # Return the path of the target folder
67
-
68
-
69
- def zip_bytes_file_list(zip_bytes):
70
- zip_buffer_from_bytes = io.BytesIO(zip_bytes)
71
- with zipfile.ZipFile(zip_buffer_from_bytes, 'r') as zf:
72
- return sorted(zf.namelist())
73
-
74
- def zip_bytes_to_file(zip_bytes, target_file=None):
75
- if target_file is None:
76
- target_file = temp_file(extension='.zip')
77
- with open(target_file, 'wb') as f:
78
- f.write(zip_bytes)
79
- return target_file
80
-
81
- def zip_files_to_bytes(target_files, root_folder=None):
82
- zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zipped file
83
- with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: # Create a ZipFile object with the buffer as the target
84
- for entry in target_files:
85
- if type(entry) is str: # if entry is a string, assume it's a file path
86
- file_path = entry
87
- file_root_folder = root_folder
88
- else:
89
- file_path = entry.get('file')
90
- file_root_folder = entry.get('root_folder') or root_folder
91
- if file_root_folder:
92
- arcname = file_path.replace(file_root_folder,'') # Define the arcname, which is the name inside the zip file
93
- else:
94
- arcname = file_path # if root_path is not provided, use the full file path
95
- zf.write(file_path, arcname) # Add the file to the zip file
96
- zip_buffer.seek(0)
97
- return zip_buffer
98
-
99
- def zip_folder(root_dir, format='zip'):
100
- return shutil.make_archive(base_name=root_dir, format=format, root_dir=root_dir)
101
-
102
- def zip_folder_to_file (root_dir, target_file):
103
- zip_file = zip_folder(root_dir)
104
- return file_move(zip_file, target_file)
105
-
106
-
107
- def zip_folder_to_bytes(root_dir): # todo add unit test
108
- zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zipped file
109
- with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: # Create a ZipFile object with the buffer as the target
110
- for foldername, subfolders, filenames in os.walk(root_dir): # Walk the root_dir and add all files and folders to the zip file
111
- for filename in filenames:
112
- absolute_path = os.path.join(foldername, filename) # Create the complete filepath
113
- arcname = os.path.relpath(absolute_path, root_dir) # Define the arcname, which is the name inside the zip file
114
- zf.write(absolute_path, arcname) # Add the file to the zip file
115
- zip_buffer.seek(0) # Reset buffer position
116
- return zip_buffer
117
-
118
- def zip_file_list(path):
119
- if is_file(path):
120
- with zipfile.ZipFile(path) as zip_file:
121
- return sorted(zip_file.namelist())
122
- return []
123
-
124
- def zip_files(base_folder, file_pattern="*.*", target_file=None):
125
- base_folder = abspath(base_folder)
126
- file_list = folder_files(base_folder, file_pattern)
127
-
128
- if len(file_list): # if there were files found
129
- target_file = target_file or temp_file(extension='zip')
130
- with zipfile.ZipFile(target_file,'w') as zip:
131
- for file_name in file_list:
132
- zip_file_path = file_name.replace(base_folder,'')
133
- zip.write(file_name, zip_file_path)
134
-
135
- return target_file
136
-
137
-
138
- # extra function's mappings
139
- file_unzip = unzip_file
140
- folder_zip = zip_folder
141
- zip_bytes_unzip_to_folder = zip_bytes_extract_to_folder
@@ -1 +0,0 @@
1
- v1.27.0
File without changes