Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: chainedconfigparser.py

Issue 29325410: Issue 2968 - Implement multi inheritance for metadata files (Closed)
Patch Set: Created Sept. 1, 2015, 11:17 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # coding: utf-8 1 # coding: utf-8
2 2
3 # This Source Code Form is subject to the terms of the Mozilla Public 3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this 4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 6
7 import os 7 import os
8 import io 8 import io
9 import ConfigParser 9 import ConfigParser
10 from StringIO import StringIO 10 from StringIO import StringIO
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 def _make_parser(self, filename): 59 def _make_parser(self, filename):
60 parser = ConfigParser.SafeConfigParser() 60 parser = ConfigParser.SafeConfigParser()
61 parser.optionxform = lambda option: option 61 parser.optionxform = lambda option: option
62 62
63 with io.open(filename, encoding='utf-8') as file: 63 with io.open(filename, encoding='utf-8') as file:
64 parser.readfp(file, filename) 64 parser.readfp(file, filename)
65 65
66 return parser 66 return parser
67 67
68 def _get_parser_chain(self, parser, filename): 68 def _get_parser_chain(self, parser, filename):
69 parsers = [] 69 parsers = [(parser, filename)]
70 70
71 while True: 71 try:
72 parsers.insert(0, (parser, filename)) 72 inherit = parser.get('default', 'inherit')
73 except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
74 return parsers
73 75
74 try: 76 dirname = os.path.dirname(filename)
75 inherit = parser.get('default', 'inherit') 77 for parent in inherit.split():
76 except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): 78 parent_filename = os.path.join(dirname, *parent.split('/'))
77 return parsers 79 parent_parser = self._make_parser(parent_filename)
80 parsers[:0] = self._get_parser_chain(parent_parser, parent_filename)
78 81
79 filename = os.path.join(os.path.dirname(filename), *inherit.split('/')) 82 return parsers
80 parser = self._make_parser(filename)
81 83
82 def _apply_diff(self, section, option, value): 84 def _apply_diff(self, section, option, value):
83 is_addition = option.endswith('+') 85 is_addition = option.endswith('+')
84 is_diff = is_addition or option.endswith('-') 86 is_diff = is_addition or option.endswith('-')
85 87
86 if is_diff: 88 if is_diff:
87 option = option[:-1].rstrip() 89 option = option[:-1].rstrip()
88 try: 90 try:
89 orig_value = self.get(section, option) 91 orig_value = self.get(section, option)
90 except ConfigParser.NoOptionError: 92 except ConfigParser.NoOptionError:
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 raise NotImplementedError 163 raise NotImplementedError
162 164
163 def add_section(self, section): 165 def add_section(self, section):
164 raise NotImplementedError 166 raise NotImplementedError
165 167
166 def remove_option(self, section, option): 168 def remove_option(self, section, option):
167 raise NotImplementedError 169 raise NotImplementedError
168 170
169 def remove_section(self, section): 171 def remove_section(self, section):
170 raise NotImplementedError 172 raise NotImplementedError
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld