On 19 November 2014 at 14:14, pi-cheng.chen <pi-cheng.c...@linaro.org> wrote: > This scripts strips all comments in the input JSON file, modifies the > parameters according to commnad line arguments, and write the content to a new > JSON file. > > Signed-off-by: Pi-Cheng Chen <pi-cheng.c...@linaro.org> > --- > doc/tune_json.py | 138 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 138 insertions(+) > create mode 100755 doc/tune_json.py > > diff --git a/doc/tune_json.py b/doc/tune_json.py > new file mode 100755 > index 0000000..36746ff > --- /dev/null > +++ b/doc/tune_json.py > @@ -0,0 +1,138 @@ > +#!/usr/bin/env python > + > +import collections > +import argparse > +import shutil > +import os > +import sys > +import json > +import re > + > + > +def find_dict_by_key(doc, key): > + if key in doc and type(doc[key]) is collections.OrderedDict: > + return doc[key] > + > + for k in doc: > + if type(doc[k]) is collections.OrderedDict: > + return find_dict_by_key(doc[k], key) > + > + > +def dict_find_and_replace_value(dic, key, val): > + for k in dic: > + if type(dic[k]) is collections.OrderedDict: > + dict_find_and_replace_value(dic[k], key, val) > + if k == key: > + dic[k] = val > + > + > +def dict_of_loading(dic): > + if not 'run' in dic: > + return False, None > + > + for k in dic: > + if 'timer' in k and 'period' in dic[k]: > + return True, k > + else: > + return False, None > + > + > +def calculate_and_update_loading(dic, loading): > + of_loading, timer_id = dict_of_loading(dic) > + > + if of_loading: > + period = dic[timer_id]['period'] > + run = period * loading / 100 > + dic['run'] = run > + > + for k in dic: > + if type(dic[k]) is collections.OrderedDict: > + calculate_and_update_loading(dic[k], loading) > + > + > +# strip comments in json file and load the file as a dict > +def load_json_file(filename): > + try: > + f = open(filename, 'r') > + except: > + print 'ERROR: Unable to open %s' %filename > + sys.exit(2) > + > + comment_re = re.compile( > + '(^)?[^\S\n]*/(?:\*(.*?)\*/[^\S\n]*|/[^\n]*)($)?', > + re.DOTALL | re.MULTILINE) > + > + content = ''.join(f.readlines()) > + > + match = comment_re.search(content) > + while match: > + content = content[:match.start()] + content[match.end():] > + match = comment_re.search(content) > + > + return > json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode(content) > + > + > +def dump_json_file(doc, filename): > + try: > + fo = open(filename, 'w+') > + except: > + print 'ERROR: Unable to open %s' %filename > + sys.exit(2) > + > + json.dump(doc, fo, indent=4, sort_keys=False) > + fo.close() > + > + > +if __name__ == '__main__': > + tmp = 'tmp.json'
your tmp file should be a bit more unique than tmp.json. I can imagine that the user of tune_json.py already has a tmp.json in the dir which will be overwritten by the script. You could add something like the current time stamp in the temporary file name to reduce the probability to overwrite a user's file Otherwise it looks good for me > + > + parser = argparse.ArgumentParser() > + > + parser.add_argument('-f', '--file', dest='infile', default='', > help='input json filename') > + parser.add_argument('-o', '--out', dest='outfile', > default='workload.json', help='output json filename'); > + parser.add_argument('--instance', default=0, type=int, help='number of > thread instance') > + parser.add_argument('--period', default=0, type=int, help='period of > each thread/phase (ms)') > + parser.add_argument('--run', default=0, type=int, help='run time of each > thread/phase (ms)') > + parser.add_argument('--sleep', default=0, type=int, help='sleep time of > each thread/phase (ms)') > + parser.add_argument('--loop', default=0,type=int, help='loop count of > each thread/phase (-1 as infinite loop)') > + parser.add_argument('--loading', default=0, type=int, help='loading of > each thread (%%)') > + parser.add_argument('--key', type=str, help='the key id of thread/phase > in which the parameters will be changed') > + > + args = parser.parse_args() > + > + if not os.path.isfile(args.infile): > + print 'ERROR: input file %s does not exist\n' %args.infile > + parser.print_help() > + sys.exit(2) > + > + shutil.copyfile(args.infile, tmp) > + > + doc = target = load_json_file(tmp) > + > + if args.key: > + target = find_dict_by_key(doc, args.key) > + if not target: > + print 'ERROR: key id %s is not found' %args.key > + sys.exit(2) > + > + if args.instance > 0: > + dict_find_and_replace_value(target, 'instance', args.instance) > + > + if args.period > 0: > + dict_find_and_replace_value(target, 'period', args.period * 1000) > + > + if args.run > 0: > + dict_find_and_replace_value(target, 'run', args.run * 1000) > + > + if args.sleep > 0: > + dict_find_and_replace_value(target, 'sleep', args.sleep * 1000) > + > + if args.loop > 0 or args.loop == -1: > + dict_find_and_replace_value(target, 'loop', args.loop) > + > + if args.loading > 0: > + calculate_and_update_loading(target, args.loading); > + > + dump_json_file(doc, tmp) > + > + os.rename(tmp, args.outfile) > -- > 1.9.1 > _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev