osbot-utils 1.27.0__py3-none-any.whl → 1.29.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 +105 -0
- osbot_utils/testing/Temp_Folder.py +7 -0
- osbot_utils/testing/Temp_Zip.py +2 -2
- osbot_utils/testing/Temp_Zip_In_Memory.py +4 -4
- osbot_utils/utils/Files.py +17 -3
- osbot_utils/utils/Regex.py +25 -0
- osbot_utils/utils/Zip.py +130 -33
- osbot_utils/version +1 -1
- {osbot_utils-1.27.0.dist-info → osbot_utils-1.29.0.dist-info}/METADATA +2 -2
- {osbot_utils-1.27.0.dist-info → osbot_utils-1.29.0.dist-info}/RECORD +12 -10
- {osbot_utils-1.27.0.dist-info → osbot_utils-1.29.0.dist-info}/LICENSE +0 -0
- {osbot_utils-1.27.0.dist-info → osbot_utils-1.29.0.dist-info}/WHEEL +0 -0
@@ -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:
|
osbot_utils/testing/Temp_Zip.py
CHANGED
@@ -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()
|
osbot_utils/utils/Files.py
CHANGED
@@ -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
|
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,93 @@ 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, 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
|
44
75
|
|
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
76
|
with zipfile.ZipFile(zip_buffer, 'a', zipfile.ZIP_DEFLATED) as zf:
|
52
|
-
|
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)
|
53
83
|
|
54
84
|
return zip_buffer.getvalue()
|
55
85
|
|
56
|
-
def
|
86
|
+
def zip_bytes__file(zip_bytes, zip_file_path):
|
57
87
|
zip_buffer = io.BytesIO(zip_bytes)
|
58
88
|
with zipfile.ZipFile(zip_buffer, 'r') as zf:
|
59
|
-
|
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
|
+
|
60
131
|
|
61
|
-
def
|
132
|
+
def zip_bytes__unzip(zip_bytes, target_folder=None):
|
62
133
|
target_folder = target_folder or temp_folder() # Use the provided target folder or create a temporary one
|
63
134
|
zip_buffer = io.BytesIO(zip_bytes) # Create a BytesIO buffer from the zip bytes
|
64
135
|
with zipfile.ZipFile(zip_buffer, 'r') as zf: # Open the zip file from the buffer
|
@@ -66,10 +137,33 @@ def zip_bytes_extract_to_folder(zip_bytes, target_folder=None):
|
|
66
137
|
return target_folder # Return the path of the target folder
|
67
138
|
|
68
139
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
73
167
|
|
74
168
|
def zip_bytes_to_file(zip_bytes, target_file=None):
|
75
169
|
if target_file is None:
|
@@ -103,7 +197,6 @@ def zip_folder_to_file (root_dir, target_file):
|
|
103
197
|
zip_file = zip_folder(root_dir)
|
104
198
|
return file_move(zip_file, target_file)
|
105
199
|
|
106
|
-
|
107
200
|
def zip_folder_to_bytes(root_dir): # todo add unit test
|
108
201
|
zip_buffer = io.BytesIO() # Create a BytesIO buffer to hold the zipped file
|
109
202
|
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zf: # Create a ZipFile object with the buffer as the target
|
@@ -115,12 +208,6 @@ def zip_folder_to_bytes(root_dir): # todo add unit test
|
|
115
208
|
zip_buffer.seek(0) # Reset buffer position
|
116
209
|
return zip_buffer
|
117
210
|
|
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
211
|
def zip_files(base_folder, file_pattern="*.*", target_file=None):
|
125
212
|
base_folder = abspath(base_folder)
|
126
213
|
file_list = folder_files(base_folder, file_pattern)
|
@@ -134,8 +221,18 @@ def zip_files(base_folder, file_pattern="*.*", target_file=None):
|
|
134
221
|
|
135
222
|
return target_file
|
136
223
|
|
137
|
-
|
224
|
+
###########################
|
138
225
|
# extra function's mappings
|
139
|
-
|
140
|
-
|
141
|
-
|
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
|
osbot_utils/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v1.
|
1
|
+
v1.29.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
|
|
@@ -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=GQAwNEoMXdG7CU1RDhIJ51vkgfbJZnUxjlMUmFGHL1M,3937
|
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=Dbcohr2ciex6w-kB79R41Nuoa0pgpDbKtPGnlMmJ73k,5194
|
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=bZFvjyC4TAmFH6RSp3Xvj_xBxfybCT2cE7x2qNTQmeE,20834
|
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
|
@@ -277,14 +278,15 @@ osbot_utils/utils/Objects.py,sha256=WFH3oeXR1CU03oyzXfcIlktcoXQuKw9cIJn8xTs02AE,
|
|
277
278
|
osbot_utils/utils/Png.py,sha256=V1juGp6wkpPigMJ8HcxrPDIP4bSwu51oNkLI8YqP76Y,1172
|
278
279
|
osbot_utils/utils/Process.py,sha256=lr3CTiEkN3EiBx3ZmzYmTKlQoPdkgZBRjPulMxG-zdo,2357
|
279
280
|
osbot_utils/utils/Python_Logger.py,sha256=tx8N6wRKL3RDHboDRKZn8SirSJdSAE9cACyJkxrThZ8,12792
|
281
|
+
osbot_utils/utils/Regex.py,sha256=0ubgp8HKsS3PNe2H6XlzMIcUuV7jhga3VkQVDNOJWuA,866
|
280
282
|
osbot_utils/utils/Status.py,sha256=Yq4s0TelXgn0i2QjCP9V8mP30GabXp_UL-jjM6Iwiw4,4305
|
281
283
|
osbot_utils/utils/Str.py,sha256=kxdY8ROX4FdJtCaMTfOc8fK_xcDICprNkefHu2MMNU4,2585
|
282
284
|
osbot_utils/utils/Toml.py,sha256=dqiegndCJF7V1YT1Tc-b0-Bl6QWyL5q30urmQwMXfMQ,1402
|
283
285
|
osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
|
284
|
-
osbot_utils/utils/Zip.py,sha256=
|
286
|
+
osbot_utils/utils/Zip.py,sha256=t9txUxJzLBEHot6WJwF0iTTUQ1Gf_V2pVwsWzAqw_NU,12163
|
285
287
|
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.
|
288
|
+
osbot_utils/version,sha256=Cnimb4t_Vj3piSoNKuKNxuAK7SFZPFgzcFqpUzq2s2A,8
|
289
|
+
osbot_utils-1.29.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
290
|
+
osbot_utils-1.29.0.dist-info/METADATA,sha256=CBXxh-9F_qSZWcp7WC1L7HM7_DtuHivZ5rp5STqAS9U,1266
|
291
|
+
osbot_utils-1.29.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
292
|
+
osbot_utils-1.29.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|