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.
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/PKG-INFO +2 -2
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/README.md +1 -1
- osbot_utils-1.29.0/osbot_utils/helpers/Zip_Bytes.py +105 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Folder.py +7 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Zip.py +2 -2
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Zip_In_Memory.py +4 -4
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Files.py +17 -3
- osbot_utils-1.29.0/osbot_utils/utils/Regex.py +25 -0
- osbot_utils-1.29.0/osbot_utils/utils/Zip.py +238 -0
- osbot_utils-1.29.0/osbot_utils/version +1 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/pyproject.toml +1 -1
- osbot_utils-1.27.0/osbot_utils/utils/Zip.py +0 -141
- osbot_utils-1.27.0/osbot_utils/version +0 -1
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/LICENSE +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Cache_Pickle.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Kwargs_To_Disk.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Kwargs_To_Self.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Type_Safe.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/Type_Safe__List.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/base_classes/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/context_managers/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/context_managers/capture_duration.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/context_managers/disable_root_loggers.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/classes/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/classes/singleton.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/filter_list.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/group_by.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/lists/index_by.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache_on_function.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache_on_self.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/cache_on_tmp.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/capture_exception.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/capture_status.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/catch.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/context.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/depreciated.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/function_type_check.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/obj_as_context.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/remove_return_value.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/decorators/methods/required_fields.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/fluent/Fluent_Dict.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/fluent/Fluent_List.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/fluent/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Edge.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Graph.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Node.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/Mermaid__Renderer.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Edge__Config.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Node__Config.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/configs/Mermaid__Render__Config.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/examples/Mermaid_Examples__FlowChart.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram_Direction.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/models/Mermaid__Diagram__Type.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mermaid/models/Mermaid__Node__Shape.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Config.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Data.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Edge.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Node.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Random_Graphs.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraph__Serializer.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/MGraphs.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/graphs/mgraph/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/CFormat.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/CPrint.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Dict_To_Attr.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Local_Cache.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Local_Caches.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Print_Table.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Python_Audit.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Random_Seed.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/Type_Registry.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Base.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Data.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Load.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Merge.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Node.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Ast_Visit.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/Call_Tree.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Add.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Alias.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_And.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Argument.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Arguments.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Assert.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Assign.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Attribute.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Aug_Assign.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Bin_Op.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Bool_Op.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Break.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Call.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Class_Def.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Compare.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Comprehension.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Constant.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Continue.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Dict.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Eq.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Except_Handler.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Expr.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_For.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Function_Def.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Generator_Exp.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Gt.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_GtE.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_If.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_If_Exp.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Import.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Import_From.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_In.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Is.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Is_Not.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Keyword.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Lambda.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_List.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_List_Comp.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Load.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Lt.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_LtE.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Mod.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Module.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Mult.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Name.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Not.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Not_Eq.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Not_In.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Or.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Pass.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Pow.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Raise.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Return.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Set.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Slice.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Starred.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Store.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Sub.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Subscript.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Try.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Tuple.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Unary_Op.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_While.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_With.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_With_Item.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/Ast_Yield.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ast/nodes/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Config.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Data.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Row.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/Cache__Requests__Table.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/cache_requests/flows/flow__Cache__Requests.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/flows/Flow.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/flows/Task.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/flows/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Dict_To_Css.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Dict_To_Html.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Dict_To_Tags.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Html_To_Dict.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Html_To_Tag.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Base.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Body.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Div.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__H.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__HR.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Head.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Html.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Link.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/Tag__Style.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/html/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/Event__Queue.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Client.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Room.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Server.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/PubSub__Sqlite.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Connect.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Disconnect.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Join_Room.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Leave_Room.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__Event__Message.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/pubsub/schemas/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Cursor.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Database.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Field.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Globals.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Table.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Sqlite__Table__Create.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Database__Disk.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/Temp_Sqlite__Table.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Schema__Table__Requests.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Patch.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Sqlite.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/cache/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/domains/schemas/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/models/Sqlite__Field__Type.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/models/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sample_data/Sqlite__Sample_Data__Chinook.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sample_data/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/sql_builder/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/sqlite/tables/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SCP.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Cache__Requests.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Execute.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Health_Check.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Linux.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Linux__Amazon.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/SSH__Python.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/TestCase__SSH.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/ssh/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Config.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Graph.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Handler.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Print_Lines.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Print_Traces.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Stack.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Stack_Node.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__Stats.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Call__View_Model.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/Trace_Files.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/helpers/trace/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Catch.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Duration.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Hook_Method.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Log_To_Queue.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Log_To_String.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Logging.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Patch_Print.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Profiler.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Pytest.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Stderr.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Stdout.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Env_Vars.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_File.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Sys_Path.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Temp_Web_Server.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Unit_Test.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/Unzip_File.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/testing/__init__.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Assert.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Call_Stack.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Csv.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Dev.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Env.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Exceptions.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Functions.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Http.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Int.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Json.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Json_Cache.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Lists.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Misc.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Objects.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Png.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Process.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Python_Logger.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Status.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Str.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Toml.py +0 -0
- {osbot_utils-1.27.0 → osbot_utils-1.29.0}/osbot_utils/utils/Version.py +0 -0
- {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.
|
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
|
-

|
26
26
|
[](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
|
-

|
6
6
|
[](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,
|
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
|
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,
|
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 =
|
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
|
83
|
+
return zip_bytes__get_file(self.zip_bytes(), file_path)
|
84
84
|
|
85
85
|
def zip_bytes_files(self):
|
86
|
-
return
|
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= '
|
84
|
+
def files(path, pattern= '*', only_files=True):
|
85
85
|
result = []
|
86
86
|
for file in Path(path).rglob(pattern):
|
87
|
-
|
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,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
|
File without changes
|
File without changes
|