Issues (10)

pystratum_common/Util.py (1 issue)

1
import os
2
3
from pystratum_backend.StratumStyle import StratumStyle
4
5
6 View Code Duplication
class Util:
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
7
    """
8
    An utility class with miscellaneous functions that don't belong somewhere else.
9
    """
10
11
    # ------------------------------------------------------------------------------------------------------------------
12
    @staticmethod
13
    def write_two_phases(filename: str, data: str, io: StratumStyle) -> None:
14
        """
15
        Writes a file in two phase to the filesystem.
16
17
        First write the data to a temporary file (in the same directory) and than renames the temporary file. If the
18
        file already exists and its content is equal to the data that must be written no action is taken. This has the
19
        following advantages:
20
        * In case of some write error (e.g. disk full) the original file is kep in tact and no file with partially data
21
        is written.
22
        * Renaming a file is atomic. So, running processes will never read a partially written data.
23
24
        :param str filename: The name of the file were the data must be stored.
25
        :param str data: The data that must be written.
26
        :param StratumStyle io: The output decorator.
27
        """
28
        write_flag = True
29
        if os.path.exists(filename):
30
            with open(filename, 'r') as file:
31
                old_data = file.read()
32
                if data == old_data:
33
                    write_flag = False
34
35
        if write_flag:
36
            tmp_filename = filename + '.tmp'
37
            with open(tmp_filename, 'w+') as file:
38
                file.write(data)
39
            os.replace(tmp_filename, filename)
40
            io.text('Wrote: <fso>{0}</fso>'.format(filename))
41
        else:
42
            io.text('File <fso>{0}</fso> is up to date'.format(filename))
43
44
# ----------------------------------------------------------------------------------------------------------------------
45