)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This appears to have been a marriage of convenience. There is no real"},{"line_number":10,"context_line":"reason to combine these two concepts."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"bp object-dependency-lifecycle"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I2dead4f66675f73a9ebc1551f257218a085211f0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ba3cc151_59b6ee3e","line":12,"updated":"2015-07-08 23:49:10.000000000","message":"this bp is not approved.","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"}],"keystone/notifications.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e4f10dee5c5ab759b56660bf2adc941592ded6cc","unresolved":false,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"def listener(cls):"},{"line_number":296,"context_line":"    \"\"\"TODO: add a nice, tidy comment here...\"\"\""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def init_wrapper(init):"},{"line_number":299,"context_line":"        def __new_init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"bab921fb_3dafc595","line":296,"updated":"2015-04-24 16:20:30.000000000","message":"^","commit_id":"7e1989eda6211f66843806d9f8edecb7ae00f34c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ff1075231f20423b1ff9f8c3618fc0865bdd0c23","unresolved":false,"context_lines":[{"line_number":324,"context_line":"    \"\"\""},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def init_wrapper(init):"},{"line_number":327,"context_line":"        def __new_init__(self, *args, **kwargs):"},{"line_number":328,"context_line":"            init(self, *args, **kwargs)"},{"line_number":329,"context_line":"            _register_event_callbacks(self)"},{"line_number":330,"context_line":"        return __new_init__"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_f44d7d9a","line":327,"updated":"2015-05-22 00:38:49.000000000","message":"suggest use @functools.wraps","commit_id":"701eba8538a1dee2e978dbee689d2efa1c74b931"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ff1075231f20423b1ff9f8c3618fc0865bdd0c23","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        return __new_init__"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def _register_event_callbacks(self):"},{"line_number":333,"context_line":"        # NOTE(morganfainberg): A provider who has an implicit"},{"line_number":334,"context_line":"        # dependency on other providers may utilize the event callback"},{"line_number":335,"context_line":"        # mechanism to react to any changes in those providers. This is"},{"line_number":336,"context_line":"        # performed at the .provider() mechanism so that we can ensure"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_b43a65e5","line":333,"updated":"2015-05-22 00:38:49.000000000","message":"isn\u0027t this what\u0027s being changed? the class doesn\u0027t have to be a provider.","commit_id":"701eba8538a1dee2e978dbee689d2efa1c74b931"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b17cbd9bf95cf8212bc0e81a85e8a010dc757986","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        # NOTE(morganfainberg): A provider who has an implicit"},{"line_number":334,"context_line":"        # dependency on other providers may utilize the event callback"},{"line_number":335,"context_line":"        # mechanism to react to any changes in those providers. This is"},{"line_number":336,"context_line":"        # performed at the .provider() mechanism so that we can ensure"},{"line_number":337,"context_line":"        # that the callback is only ever called once and guaranteed"},{"line_number":338,"context_line":"        # to be on the properly configured and instantiated backend."},{"line_number":339,"context_line":"        if not hasattr(self, \u0027event_callbacks\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_3b6cc407","line":336,"updated":"2015-05-26 22:04:47.000000000","message":"isn\u0027t this now the .listener() mechanism?","commit_id":"701eba8538a1dee2e978dbee689d2efa1c74b931"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ff1075231f20423b1ff9f8c3618fc0865bdd0c23","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        # performed at the .provider() mechanism so that we can ensure"},{"line_number":337,"context_line":"        # that the callback is only ever called once and guaranteed"},{"line_number":338,"context_line":"        # to be on the properly configured and instantiated backend."},{"line_number":339,"context_line":"        if not hasattr(self, \u0027event_callbacks\u0027):"},{"line_number":340,"context_line":"            return"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        if not isinstance(self.event_callbacks, dict):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_943d29df","line":339,"updated":"2015-05-22 00:38:49.000000000","message":"seems like this should be an error now, just like it\u0027s an error if event_callbacks isn\u0027t a dict.","commit_id":"701eba8538a1dee2e978dbee689d2efa1c74b931"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d6f8bb30caeacb3bf5634c1156608745908bc7a8","unresolved":false,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"def listener(cls):"},{"line_number":296,"context_line":"    \"\"\"TODO: add a nice, tidy comment here...\"\"\""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def init_wrapper(init):"},{"line_number":299,"context_line":"        def __new_init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_e7b34809","line":296,"updated":"2015-06-02 01:23:47.000000000","message":"why not do this now?","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f5ce458b8d5192b413af1570628e33975ed4ea62","unresolved":false,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"def listener(cls):"},{"line_number":296,"context_line":"    \"\"\"TODO: add a nice, tidy comment here...\"\"\""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def init_wrapper(init):"},{"line_number":299,"context_line":"        def __new_init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba3cc151_3813ebb9","line":296,"in_reply_to":"5afe65bd_e7b34809","updated":"2015-07-08 21:48:36.000000000","message":"Done","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d6f8bb30caeacb3bf5634c1156608745908bc7a8","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    \"\"\"TODO: add a nice, tidy comment here...\"\"\""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def init_wrapper(init):"},{"line_number":299,"context_line":"        def __new_init__(self, *args, **kwargs):"},{"line_number":300,"context_line":"            init(self, *args, **kwargs)"},{"line_number":301,"context_line":"            _register_event_callbacks(self)"},{"line_number":302,"context_line":"        return __new_init__"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_c7b84ce8","line":299,"updated":"2015-06-02 01:23:47.000000000","message":"suggest use @functools.wraps","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f5ce458b8d5192b413af1570628e33975ed4ea62","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    \"\"\"TODO: add a nice, tidy comment here...\"\"\""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def init_wrapper(init):"},{"line_number":299,"context_line":"        def __new_init__(self, *args, **kwargs):"},{"line_number":300,"context_line":"            init(self, *args, **kwargs)"},{"line_number":301,"context_line":"            _register_event_callbacks(self)"},{"line_number":302,"context_line":"        return __new_init__"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba3cc151_f87fc3dc","line":299,"in_reply_to":"5afe65bd_c7b84ce8","updated":"2015-07-08 21:48:36.000000000","message":"I was trying to not change the code much, but I\u0027ve made this change.","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d6f8bb30caeacb3bf5634c1156608745908bc7a8","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        return __new_init__"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def _register_event_callbacks(self):"},{"line_number":305,"context_line":"        # NOTE(morganfainberg): A provider who has an implicit"},{"line_number":306,"context_line":"        # dependency on other providers may utilize the event callback"},{"line_number":307,"context_line":"        # mechanism to react to any changes in those providers. This is"},{"line_number":308,"context_line":"        # performed at the .provider() mechanism so that we can ensure"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_87cb7472","line":305,"updated":"2015-06-02 01:23:47.000000000","message":"isn\u0027t this what\u0027s being changed? the class doesn\u0027t have to be a provider.","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f5ce458b8d5192b413af1570628e33975ed4ea62","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        return __new_init__"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def _register_event_callbacks(self):"},{"line_number":305,"context_line":"        # NOTE(morganfainberg): A provider who has an implicit"},{"line_number":306,"context_line":"        # dependency on other providers may utilize the event callback"},{"line_number":307,"context_line":"        # mechanism to react to any changes in those providers. This is"},{"line_number":308,"context_line":"        # performed at the .provider() mechanism so that we can ensure"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba3cc151_9871d70e","line":305,"in_reply_to":"5afe65bd_87cb7472","updated":"2015-07-08 21:48:36.000000000","message":"Done","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d6f8bb30caeacb3bf5634c1156608745908bc7a8","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        # NOTE(morganfainberg): A provider who has an implicit"},{"line_number":306,"context_line":"        # dependency on other providers may utilize the event callback"},{"line_number":307,"context_line":"        # mechanism to react to any changes in those providers. This is"},{"line_number":308,"context_line":"        # performed at the .provider() mechanism so that we can ensure"},{"line_number":309,"context_line":"        # that the callback is only ever called once and guaranteed"},{"line_number":310,"context_line":"        # to be on the properly configured and instantiated backend."},{"line_number":311,"context_line":"        if not hasattr(self, \u0027event_callbacks\u0027):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_47c57c59","line":308,"updated":"2015-06-02 01:23:47.000000000","message":"isn\u0027t this now the .listener() mechanism?","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f5ce458b8d5192b413af1570628e33975ed4ea62","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        # NOTE(morganfainberg): A provider who has an implicit"},{"line_number":306,"context_line":"        # dependency on other providers may utilize the event callback"},{"line_number":307,"context_line":"        # mechanism to react to any changes in those providers. This is"},{"line_number":308,"context_line":"        # performed at the .provider() mechanism so that we can ensure"},{"line_number":309,"context_line":"        # that the callback is only ever called once and guaranteed"},{"line_number":310,"context_line":"        # to be on the properly configured and instantiated backend."},{"line_number":311,"context_line":"        if not hasattr(self, \u0027event_callbacks\u0027):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba3cc151_5866ef51","line":308,"in_reply_to":"5afe65bd_47c57c59","updated":"2015-07-08 21:48:36.000000000","message":"Done","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d6f8bb30caeacb3bf5634c1156608745908bc7a8","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        # performed at the .provider() mechanism so that we can ensure"},{"line_number":309,"context_line":"        # that the callback is only ever called once and guaranteed"},{"line_number":310,"context_line":"        # to be on the properly configured and instantiated backend."},{"line_number":311,"context_line":"        if not hasattr(self, \u0027event_callbacks\u0027):"},{"line_number":312,"context_line":"            return"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        if not isinstance(self.event_callbacks, dict):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_07a664c1","line":311,"updated":"2015-06-02 01:23:47.000000000","message":"seems like this should be an error now, just like it\u0027s an error if event_callbacks isn\u0027t a dict.","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f5ce458b8d5192b413af1570628e33975ed4ea62","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        # performed at the .provider() mechanism so that we can ensure"},{"line_number":309,"context_line":"        # that the callback is only ever called once and guaranteed"},{"line_number":310,"context_line":"        # to be on the properly configured and instantiated backend."},{"line_number":311,"context_line":"        if not hasattr(self, \u0027event_callbacks\u0027):"},{"line_number":312,"context_line":"            return"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        if not isinstance(self.event_callbacks, dict):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba3cc151_259c23bf","line":311,"in_reply_to":"5afe65bd_07a664c1","updated":"2015-07-08 21:48:36.000000000","message":"Done","commit_id":"d1a7d2409e2a4b41bd692f141199f59b1c1fa7b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    \"\"\"A class decorator to declare a class to be a notification listener."},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    A notification listener must specify the event(s) it is interested in by"},{"line_number":300,"context_line":"    defining a ``event_callbacks`` attribute or property. ``event_callbacks``"},{"line_number":301,"context_line":"    is a dictionary where the key is the type of event and the value is a"},{"line_number":302,"context_line":"    dictionary containing a mapping of resource types to callback(s)."},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_390bead7","line":300,"updated":"2015-07-08 23:49:10.000000000","message":"what\u0027s the difference between an attribute and a property?","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92efd0bb0ecb693c8981c5bb12aa3435eb1524ff","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    \"\"\"A class decorator to declare a class to be a notification listener."},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    A notification listener must specify the event(s) it is interested in by"},{"line_number":300,"context_line":"    defining a ``event_callbacks`` attribute or property. ``event_callbacks``"},{"line_number":301,"context_line":"    is a dictionary where the key is the type of event and the value is a"},{"line_number":302,"context_line":"    dictionary containing a mapping of resource types to callback(s)."},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_033649e7","line":300,"in_reply_to":"ba3cc151_390bead7","updated":"2015-07-10 19:20:12.000000000","message":"like, an attribute with @property","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":299,"context_line":"    A notification listener must specify the event(s) it is interested in by"},{"line_number":300,"context_line":"    defining a ``event_callbacks`` attribute or property. ``event_callbacks``"},{"line_number":301,"context_line":"    is a dictionary where the key is the type of event and the value is a"},{"line_number":302,"context_line":"    dictionary containing a mapping of resource types to callback(s)."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    ``keystone.notifications.ACTIONS`` contains constants for the currently"},{"line_number":305,"context_line":"    supported events. There is currently no single place to find constants for"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_f9aca2a0","line":302,"updated":"2015-07-08 23:49:10.000000000","message":"it would be more obvious if the dictionary was passed to the listener. e.g., \n\n\n @listener({\n   notifications.ACTIONS.created: {\n     \u0027user\u0027: self._user_created_callback,\n...\n\nalthough then I suppose you couldn\u0027t reference self. Maybe I\u0027d be better off wrapping the methods instead.","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":301,"context_line":"    is a dictionary where the key is the type of event and the value is a"},{"line_number":302,"context_line":"    dictionary containing a mapping of resource types to callback(s)."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    ``keystone.notifications.ACTIONS`` contains constants for the currently"},{"line_number":305,"context_line":"    supported events. There is currently no single place to find constants for"},{"line_number":306,"context_line":"    the resource types."},{"line_number":307,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_d97f5edd","line":304,"updated":"2015-07-08 23:49:10.000000000","message":"use :data:`.ACTIONS`","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        @functools.wraps(init)"},{"line_number":329,"context_line":"        def __new_init__(self, *args, **kwargs):"},{"line_number":330,"context_line":"            init(self, *args, **kwargs)"},{"line_number":331,"context_line":"            if not hasattr(self, \u0027event_callbacks\u0027):"},{"line_number":332,"context_line":"                msg \u003d _(\"%r object has no attribute \u0027event_callbacks\u0027\")"},{"line_number":333,"context_line":"                raise AttributeError(msg % self.__class__.__name)"},{"line_number":334,"context_line":"            _register_event_callbacks(self)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_54b6b33e","line":331,"updated":"2015-07-08 23:49:10.000000000","message":"register_event_callbacks is going to fail in an obvious way if there\u0027s no event_callbacks, so this check is excessive.","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        return __new_init__"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def _register_event_callbacks(self):"},{"line_number":338,"context_line":"        if not isinstance(self.event_callbacks, dict):"},{"line_number":339,"context_line":"            msg \u003d _(\u0027event_callbacks must be a dict\u0027)"},{"line_number":340,"context_line":"            raise ValueError(msg)"},{"line_number":341,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_79009202","line":338,"updated":"2015-07-08 23:49:10.000000000","message":"the attribute existence was checked above, so put this check there too.\n\nAlternatively, just remove this since it\u0027s going to be pretty obvious why this failed.","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":340,"context_line":"            raise ValueError(msg)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        for event in self.event_callbacks:"},{"line_number":343,"context_line":"            if not isinstance(self.event_callbacks[event], dict):"},{"line_number":344,"context_line":"                msg \u003d _(\u0027event_callbacks[%s] must be a dict\u0027) % event"},{"line_number":345,"context_line":"                raise ValueError(msg)"},{"line_number":346,"context_line":"            for resource_type in self.event_callbacks[event]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_d4c6439b","line":343,"updated":"2015-07-08 23:49:10.000000000","message":"another check that seems excessive.","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            if not isinstance(self.event_callbacks[event], dict):"},{"line_number":344,"context_line":"                msg \u003d _(\u0027event_callbacks[%s] must be a dict\u0027) % event"},{"line_number":345,"context_line":"                raise ValueError(msg)"},{"line_number":346,"context_line":"            for resource_type in self.event_callbacks[event]:"},{"line_number":347,"context_line":"                # Make sure we register the provider for each event it"},{"line_number":348,"context_line":"                # cares to call back."},{"line_number":349,"context_line":"                callbacks \u003d self.event_callbacks[event][resource_type]"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_741417e8","line":346,"updated":"2015-07-08 23:49:10.000000000","message":"this is asking for items()","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                # Make sure we register the provider for each event it"},{"line_number":348,"context_line":"                # cares to call back."},{"line_number":349,"context_line":"                callbacks \u003d self.event_callbacks[event][resource_type]"},{"line_number":350,"context_line":"                if not callbacks:"},{"line_number":351,"context_line":"                    continue"},{"line_number":352,"context_line":"                if not hasattr(callbacks, \u0027__iter__\u0027):"},{"line_number":353,"context_line":"                    # ensure the callback information is a list"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_d4a723ba","line":350,"updated":"2015-07-08 23:49:10.000000000","message":"there\u0027s all these unnecessary checks and then here it\u0027s ok to have an empty list or string or 0 or False? weird.","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"895738f6b9c2564fc014a9d8b03860c8deff6f04","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                callbacks \u003d self.event_callbacks[event][resource_type]"},{"line_number":350,"context_line":"                if not callbacks:"},{"line_number":351,"context_line":"                    continue"},{"line_number":352,"context_line":"                if not hasattr(callbacks, \u0027__iter__\u0027):"},{"line_number":353,"context_line":"                    # ensure the callback information is a list"},{"line_number":354,"context_line":"                    # allowing multiple callbacks to exist"},{"line_number":355,"context_line":"                    callbacks \u003d [callbacks]"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_14a26bae","line":352,"updated":"2015-07-08 23:49:10.000000000","message":"suggest use collections.Iterable ?","commit_id":"893a10144a93bc54021256f8073b60d88abc983f"}]}
