confini

Parse and merge multiple ini files in python3
git clone git://git.defalsify.org/python-confini.git
Log | Files | Refs | README | LICENSE

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))