Chromium Code Reviews| Index: reviewbot/util.py | 
| =================================================================== | 
| --- reviewbot/util.py (revision 0) | 
| +++ reviewbot/util.py (revision 0) | 
| @@ -0,0 +1,52 @@ | 
| +# Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
| +# Use of this source code is governed by a BSD-style license that can be | 
| +# found in the LICENSE file. | 
| + | 
| +import email.utils | 
| + | 
| + | 
| +def lazy_property(func): | 
| + """A decorator for lazy properties.""" | 
| + name = '__lazy_' + func.__name__ | 
| + | 
| + def get_property(self, *args, **kwargs): | 
| + if not hasattr(self, name): | 
| + setattr(self, name, func(self, *args, **kwargs)) | 
| + return getattr(self, name) | 
| + | 
| + return property(get_property) | 
| + | 
| + | 
| +class LazyDict(object): | 
| + def __init__(self, lookup): | 
| + self.items = {} | 
| + self.lookup = lookup | 
| 
 
agable
2013/08/02 16:35:35
nit: self.lookup = lookup_fn
 
Mattias Nissler (ping if slow)
2013/08/05 09:08:51
Done.
 
 | 
| + | 
| + def __getitem__(self, name): | 
| + if name not in self.items.keys(): | 
| + self.items[name] = self.lookup(name) | 
| + return self.items[name] | 
| + | 
| + | 
| +class ObjectDict(object): | 
| + def __init__(self, data): | 
| + self.data = data | 
| + | 
| + def __getitem__(self, name): | 
| + val = self.data[name] | 
| + if type(val) == dict: | 
| + return ObjectDict(val) | 
| + return val | 
| + | 
| + def __getattr__(self, name): | 
| + try: | 
| + return self[name] | 
| + except KeyError as e: | 
| + raise AttributeError(e) | 
| + | 
| + def __iter__(self): | 
| + return self.data.iterkeys() | 
| + | 
| + | 
| +def get_emails(string): | 
| + return [entry[1] for entry in email.utils.getaddresses([string])] | 
| Property changes on: reviewbot/util.py | 
| ___________________________________________________________________ | 
| Added: svn:eol-style | 
| + LF |