1
|
1 # -*- coding: utf-8 -*-
|
|
2
|
|
3 """
|
|
4 write a file atomically
|
|
5 """
|
|
6
|
|
7 # imports
|
|
8 import os
|
|
9 import shutil
|
|
10 import tempfile
|
|
11
|
|
12 # module globals
|
|
13 __all__ = ['ensure_dir', 'write']
|
|
14
|
|
15 def ensure_dir(directory):
|
|
16 """ensure a directory exists"""
|
|
17 if os.path.exists(directory):
|
|
18 if not os.path.isdir(directory):
|
|
19 raise OSError("Not a directory: '{}'".format(directory))
|
|
20 return directory
|
|
21 os.makedirs(directory)
|
|
22 return directory
|
|
23
|
|
24
|
|
25 def write(contents, path):
|
|
26 """atomically write a file taking advantage of move"""
|
|
27
|
|
28 path = os.path.abspath(path)
|
|
29 fd, tmp_path = tempfile.mkstemp()
|
|
30 os.write(fd, contents)
|
|
31 os.close(fd)
|
|
32 ensure_dir(os.path.dirname(path))
|
|
33 shutil.move(tmp_path, path)
|