Changeset 757578d in rtems-tools


Ignore:
Timestamp:
Jun 10, 2019, 7:08:34 AM (7 days ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
98f2f02
Parents:
2b27eec
git-author:
Chris Johns <chrisj@…> (06/10/19 07:08:34)
git-committer:
Chris Johns <chrisj@…> (06/11/19 23:48:28)
Message:

rtemstoolkit/configuration: Fix interpolation support.

  • It was disabled always. Now optional by the constructor.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtemstoolkit/configuration.py

    r2b27eec r757578d  
    5252
    5353    def __init__(self, raw = True):
    54         self.raw = True
     54        self.raw = raw
    5555        if has_strict:
    5656            self.config = configparser.ConfigParser(strict = False)
     
    5858            self.config = configparser.ConfigParser()
    5959        self.ini = None
    60         self.macro_filter = re.compile('\$\{.+\}')
     60        self.macro_filter = re.compile('\$\{[^\}]+\}')
    6161
    6262    def __str__(self):
     
    7474            s += [' [%s]' % (section)]
    7575            for option in self.config.options(section):
    76                 s += ['  %s = %s' % (option,
    77                                      self.config.get(section,
    78                                                      option,
    79                                                      raw = self.raw))]
     76                rec = self.config.get(section,
     77                                      option,
     78                                      raw = True).replace(os.linesep, ' ')
     79                s += ['  %s = %s' % (option, rec)]
    8080        return os.linesep.join(s)
     81
     82    def _interpolate(self, section, rec):
     83        #
     84        # On Python 2.7 there is no extended interpolation so add support here.
     85        # On Python 3 we disable the built in support and also the code here.
     86        #
     87        if not self.raw:
     88            not_found = []
     89            while True:
     90                macros = [m for m in self.macro_filter.findall(rec) if m not in not_found]
     91                if len(macros) == 0:
     92                    break
     93                for m in macros:
     94                    if m in not_found:
     95                        continue
     96                    if ':' in m:
     97                        section_value = m[2:-1].split(':')
     98                        if len(section_value) != 2:
     99                            err = 'config: interpolation is ${section:item}: %s' % (m)
     100                            raise error.general(err)
     101                    else:
     102                        section_value = [section, m[2:-1]]
     103                    try:
     104                        ref = self.config.get(section_value[0],
     105                                              section_value[1],
     106                                              raw = True).replace(os.linesep, ' ')
     107                        rec = rec.replace(m, ref)
     108                    except:
     109                        not_found += [m]
     110                        pass
     111        return rec
    81112
    82113    def get_sections(self):
     
    87118            rec = self.config.get(section,
    88119                                  label,
    89                                   raw = self.raw).replace(os.linesep, ' ')
     120                                  raw = True).replace(os.linesep, ' ')
    90121        except:
    91122            if err:
    92123                raise error.general('config: no "%s" found in "%s"' % (label, section))
    93124            return None
    94         #
    95         # On Python 2.7 there is no extended interpolation so add support here.
    96         # On Python 3 this should happen automatically and so the findall
    97         # should find nothing.
    98         #
    99         for m in self.macro_filter.findall(rec):
    100             if ':' not in m:
    101                 err = 'config: interpolation is ${section:value}: %s' % (m)
    102                 raise error.general(err)
    103             section_value = m[2:-1].split(':')
    104             if len(section_value) != 2:
    105                 err = 'config: interpolation is ${section:value}: %s' % (m)
    106                 raise error.general(err)
    107             try:
    108                 ref = self.config.get(section_value[0],
    109                                       section_value[1],
    110                                       raw = self.raw).replace(os.linesep, ' ')
    111                 rec = rec.replace(m, ref)
    112             except:
    113                 pass
    114         return rec
     125        return self._interpolate(section, rec)
    115126
    116127    def get_items(self, section, err = True, flatten = True):
    117128        try:
    118129            items = []
    119             for name, key in self.config.items(section, raw = self.raw):
     130            for name, value in self.config.items(section, raw = True):
    120131                if flatten:
    121                     items += [(name, key.replace(os.linesep, ' '))]
    122                 else:
    123                     items += [(name, key)]
     132                    value = value.replace(os.linesep, ' ')
     133                value = self._interpolate(section, value)
     134                items += [(name, value)]
    124135            return items
    125136        except:
     
    136147    def get_item_names(self, section, err = True):
    137148        try:
    138             return [item[0] for item in self.config.items(section, raw = self.raw)]
     149            return [item[0] for item in self.config.items(section, raw = True)]
    139150        except:
    140151            if err:
Note: See TracChangeset for help on using the changeset viewer.