X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=rainbowstream%2Fconfig.py;h=2e79c9aea768e210c76c3fedcae1b7b5246b3ae1;hb=fb835f1e803418a4cdd9a4fe76c518eef28d64cf;hp=3f61553d393eea03d72f757fdffaa88e09ca17bf;hpb=632c6fa515fe36cf88ef2bf39378464bd24701d8;p=rainbowstream.git diff --git a/rainbowstream/config.py b/rainbowstream/config.py index 3f61553..2e79c9a 100644 --- a/rainbowstream/config.py +++ b/rainbowstream/config.py @@ -2,6 +2,7 @@ import json import re import os import os.path +from collections import OrderedDict # Regular expression for comments comment_re = re.compile( @@ -9,29 +10,137 @@ comment_re = re.compile( re.DOTALL | re.MULTILINE ) +def fixup(adict, k, v): + """ + Fix up a key in json format + """ + for key in adict.keys(): + if key == k: + adict[key] = v + elif type(adict[key]) is dict: + fixup(adict[key], k, v) + + def load_config(filepath): """ Load config from filepath """ - try: - with open(filepath) as f: - content = ''.join(f.readlines()) + with open(filepath) as f: + content = ''.join(f.readlines()) + match = comment_re.search(content) + while match: + content = content[:match.start()] + content[match.end():] match = comment_re.search(content) - while match: - content = content[:match.start()] + content[match.end():] - match = comment_re.search(content) - return json.loads(content) + return json.loads(content, object_pairs_hook=OrderedDict) + + +def get_all_config(): + """ + Get all config + """ + path = os.environ.get( + 'HOME', + os.environ.get( + 'USERPROFILE', + '')) + os.sep + '.rainbow_config.json' + data = load_config(path) + # Hard to set from prompt + data.pop('ONLY_LIST',None) + data.pop('IGNORE_LIST',None) + return data + + +def get_default_config(key): + """ + Get default value of a config key + """ + path = os.path.dirname( + __file__) + '/colorset/config' + data = load_config(path) + return data[key] + + +def get_config(key): + """ + Get current value of a config key + """ + return c[key] + + +def set_config(key,value): + """ + Set a config key with specific value + """ + # Modify value + if value.isdigit(): + value = int(value) + elif value.lower() == 'True': + value = True + elif value.lower() == 'False': + value = False + # Fix up + path = os.environ.get( + 'HOME', + os.environ.get( + 'USERPROFILE', + '')) + os.sep + '.rainbow_config.json' + data = load_config(path) + fixup(data, key, value) + # Save + with open(path, 'w') as out: + json.dump(data, out, indent = 4) + os.system('chmod 777 ' + path) + + +def reload_config(): + """ + Reload config + """ + rainbow_config = os.environ.get( + 'HOME', + os.environ.get( + 'USERPROFILE', + '')) + os.sep + '.rainbow_config.json' + try: + data = load_config(rainbow_config) + for d in data: + c[d] = data[d] except: - pass + print('It seems that ~/.rainbow_config.json has wrong format :(') + -# Load default colorset +# Config dictionary c = {} -default_config = 'rainbowstream/colorset/default.json' -data = load_config(default_config) -for d in data: - c[d] = data[d] -# Load user's colorset -rainbow_config = os.environ.get('HOME', os.environ.get('USERPROFILE','')) + os.sep + '.rainbow_config.json' -data = load_config(rainbow_config) -for d in data: - c[d] = data[d] + +# Load the initial config +config = os.path.dirname( + __file__) + '/colorset/config' +try: + data = load_config(config) + for d in data: + c[d] = data[d] +except: + pass + +# Load user's config +rainbow_config = os.environ.get( + 'HOME', + os.environ.get( + 'USERPROFILE', + '')) + os.sep + '.rainbow_config.json' +try: + data = load_config(rainbow_config) + for d in data: + c[d] = data[d] +except: + print('It seems that ~/.rainbow_config.json has wrong format :(') + +# Load default theme +theme_file = os.path.dirname( + __file__) + '/colorset/' + c['THEME'] + '.json' +try: + data = load_config(theme_file) + for d in data: + c[d] = data[d] +except: + pass