doc.py (1753B)
1 # standard imports 2 import os 3 import configparser 4 import logging 5 6 # local imports 7 from confini.common import to_constant_name 8 9 logg = logging.getLogger(__name__) 10 11 12 class ConfigDoc: 13 14 def __init__(self, src=None): 15 fp = None 16 if src != None: 17 fp = os.path.join(src, '.confini') 18 logg.debug('attempting doc parser with src {}'.format(fp)) 19 20 self.src = fp 21 self.docs = {} 22 self.docs_flat = {} 23 24 if self.src != None: 25 self.process(self.src) 26 27 28 def process(self, src): 29 try: 30 self.process_as_ini(src) 31 except Exception: 32 self.process_as_env(src) 33 34 35 def process_as_ini(self, src): 36 p = configparser.ConfigParser() 37 p.read_file(src) 38 return self.process_parser(p) 39 40 41 def process_as_env(self, src): 42 from confini.env import ConfigEnvParser 43 c = ConfigEnvParser() 44 p = c.from_file(src) 45 return self.process_parser(p) 46 47 48 def process_parser(self, p): 49 for ks in p.sections(): 50 if self.docs.get(ks) == None: 51 self.docs[ks] = {} 52 for ko in p.options(ks): 53 v = p.get(ks, ko) 54 self.docs[ks][ko] = v 55 c = to_constant_name(ko, ks) 56 self.docs_flat[c] = v 57 logg.debug('docs {} -> {} = {}'.format(ks, ko, v)) 58 59 60 def get(self, k, o=None): 61 if o == None: 62 return self.docs_flat[k] 63 else: 64 return self.docs[k][o] 65 66 67 def all(self): 68 return list(self.docs_flat.keys()) 69 70 71 @staticmethod 72 def from_config(config): 73 if config.doc != None: 74 return config.doc 75 return ConfigDoc(config.dirs[0])