env.py (1633B)
1 # standard imports 2 import configparser 3 import io 4 import logging 5 import sys 6 7 logg = logging.getLogger(__name__) 8 9 10 class ConfigEnvParser: 11 12 def __init__(self): 13 self.parser = configparser.ConfigParser() 14 15 16 def from_file(self, fp): 17 f = open(fp, 'r') 18 r = self.from_handle(f) 19 f.close() 20 return r 21 22 23 def from_string(self, s): 24 fh = io.StringIO(s) 25 return self.from_handle(fh) 26 27 28 def from_handle(self, fh): 29 while True: 30 l = fh.readline() 31 if len(l) == 0: 32 break 33 (k, v) = l.split('=') 34 try: 35 (ks, ko) = k.split('_', maxsplit=1) 36 except ValueError: 37 ks = k 38 ko = '_' 39 ks = ks.lower() 40 ko = ko.lower() 41 v = v.rstrip() 42 if not self.parser.has_section(ks): 43 self.parser.add_section(ks) 44 self.parser.set(ks, ko, v) 45 return self.parser 46 47 48 def export_env(config, prefix=None, empty_all=False, skip_empty=False, doc=False, w=sys.stdout): 49 for k in config.all(): 50 if k[0] == '_': 51 continue 52 v = config.get(k) 53 if empty_all or v == None: 54 v = '' 55 if v == '' and skip_empty: 56 logg.debug('skipping empty directive {}'.format(k)) 57 continue 58 if doc: 59 try: 60 doc_s = config.doc.get(k) 61 w.write('# ' + doc_s + "\n") 62 except KeyError: 63 pass 64 if prefix != None: 65 w.write(prefix + ' ') 66 w.write('{}={}\n'.format(k, v))