Source code for qharv.field.sugar
# Author: Yubo "Paul" Yang
# Email: yubo.paul.yang@gmail.com
# Python candy i.e. decorators
import os
import subprocess as sp
[docs]def check_dir_before(mkdir):
def wrapper(dirname):
if not os.path.isdir(dirname):
mkdir(dirname)
return wrapper
[docs]@check_dir_before
def mkdir(x):
sp.check_call(['mkdir', '-p', x])
[docs]def skip_exist_file(write_file):
def wrapper(fout, *args, **kwargs):
if not os.path.isfile(fout):
return write_file(fout, *args, **kwargs)
else:
print('%s exists' % fout)
return wrapper
[docs]def cache(write_file):
def wrapper(fout, *args, **kwargs):
cache_dir = os.path.dirname(fout)
if cache_dir != '':
mkdir(cache_dir)
return skip_exist_file(write_file)(fout, *args, **kwargs)
return wrapper
[docs]def get_progress_bar(maxval):
from progressbar import ProgressBar
bar = ProgressBar(maxval=maxval)
import sys
if sys.version_info >= (3, 0):
from progressbar import Bar, ETA
widgets = [Bar('>'), ETA()]
bar.widgets = widgets
bar.start()
return bar
[docs]def show_h5progress(collect_h5file):
def wrapper(h5file, flist, *args, **kwargs):
bar = get_progress_bar(len(flist))
ifile = 0
for ifile, floc in enumerate(flist):
collect_h5file(h5file, floc, *args, **kwargs)
bar.update(ifile)
return wrapper
[docs]def concat_return(show_progress=True, fault_tolerant=False):
"""Show progress of concat reduce function"""
def _concat_return(collect):
"""Concatenate the return value of a collect function on a file to a list
Args:
collect (callable): a function that parses a file into an object
Return:
list: a list of return values each from applying collect to a file
"""
def wrapper(flist, *args, **kwargs):
if show_progress:
bar = get_progress_bar(len(flist))
ifile = 0
data = []
for ifile, floc in enumerate(flist):
try:
result = collect(floc, *args, **kwargs)
data.append(result)
except Exception as err:
if fault_tolerant:
msg = str(err) + ' at:\n' + floc
print(msg)
else:
raise err
if show_progress:
bar.update(ifile)
return data
return wrapper
return _concat_return