Edgewall Software

Ticket #3037: fixed-config.diff

File fixed-config.diff, 4.4 KB (added by athomas, 6 years ago)

Configuration module fixes

  • trac/config.py

     
    6565    """ 
    6666    def __init__(self, filename): 
    6767        self._sections = {} 
    68         self._defaults = {} 
    6968        self.filename = filename 
    7069        self.parser = ConfigParser() 
    7170        self._lastmtime = 0 
     
    149148 
    150149    def sections(self): 
    151150        """Return a list of section names.""" 
    152         return self.parser.sections() 
     151        sections = self.site_parser.sections() 
     152        site_sections = [s.lower() for s in sections] 
     153        sections.extend([s for s in self.parser.sections()  
     154                         if s not in site_sections]) 
     155        return sections 
    153156 
    154157    def save(self): 
    155158        """Write the configuration options to the primary file.""" 
     
    162165            fileobj.close() 
    163166 
    164167    def parse_if_needed(self): 
    165         # Merge global configuration option into _defaults 
     168        # Load global configuration 
    166169        if os.path.isfile(self.site_filename): 
    167170            modtime = os.path.getmtime(self.site_filename) 
    168171            if modtime > self._lastsitemtime: 
    169172                self.site_parser.read(self.site_filename) 
    170                 for section in self.site_parser.sections(): 
    171                     for option in self.site_parser.options(section): 
    172                         value = self.site_parser.get(section, option) 
    173                         self._defaults[(section, option)] = value 
    174173                self._lastsitemtime = modtime 
    175174 
    176175        if not self.filename or not os.path.isfile(self.filename): 
     
    193192        self.name = name 
    194193 
    195194    def __contains__(self, name): 
    196         return self.config.parser.has_option(self.name, name) 
     195        return self.config.parser.has_option(self.name, name) or \ 
     196               self.config.site_parser.has_option(self.name, name) 
     197             
    197198 
    198199    def __iter__(self): 
    199200        options = [] 
    200201        if self.config.parser.has_section(self.name): 
    201202            for option in self.config.parser.options(self.name): 
    202                 options.append(option) 
     203                options.append(option.lower()) 
    203204                yield option 
    204         for section, option in self.config._defaults: 
    205             if section == self.name and option not in options: 
    206                 yield option 
     205        if self.config.site_parser.has_section(self.name): 
     206            for option in self.config.site_parser.options(self.name): 
     207                if option.lower() not in options: 
     208                    yield option 
    207209 
    208210    def get(self, name, default=None): 
    209211        """Return the value of the specified option.""" 
    210         if not name in self: 
    211             if default is None: 
    212                 return self.config._defaults.get((self.name, name), '') 
    213             return default 
    214         return to_unicode(self.config.parser.get(self.name, name)) 
     212        if self.config.parser.has_option(self.name, name): 
     213            return to_unicode(self.config.parser.get(self.name, name)) 
     214        elif self.config.site_parser.has_option(self.name, name): 
     215            return to_unicode(self.config.site_parser.get(self.name, name)) 
     216        else: 
     217            return default or '' 
    215218 
    216219    def getbool(self, name, default=None): 
    217220        """Return the value of the specified option as boolean. 
     
    258261 
    259262    def setdefault(self, name, value): 
    260263        """Set the default value of a specific option.""" 
    261         if (self.name, name) not in self.config._defaults: 
    262             self.config._defaults[(self.name, name)] = value 
     264        if not self.config.site_parser.has_option(self.name, name): 
     265            if not self.config.site_parser.has_section(self.name): 
     266                self.config.site_parser.add_section(self.name) 
     267            self.config.site_parser.set(self.name, name, value.encode('utf-8')) 
    263268 
    264269    def set(self, name, value): 
    265270        """Change a configuration value. 
  • trac/tests/config.py

     
    116116    def test_sections(self): 
    117117        self._write(['[a]', 'option = x', '[b]', 'option = y']) 
    118118        config = Configuration(self.filename) 
     119        from ConfigParser import ConfigParser 
     120        config.site_parser = ConfigParser() 
    119121        self.assertEquals(['a', 'b'], config.sections()) 
    120122 
    121123    def test_options(self):