~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lazy_import.py

  • Committer: John Arbash Meinel
  • Date: 2006-09-12 18:42:49 UTC
  • mto: This revision was merged to the branch mainline in revision 2004.
  • Revision ID: john@arbash-meinel.com-20060912184249-83efc58bcc327550
Add more structured error handling

Show diffs side-by-side

added added

removed removed

Lines of Context:
175
175
class ImportProcessor(object):
176
176
    """Convert text that users input into lazy import requests"""
177
177
 
 
178
    # TODO: jam 20060912 This class is probably not strict enough about
 
179
    #       what type of text it allows. For example, you can do:
 
180
    #       import (foo, bar), which is not allowed by python.
 
181
    #       For now, it should be supporting a superset of python import
 
182
    #       syntax which is all we really care about.
 
183
 
178
184
    __slots__ = ['imports', '_lazy_import_class']
179
185
 
180
186
    def __init__(self, lazy_import_class=None):
202
208
    def _build_map(self, text):
203
209
        """Take a string describing imports, and build up the internal map"""
204
210
        for line in self._canonicalize_import_text(text):
205
 
            if line.startswith('import'):
 
211
            if line.startswith('import '):
206
212
                self._convert_import_str(line)
207
 
            else:
208
 
                assert line.startswith('from')
 
213
            elif line.startswith('from '):
209
214
                self._convert_from_str(line)
 
215
            else:
 
216
                raise errors.InvalidImportLine(line,
 
217
                    "doesn't start with 'import ' or 'from '")
210
218
 
211
219
    def _convert_import_str(self, import_str):
212
220
        """This converts a import string into an import map.
229
237
                # named 'bing' which points to 'foo.bar.baz'
230
238
                name = as_hunks[1].strip()
231
239
                module_path = as_hunks[0].strip().split('.')
232
 
                assert name not in self.imports
 
240
                if name in self.imports:
 
241
                    raise errors.ImportNameCollision(name)
233
242
                # No children available in 'import foo as bar'
234
243
                self.imports[name] = (module_path, None, {})
235
244
            else:
279
288
                module = as_hunks[0].strip()
280
289
            else:
281
290
                name = module = path
282
 
            assert name not in self.imports
 
291
            if name in self.imports:
 
292
                raise errors.ImportNameCollision(name)
283
293
            self.imports[name] = (from_module_path, module, {})
284
294
 
285
295
    def _canonicalize_import_text(self, text):
311
321
                    cur = line.replace('(', '')
312
322
                else:
313
323
                    out.append(line.replace('(', '').replace(')', ''))
314
 
        assert cur is None
 
324
        if cur is not None:
 
325
            raise errors.InvalidImportLine(cur, 'Unmatched parenthesis')
315
326
        return out