osbot-utils 1.26.0__py3-none-any.whl → 1.28.0__py3-none-any.whl
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/helpers/Zip_Bytes.py +79 -0
- osbot_utils/testing/Temp_Folder.py +5 -1
- osbot_utils/testing/Temp_Zip.py +8 -4
- osbot_utils/testing/Temp_Zip_In_Memory.py +4 -4
- osbot_utils/utils/Files.py +47 -11
- osbot_utils/utils/Zip.py +127 -32
- osbot_utils/version +1 -1
- {osbot_utils-1.26.0.dist-info → osbot_utils-1.28.0.dist-info}/METADATA +2 -2
- {osbot_utils-1.26.0.dist-info → osbot_utils-1.28.0.dist-info}/RECORD +11 -10
- {osbot_utils-1.26.0.dist-info → osbot_utils-1.28.0.dist-info}/LICENSE +0 -0
- {osbot_utils-1.26.0.dist-info → osbot_utils-1.28.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,79 @@
|
|
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.Zip import zip_bytes_empty, zip_bytes__files, zip_bytes__add_file, zip_bytes__add_files, \
|
5
|
+
zip_bytes__replace_files, zip_bytes__replace_file, zip_bytes__file_list, zip_bytes__file, \
|
6
|
+
zip_bytes__add_file__from_disk, zip_bytes__add_files__from_disk, zip_files, zip_file__files
|
7
|
+
|
8
|
+
|
9
|
+
class Zip_Bytes(Type_Safe):
|
10
|
+
zip_bytes : bytes
|
11
|
+
|
12
|
+
def __enter__(self):
|
13
|
+
self.zip_bytes = zip_bytes_empty()
|
14
|
+
return self
|
15
|
+
|
16
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
17
|
+
pass
|
18
|
+
|
19
|
+
def add_file(self, file_path, file_contents):
|
20
|
+
self.zip_bytes = zip_bytes__add_file(self.zip_bytes, file_path, file_contents)
|
21
|
+
return self
|
22
|
+
|
23
|
+
def add_file__from_disk(self, base_path, file_to_add):
|
24
|
+
self.zip_bytes = zip_bytes__add_file__from_disk(self.zip_bytes, base_path, file_to_add)
|
25
|
+
return self
|
26
|
+
|
27
|
+
def add_files(self, files_to_add):
|
28
|
+
self.zip_bytes = zip_bytes__add_files(self.zip_bytes, files_to_add)
|
29
|
+
return self
|
30
|
+
|
31
|
+
def add_files__from_disk(self, base_path, files_to_add):
|
32
|
+
self.zip_bytes = zip_bytes__add_files__from_disk(self.zip_bytes, base_path, files_to_add)
|
33
|
+
return self
|
34
|
+
|
35
|
+
def add_folder__from_disk(self, base_path, folder_to_add, pattern="*"):
|
36
|
+
files_to_add = files_list(folder_to_add, pattern=pattern)
|
37
|
+
return self.add_files__from_disk(base_path, files_to_add)
|
38
|
+
|
39
|
+
def add_from_zip_file(self, path_zip_file):
|
40
|
+
files_to_add = zip_file__files(path_zip_file)
|
41
|
+
self.add_files(files_to_add)
|
42
|
+
return self
|
43
|
+
|
44
|
+
def empty(self):
|
45
|
+
return self.size() == 0
|
46
|
+
|
47
|
+
def file(self, file_path):
|
48
|
+
return zip_bytes__file(self.zip_bytes, file_path)
|
49
|
+
|
50
|
+
def files(self):
|
51
|
+
return zip_bytes__files(self.zip_bytes)
|
52
|
+
|
53
|
+
def files_list(self):
|
54
|
+
return zip_bytes__file_list(self.zip_bytes)
|
55
|
+
|
56
|
+
def print_files_list(self):
|
57
|
+
pprint(self.files_list())
|
58
|
+
return self
|
59
|
+
def replace_files(self, files_to_replace):
|
60
|
+
self.zip_bytes = zip_bytes__replace_files(self.zip_bytes, files_to_replace)
|
61
|
+
return self
|
62
|
+
|
63
|
+
def replace_file(self, file_path, file_contents):
|
64
|
+
self.zip_bytes = zip_bytes__replace_file(self.zip_bytes, file_path, file_contents)
|
65
|
+
return self
|
66
|
+
|
67
|
+
def save(self, path=None):
|
68
|
+
if path is None:
|
69
|
+
path = temp_file(extension='.zip')
|
70
|
+
zip_file = file_create_from_bytes(bytes=self.zip_bytes, path=path)
|
71
|
+
return zip_file
|
72
|
+
|
73
|
+
def save_to(self, path):
|
74
|
+
parent_folder_create(path) # make sure the parent folder exists
|
75
|
+
return self.save(path)
|
76
|
+
|
77
|
+
|
78
|
+
def size(self):
|
79
|
+
return len(self.files_list())
|
@@ -4,7 +4,7 @@ from osbot_utils.utils.Misc import random_string
|
|
4
4
|
|
5
5
|
from osbot_utils.utils.Files import path_combine, temp_folder_current, safe_file_name, folder_exists, folder_create, \
|
6
6
|
folder_delete_recursively, files_list, file_create, folder_files, folders_recursive, files_find, files_recursive, \
|
7
|
-
temp_file_in_folder, create_folder, filter_parent_folder
|
7
|
+
temp_file_in_folder, create_folder, filter_parent_folder, file_contents
|
8
8
|
from osbot_utils.utils.Zip import zip_folder
|
9
9
|
|
10
10
|
|
@@ -92,6 +92,10 @@ class Temp_Folder:
|
|
92
92
|
def path(self):
|
93
93
|
return self.full_path
|
94
94
|
|
95
|
+
def file_contents(self, target_file):
|
96
|
+
file_path = path_combine(self.full_path, target_file)
|
97
|
+
return file_contents(file_path)
|
98
|
+
|
95
99
|
def files(self, show_parent_folder=False, include_folders=False):
|
96
100
|
all_files = files_recursive(self.path(), include_folders=include_folders)
|
97
101
|
if show_parent_folder:
|
osbot_utils/testing/Temp_Zip.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
from osbot_utils.testing.Temp_Folder import Temp_Folder
|
2
|
-
from osbot_utils.utils.Files import Files, is_folder, file_exists, file_name
|
3
|
-
|
2
|
+
from osbot_utils.utils.Files import Files, is_folder, file_exists, file_name, file_move_to_folder, file_move, \
|
3
|
+
file_move_to
|
4
|
+
from osbot_utils.utils.Zip import zip_folder, zip_file__list
|
4
5
|
|
5
6
|
|
6
7
|
class Temp_Zip():
|
@@ -34,7 +35,7 @@ class Temp_Zip():
|
|
34
35
|
return self.zip_file
|
35
36
|
|
36
37
|
def files(self):
|
37
|
-
return
|
38
|
+
return zip_file__list(self.zip_file)
|
38
39
|
|
39
40
|
def print_path(self):
|
40
41
|
print()
|
@@ -42,4 +43,7 @@ class Temp_Zip():
|
|
42
43
|
return self
|
43
44
|
|
44
45
|
def zip_file_exists(self):
|
45
|
-
return file_exists(self.zip_file)
|
46
|
+
return file_exists(self.zip_file)
|
47
|
+
|
48
|
+
def move_to(self, target_file):
|
49
|
+
file_move_to(self.zip_file, target_file)
|
@@ -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()
|
osbot_utils/utils/Files.py
CHANGED
@@ -8,6 +8,8 @@ import shutil
|
|
8
8
|
import tempfile
|
9
9
|
from os.path import abspath, join
|
10
10
|
from pathlib import Path, PosixPath
|
11
|
+
from typing import Union
|
12
|
+
|
11
13
|
from osbot_utils.utils.Misc import bytes_to_base64, base64_to_bytes, random_string
|
12
14
|
|
13
15
|
|
@@ -79,10 +81,12 @@ class Files:
|
|
79
81
|
return glob.glob(path_pattern, recursive=recursive)
|
80
82
|
|
81
83
|
@staticmethod
|
82
|
-
def files(path, pattern= '*.*'):
|
84
|
+
def files(path, pattern= '*.*', only_files=True):
|
83
85
|
result = []
|
84
86
|
for file in Path(path).rglob(pattern):
|
85
|
-
|
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
|
86
90
|
return sorted(result)
|
87
91
|
|
88
92
|
@staticmethod
|
@@ -194,7 +198,7 @@ class Files:
|
|
194
198
|
return path
|
195
199
|
|
196
200
|
@staticmethod
|
197
|
-
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)
|
198
202
|
folder_path = path_combine(path, name)
|
199
203
|
return folder_create(folder_path)
|
200
204
|
|
@@ -306,13 +310,24 @@ class Files:
|
|
306
310
|
return Files.open(path, mode='rb')
|
307
311
|
|
308
312
|
@staticmethod
|
309
|
-
def path_combine(path1, path2):
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
313
|
+
# def path_combine(path1, path2):
|
314
|
+
# if type(path1) in [str, Path] and type(path2) in [str, Path]:
|
315
|
+
# parent_path = str(path1)
|
316
|
+
# sub_path = str(path2)
|
317
|
+
# if sub_path.startswith('/'):
|
318
|
+
# sub_path = sub_path[1:]
|
319
|
+
# return abspath(join(parent_path,sub_path))
|
320
|
+
|
321
|
+
def path_combine(path1: Union[str, os.PathLike], path2: Union[str, os.PathLike]) -> str:
|
322
|
+
if path1 is None or path2 is None:
|
323
|
+
raise ValueError("Both paths must be provided")
|
324
|
+
|
325
|
+
parent_path = str(path1)
|
326
|
+
sub_path = str(path2)
|
327
|
+
|
328
|
+
sub_path = sub_path.lstrip('/') # Remove leading slashes from sub_path
|
329
|
+
|
330
|
+
return abspath(join(parent_path, sub_path))
|
316
331
|
|
317
332
|
@staticmethod
|
318
333
|
def parent_folder(path, use_full_path=False):
|
@@ -451,8 +466,11 @@ def all_parent_folders(path=None, include_path=False):
|
|
451
466
|
if path and path not in parent_directories: # to handle the root path case
|
452
467
|
parent_directories.append(path)
|
453
468
|
break
|
454
|
-
|
455
469
|
return parent_directories
|
470
|
+
|
471
|
+
def is_not_file(target):
|
472
|
+
return is_file(target) is False
|
473
|
+
|
456
474
|
def file_move(source_file, target_file):
|
457
475
|
if file_exists(source_file):
|
458
476
|
file_copy(source_file, target_file)
|
@@ -461,10 +479,27 @@ def file_move(source_file, target_file):
|
|
461
479
|
return True
|
462
480
|
return False
|
463
481
|
|
482
|
+
def file_move_to_folder(source_file, target_folder):
|
483
|
+
if file_exists(source_file):
|
484
|
+
if folder_exists(target_folder):
|
485
|
+
target_file = path_combine(target_folder, file_name(source_file))
|
486
|
+
if file_move(source_file, target_file):
|
487
|
+
return target_file
|
488
|
+
|
489
|
+
|
464
490
|
def folders_names_in_folder(target):
|
465
491
|
folders = folders_in_folder(target)
|
466
492
|
return folders_names(folders)
|
467
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
|
+
|
468
503
|
def stream_to_bytes(stream):
|
469
504
|
return stream.read()
|
470
505
|
|
@@ -506,6 +541,7 @@ file_full_path = absolute_path
|
|
506
541
|
file_lines = Files.lines
|
507
542
|
file_lines_gz = Files.lines_gz
|
508
543
|
file_md5 = Files.contents_md5
|
544
|
+
file_move_to = file_move
|
509
545
|
file_name = Files.file_name
|
510
546
|
file_name_without_extension = Files.file_name_without_extension
|
511
547
|
file_not_exists = Files.not_exists
|
osbot_utils/utils/Zip.py
CHANGED
@@ -6,10 +6,13 @@ import tarfile
|
|
6
6
|
import zipfile
|
7
7
|
from os.path import abspath
|
8
8
|
|
9
|
-
from osbot_utils.utils.Files import temp_folder, folder_files, temp_file, is_file, file_copy, file_move
|
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
|
10
11
|
|
12
|
+
#########################
|
13
|
+
# actions on gz_tar_bytes
|
11
14
|
|
12
|
-
def
|
15
|
+
def gz_tar_bytes__file_list(gz_bytes):
|
13
16
|
gz_buffer_from_bytes = io.BytesIO(gz_bytes)
|
14
17
|
with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
|
15
18
|
decompressed_data = gz.read()
|
@@ -17,7 +20,7 @@ def gz_tar_bytes_file_list(gz_bytes):
|
|
17
20
|
with tarfile.open(fileobj=tar_buffer_from_bytes, mode='r:') as tar:
|
18
21
|
return sorted(tar.getnames())
|
19
22
|
|
20
|
-
def
|
23
|
+
def gz_tar_bytes__get_file(gz_bytes, tar_file_path):
|
21
24
|
gz_buffer_from_bytes = io.BytesIO(gz_bytes)
|
22
25
|
with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
|
23
26
|
decompressed_data = gz.read()
|
@@ -29,7 +32,10 @@ def gz_tar_bytes_get_file(gz_bytes, tar_file_path):
|
|
29
32
|
else:
|
30
33
|
raise FileNotFoundError(f"The file {tar_file_path} was not found in the tar archive.")
|
31
34
|
|
32
|
-
|
35
|
+
#########################
|
36
|
+
# actions on gz_zip_bytes
|
37
|
+
|
38
|
+
def gz_zip_bytes__file_list(gz_bytes):
|
33
39
|
gz_buffer_from_bytes = io.BytesIO(gz_bytes)
|
34
40
|
with gzip.GzipFile(fileobj=gz_buffer_from_bytes, mode='rb') as gz:
|
35
41
|
decompressed_data = gz.read()
|
@@ -37,28 +43,90 @@ def gz_zip_bytes_file_list(gz_bytes):
|
|
37
43
|
with zipfile.ZipFile(zip_buffer_from_bytes, 'r') as zf:
|
38
44
|
return sorted(zf.namelist())
|
39
45
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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):
|
56
|
+
zip_files_to_add = {}
|
57
|
+
if base_path[:-1] != '/':
|
58
|
+
base_path += "/"
|
59
|
+
for file_to_add in files_to_add:
|
60
|
+
if file_exists(file_to_add):
|
61
|
+
file_contents = file_contents_as_bytes(file_to_add)
|
62
|
+
zip_file_path = file_to_add.replace(base_path, '')
|
63
|
+
zip_files_to_add[zip_file_path] = file_contents
|
64
|
+
|
65
|
+
if replace_files:
|
66
|
+
return zip_bytes__replace_files(zip_bytes, zip_files_to_add)
|
67
|
+
else:
|
68
|
+
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)
|
69
|
+
|
70
|
+
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)
|
71
|
+
zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the input zip bytes
|
44
72
|
|
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
73
|
with zipfile.ZipFile(zip_buffer, 'a', zipfile.ZIP_DEFLATED) as zf:
|
52
|
-
|
74
|
+
for file_path, file_contents in files_to_add.items():
|
75
|
+
if isinstance(file_contents, str):
|
76
|
+
file_contents = file_contents.encode('utf-8')
|
77
|
+
elif not isinstance(file_contents, bytes):
|
78
|
+
continue
|
79
|
+
zf.writestr(file_path, file_contents)
|
53
80
|
|
54
81
|
return zip_buffer.getvalue()
|
55
82
|
|
56
|
-
def
|
83
|
+
def zip_bytes__file(zip_bytes, zip_file_path):
|
57
84
|
zip_buffer = io.BytesIO(zip_bytes)
|
58
85
|
with zipfile.ZipFile(zip_buffer, 'r') as zf:
|
59
|
-
|
86
|
+
if zip_file_path in zf.namelist():
|
87
|
+
return zf.read(zip_file_path)
|
88
|
+
|
89
|
+
def zip_bytes__files(zip_bytes):
|
90
|
+
zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the input zip bytes
|
91
|
+
files_dict = {} # Create a dictionary to store file contents
|
92
|
+
|
93
|
+
with zipfile.ZipFile(zip_buffer, 'r') as zf: # Open the zip file in read mode
|
94
|
+
for file_name in zf.namelist(): # Iterate over each file in the zip archive
|
95
|
+
files_dict[file_name] = zf.read(file_name) # Read the content of the file
|
96
|
+
|
97
|
+
return files_dict # Return the dictionary with file contents
|
98
|
+
|
99
|
+
def zip_bytes__file_list(zip_bytes):
|
100
|
+
zip_buffer_from_bytes = io.BytesIO(zip_bytes)
|
101
|
+
with zipfile.ZipFile(zip_buffer_from_bytes, 'r') as zf:
|
102
|
+
return sorted(zf.namelist())
|
103
|
+
|
104
|
+
def zip_bytes__remove_file(zip_bytes, file_to_remove):
|
105
|
+
return zip_bytes__remove_files(zip_bytes, [file_to_remove])
|
106
|
+
|
107
|
+
def zip_bytes__remove_files(zip_bytes, files_to_remove):
|
108
|
+
files_to_remove = set(files_to_remove) # Convert files_to_remove to a set for faster lookup
|
109
|
+
zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the input zip bytes
|
110
|
+
new_zip_buffer = io.BytesIO() # Create a new BytesIO buffer for the updated zip
|
111
|
+
|
112
|
+
with zipfile.ZipFile(zip_buffer, 'r') as original_zip:
|
113
|
+
with zipfile.ZipFile(new_zip_buffer, 'w') as new_zip:
|
114
|
+
for item in original_zip.infolist(): # Iterate over each item in the original zip file
|
115
|
+
if item.filename not in files_to_remove: # Read the original content and write it to the new zip file
|
116
|
+
new_zip.writestr(item, original_zip.read(item.filename))
|
117
|
+
return new_zip_buffer.getvalue() # Get the updated zip content as bytes
|
118
|
+
|
119
|
+
def zip_bytes__replace_file(zip_bytes, zip_file_path, file_contents):
|
120
|
+
files_to_replace = {zip_file_path: file_contents }
|
121
|
+
return zip_bytes__replace_files(zip_bytes, files_to_replace)
|
122
|
+
|
123
|
+
def zip_bytes__replace_files(zip_bytes, files_to_replace):
|
124
|
+
zip_bytes__without_files = zip_bytes__remove_files(zip_bytes , set(files_to_replace))
|
125
|
+
zip_bytes__with_replaced_files = zip_bytes__add_files (zip_bytes__without_files, files_to_replace )
|
126
|
+
return zip_bytes__with_replaced_files
|
127
|
+
|
60
128
|
|
61
|
-
def
|
129
|
+
def zip_bytes__unzip(zip_bytes, target_folder=None):
|
62
130
|
target_folder = target_folder or temp_folder() # Use the provided target folder or create a temporary one
|
63
131
|
zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the zip bytes
|
64
132
|
with zipfile.ZipFile(zip_buffer, 'r') as zf: # Open the zip file from the buffer
|
@@ -66,10 +134,33 @@ def zip_bytes_extract_to_folder(zip_bytes, target_folder=None):
|
|
66
134
|
return target_folder # Return the path of the target folder
|
67
135
|
|
68
136
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
137
|
+
########################
|
138
|
+
# actions on zipped file
|
139
|
+
|
140
|
+
def zip_file__list(path_zip_file):
|
141
|
+
if is_file(path_zip_file):
|
142
|
+
with zipfile.ZipFile(path_zip_file) as zip_file:
|
143
|
+
return sorted(zip_file.namelist())
|
144
|
+
return []
|
145
|
+
|
146
|
+
def zip_file__files(path_zip_file):
|
147
|
+
if is_file(path_zip_file):
|
148
|
+
zip_bytes = file_contents_as_bytes(path_zip_file)
|
149
|
+
return zip_bytes__files(zip_bytes)
|
150
|
+
return []
|
151
|
+
|
152
|
+
def zip_file__unzip(path_zip_file, target_folder=None, format='zip'):
|
153
|
+
target_folder = target_folder or temp_folder()
|
154
|
+
shutil.unpack_archive(path_zip_file, extract_dir=target_folder, format=format)
|
155
|
+
return target_folder
|
156
|
+
|
157
|
+
# zip creation actions
|
158
|
+
def zip_bytes_empty():
|
159
|
+
|
160
|
+
zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zip file
|
161
|
+
with zipfile.ZipFile(zip_buffer, mode='w') as _: # Use the zipfile.ZipFile class to create an empty zip file
|
162
|
+
pass # No files to add, so we just create the zip structure
|
163
|
+
return zip_buffer.getvalue() # Get the zip file content as bytes
|
73
164
|
|
74
165
|
def zip_bytes_to_file(zip_bytes, target_file=None):
|
75
166
|
if target_file is None:
|
@@ -103,7 +194,6 @@ def zip_folder_to_file (root_dir, target_file):
|
|
103
194
|
zip_file = zip_folder(root_dir)
|
104
195
|
return file_move(zip_file, target_file)
|
105
196
|
|
106
|
-
|
107
197
|
def zip_folder_to_bytes(root_dir): # todo add unit test
|
108
198
|
zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zipped file
|
109
199
|
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: # Create a ZipFile object with the buffer as the target
|
@@ -115,12 +205,6 @@ def zip_folder_to_bytes(root_dir): # todo add unit test
|
|
115
205
|
zip_buffer.seek(0) # Reset buffer position
|
116
206
|
return zip_buffer
|
117
207
|
|
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
208
|
def zip_files(base_folder, file_pattern="*.*", target_file=None):
|
125
209
|
base_folder = abspath(base_folder)
|
126
210
|
file_list = folder_files(base_folder, file_pattern)
|
@@ -134,7 +218,18 @@ def zip_files(base_folder, file_pattern="*.*", target_file=None):
|
|
134
218
|
|
135
219
|
return target_file
|
136
220
|
|
137
|
-
|
221
|
+
###########################
|
138
222
|
# extra function's mappings
|
139
|
-
|
140
|
-
|
223
|
+
|
224
|
+
file_unzip = zip_file__unzip
|
225
|
+
folder_zip = zip_folder
|
226
|
+
|
227
|
+
unzip_file = zip_file__unzip
|
228
|
+
|
229
|
+
zip_bytes__extract_to_folder = zip_bytes__unzip
|
230
|
+
zip_bytes__file_contents = zip_bytes__file
|
231
|
+
zip_bytes__get_file = zip_bytes__file
|
232
|
+
zip_bytes__unzip_to_folder = zip_bytes__unzip
|
233
|
+
|
234
|
+
zip_list_files = zip_file__list
|
235
|
+
zip_file__file_list = zip_file__list
|
osbot_utils/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v1.
|
1
|
+
v1.28.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: osbot_utils
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.28.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
|
|
@@ -63,6 +63,7 @@ osbot_utils/helpers/Print_Table.py,sha256=LEXbyqGg_6WSraI4cob4bNNSu18ddqvALp1zGK
|
|
63
63
|
osbot_utils/helpers/Python_Audit.py,sha256=shpZlluJwqJBAlad6xN01FkgC1TsQ48RLvR5ZjmrKa4,1539
|
64
64
|
osbot_utils/helpers/Random_Seed.py,sha256=14btja8LDN9cMGWaz4fCNcMRU_eyx49gas-_PQvHgy4,634
|
65
65
|
osbot_utils/helpers/Type_Registry.py,sha256=Ajk3SyMSKDi2g9SJYUtTgg7PZkAgydaHcpbGuEN3S94,311
|
66
|
+
osbot_utils/helpers/Zip_Bytes.py,sha256=Ls_AW_-vCusZxL3-Jfl9bJfOpwl4e7nTzxrXSWJ6Ty8,2850
|
66
67
|
osbot_utils/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
67
68
|
osbot_utils/helpers/ast/Ast.py,sha256=lcPQOSxXI6zgmMnIVF9WM6ISqViWX-sq4d_UC0CDG8s,1155
|
68
69
|
osbot_utils/helpers/ast/Ast_Base.py,sha256=5rHMupBlN_n6lOC31UnSW_lWqxqxaE31v0gn-t32OgQ,3708
|
@@ -251,11 +252,11 @@ osbot_utils/testing/Stderr.py,sha256=wi1gfjpsxnBK3aOl2jzCTWI-0En1HtPgEin97148_MQ
|
|
251
252
|
osbot_utils/testing/Stdout.py,sha256=XQ9OlOW1aHXY1TiNu8O5b75RoDnoaX5RyMHml3OjlKw,459
|
252
253
|
osbot_utils/testing/Temp_Env_Vars.py,sha256=oFuaegBlaV0aySkPe1Nzf-mdIKN03oTUKNfKijGz__M,751
|
253
254
|
osbot_utils/testing/Temp_File.py,sha256=yZBL9MmcNU4PCQ4xlF4rSss4GylKoX3T_AJF-BlQhdI,1693
|
254
|
-
osbot_utils/testing/Temp_Folder.py,sha256=
|
255
|
+
osbot_utils/testing/Temp_Folder.py,sha256=gewV0L3B4ScKyorkVOQaQ-vz4DbeVRnqxCMS9A0eVLo,4953
|
255
256
|
osbot_utils/testing/Temp_Sys_Path.py,sha256=gOMD-7dQYQlejoDYUqsrmuZQ9DLC07ymPZB3zYuNmG4,256
|
256
257
|
osbot_utils/testing/Temp_Web_Server.py,sha256=0A-gZsd0_3wRj2YuBEOWyV2rhT6dcS2BlArngPXGTtk,3186
|
257
|
-
osbot_utils/testing/Temp_Zip.py,sha256=
|
258
|
-
osbot_utils/testing/Temp_Zip_In_Memory.py,sha256=
|
258
|
+
osbot_utils/testing/Temp_Zip.py,sha256=gppbJchk4tw_bu-7Vt6iJS9mGxeCvNNMMDzeVKHqRv8,1489
|
259
|
+
osbot_utils/testing/Temp_Zip_In_Memory.py,sha256=ibDIWt3K4CX558PbkLbX3InHyWYZcwQwajFm1kAPW5U,3284
|
259
260
|
osbot_utils/testing/Unit_Test.py,sha256=MReR_wDGbbXFDPz7cmuGflcTxRB6TBnO9mYqRpSq8Pk,1304
|
260
261
|
osbot_utils/testing/Unzip_File.py,sha256=V5H97XO9rlvG5EYOSzAH4kTtAH1ohZ8R8ImvJh46ZNg,1177
|
261
262
|
osbot_utils/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -265,7 +266,7 @@ osbot_utils/utils/Csv.py,sha256=oHLVpjRJqrLMz9lubMCNEoThXWju5rNTprcwHc1zq2c,1012
|
|
265
266
|
osbot_utils/utils/Dev.py,sha256=HibpQutYy_iG8gGV8g1GztxNN4l29E4Bi7UZaVL6-L8,1203
|
266
267
|
osbot_utils/utils/Env.py,sha256=uYLhqVXqqgfh03Zmf9Vdy9zFdFf0rasW6lteh_VM1xQ,5078
|
267
268
|
osbot_utils/utils/Exceptions.py,sha256=KyOUHkXQ_6jDTq04Xm261dbEZuRidtsM4dgzNwSG8-8,389
|
268
|
-
osbot_utils/utils/Files.py,sha256=
|
269
|
+
osbot_utils/utils/Files.py,sha256=SLuu_RuugTKvXi0zOJh_mkr2FE6TUyQvW60vgZbkHEY,20836
|
269
270
|
osbot_utils/utils/Functions.py,sha256=0E6alPJ0fJpBiJgFOWooCOi265wSRyxxXAJ5CELBnso,3498
|
270
271
|
osbot_utils/utils/Http.py,sha256=Z8V149M2HDrKBoXkDD5EXgqTGx6vQoUqXugXK__wcuw,4572
|
271
272
|
osbot_utils/utils/Int.py,sha256=PmlUdU4lSwf4gJdmTVdqclulkEp7KPCVUDO6AcISMF4,116
|
@@ -281,10 +282,10 @@ osbot_utils/utils/Status.py,sha256=Yq4s0TelXgn0i2QjCP9V8mP30GabXp_UL-jjM6Iwiw4,4
|
|
281
282
|
osbot_utils/utils/Str.py,sha256=kxdY8ROX4FdJtCaMTfOc8fK_xcDICprNkefHu2MMNU4,2585
|
282
283
|
osbot_utils/utils/Toml.py,sha256=dqiegndCJF7V1YT1Tc-b0-Bl6QWyL5q30urmQwMXfMQ,1402
|
283
284
|
osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
|
284
|
-
osbot_utils/utils/Zip.py,sha256=
|
285
|
+
osbot_utils/utils/Zip.py,sha256=nj3_PrvKRlyeSWcFlbvEwhmu87Gl-siUfIoXxDPE32c,12056
|
285
286
|
osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
286
|
-
osbot_utils/version,sha256=
|
287
|
-
osbot_utils-1.
|
288
|
-
osbot_utils-1.
|
289
|
-
osbot_utils-1.
|
290
|
-
osbot_utils-1.
|
287
|
+
osbot_utils/version,sha256=MNi3rJWAauptL9RTT15nAiO62YEIThbbzD7BICVSPoQ,8
|
288
|
+
osbot_utils-1.28.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
289
|
+
osbot_utils-1.28.0.dist-info/METADATA,sha256=LvLJ-gezDkfRszvTQeU-WyLaVX-z0RJmohGZ1qdQkk8,1266
|
290
|
+
osbot_utils-1.28.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
291
|
+
osbot_utils-1.28.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|