-
Notifications
You must be signed in to change notification settings - Fork 16
/
util.py
38 lines (30 loc) · 1002 Bytes
/
util.py
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
import datetime
import fcntl
import json
import click
class OpenAndLock(object):
def __init__(self, filepath, open_mode):
self.filepath_ = filepath
self.file_ = None
self.open_mode_ = open_mode
self.lock_mode_ = fcntl.LOCK_EX
if self.open_mode_ == 'r':
self.lock_mode_ = fcntl.LOCK_SH
def __enter__(self):
self.file_ = open(self.filepath_, self.open_mode_)
fcntl.lockf(self.file_.fileno(), self.lock_mode_)
return self.file_
def __exit__(self, *args):
self.file_.flush()
fcntl.lockf(self.file_.fileno(), fcntl.LOCK_UN)
self.file_.close()
# Echo log message with timestamp.
def tlog(message, prefix=''):
click.echo("%s%s: %s." %
(prefix,
datetime.datetime.strftime(datetime.datetime.now(), "%H:%M"),
message))
def json_dumps(obj):
return json.dumps(obj, sort_keys=True, indent=2)
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)