File size: 6,755 Bytes
5fa5566
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import filecmp
import os
import shutil
import tempfile
from inspect import currentframe, getframeinfo
from pathlib import Path

# return the itens in array that is not inexisting or empty
def validate_files(paths):
    valid_files = [path for path in paths if file_is_valid(path)]
    return valid_files

# check if a file is existing and not empty
def file_is_valid(path):
    if path is not None and path.is_file():
        size = path.stat().st_size
        if size > 0:
            return True
    return False

# validate if an string is a valid dir or path with valid content
def check_valid_path(path_str):
    # create a Path object from the input string
    path = Path(path_str)

    # check if the path exists
    if not path.exists():
        raise FileNotFoundError(f"The path '{path_str}' does not exist.")

    # check if it's a directory with at least one file or a valid file with content
    if path.is_dir():
        # check if the directory has at least one file with content
        files_with_content = [file for file in path.iterdir() if file.is_file() and file.stat().st_size > 0]
        if not files_with_content:
            raise ValueError(f"The directory '{path_str}' does not contain any files with content.")
    elif path.is_file():
        # check if the file has content
        if path.stat().st_size == 0:
            raise ValueError(f"The file '{path_str}' does not contain any content.")
    else:
        raise ValueError(f"The path '{path_str}' is neither a valid directory nor a valid file.")

    return path

# validate if an string is a valid dir or path with valid content
def check_existing_path(path_str):
    # create a Path object from the input string
    path = Path(path_str)

    # check if the path exists
    if not path.exists():
        raise FileNotFoundError(f"The path '{path_str}' does not exist.")

    # check if it's a directory with at least one file or a valid file with content
    if not path.is_dir() and not path.is_file():
        raise ValueError(f"The path '{path_str}' is neither a valid directory nor a valid file.")

    return path_str

# create a tempfile class to use as object
class TempFile:

    def __init__(self, final_path: Path, file_ext: str = None):
        self.final_path: Path = None if final_path is None else Path(
            final_path)
        self.file_ext = file_ext
        os.makedirs(Path(Path(getframeinfo(
            currentframe()).filename).resolve().parent, "temp"), exist_ok=True)
        self.temp_file: tempfile.NamedTemporaryFile = tempfile.NamedTemporaryFile(dir=Path(Path(getframeinfo(currentframe()).filename).resolve().parent, "temp"),
                                                                                  delete=False, suffix=file_ext)

        self.temp_file_name = self.temp_file.name
        self.temp_file_path: Path = Path(self.temp_file.name)

        self.temp_file.close()

    # return the actual path of the file
    def getpath(self):
        if self.temp_file_path.is_file():
            return self.temp_file_path
        elif file_is_valid(self.final_path):
            return self.final_path
        else:
            return None

    # return the actual path of the file if not empty
    def getvalidpath(self):
        if file_is_valid(self.temp_file_path):
            return self.temp_file_path
        elif file_is_valid(self.final_path):
            return self.final_path
        else:
            return None

    # save the temp file into final path
    def save(self, overwrite_if_valid: bool = True, update_path: Path = None):
        # update final path case user specifies it
        if update_path is None:
            path: Path = self.final_path
        else:
            path: Path = update_path

        try:
            # if file not valid ou overwrite is enabled, move overwiting existing file
            if not file_is_valid(self.final_path) or overwrite_if_valid:
                os.makedirs(path.parent, exist_ok=True)
                shutil.move(self.temp_file_path, path)
                self.final_path = path
        except Exception as e:
            print(f"Error saving file: {e}")
            return

    # delete the file
    def destroy(self):
        try:
            # destroy temporary file if it exists
            if file_is_valid(self.temp_file_path):
                os.remove(self.temp_file_path)
        except Exception:
            return

# copy an source file to destination if destination file is not equals to source
def copy_file_if_different(src_file: Path, dst_file: Path, silent: bool = False):
    if file_is_valid(dst_file):
        # Check if destination file exists and is different from source file
        if filecmp.cmp(src_file, dst_file) and not silent:
            print(f"{dst_file} already exists and is the same. No need to copy.")
            return

    os.makedirs(dst_file.parent, exist_ok=True)
    shutil.copyfile(src_file, dst_file)
    if not silent:
        print(f"copied to {dst_file}")

# function to delete dir and all its content using shutil
def delete_folder(path: Path):
    if path.is_dir():
        shutil.rmtree(path)


def update_folder_times(folder_path):
    folder_path = Path(folder_path)

    # Keep track of the newest file's modification time for this folder
    newest_file_time = None

    for item in folder_path.iterdir():
        # Check if the item is a file
        if item.is_file():
            file_time = item.stat().st_mtime  # Get modification time of the file

            # Update the newest_file_time if it's the first file or if the current file is newer
            if newest_file_time is None or file_time > newest_file_time:
                newest_file_time = file_time

        # If the item is a subfolder, recursively update its times and find its newest file time
        elif item.is_dir():
            subfolder_newest_time = update_folder_times(item)

            # Update the newest_file_time if a subfolder's newest file is newer
            if newest_file_time is None or (subfolder_newest_time is not None and subfolder_newest_time > newest_file_time):
                newest_file_time = subfolder_newest_time

    # Update the folder's modification and creation times with the newest_file_time
    if newest_file_time is not None:
        # Convert to an integer (necessary on some systems)
        newest_file_time = int(newest_file_time)
        os.utime(path=folder_path, times=(newest_file_time, newest_file_time))

    return newest_file_time  # Return the newest_file_time to update the parent folder's time