)]}'
{"doc/specs/in-progress/multi_backend_support.rst":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"ca3ccab4776d2e790c4e9e342ac51d33c4a7283a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Dependencies"},{"line_number":89,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"- Cinder, Glance, Trove, Heat should be changed"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba8a016a_a00b0dd5","line":91,"updated":"2015-11-19 18:12:41.000000000","message":"Any idea how/when that change will be accomplished?","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"61dfeb13a333330ccb82a1903771b2b366cb6464","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Dependencies"},{"line_number":89,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"- Cinder, Glance, Trove, Heat should be changed"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba8a016a_b0f6d8f7","line":91,"in_reply_to":"ba8a016a_a00b0dd5","updated":"2015-11-20 10:15:47.000000000","message":"well, this step is not mandatory to start next work items, because this change transparently makes projects already using osprofiler to use Messaging driver - in fact I think we can leave these lines in Cinder, Glance, Trove, Heat as is for now - as in they use only notifications opportunity now. So we can change services to use ceilometer:// connection string for instance, but that is not mandatory.","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"f5664a854121c5462982c222073037aa4adcc599","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Primary assignee:"},{"line_number":54,"context_line":"  dbelova"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Work Items"},{"line_number":58,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":26,"id":"5a18252c_850cc995","line":55,"updated":"2016-04-12 15:41:26.000000000","message":"please add ayelistratov as well :)","commit_id":"6ab8a98847365cdea71826076621c3651fa00180"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"- Deprecate osprofiler.notifiers and osprofier.parsers"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"- Cut new release 0.4.2"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"- Switch all projects to new model with connection string"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"dab17558_fab3bd08","line":84,"updated":"2016-05-05 22:33:40.000000000","message":"0.4.2 is not correct, I think it is better to remove this line.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"- Deprecate osprofiler.notifiers and osprofier.parsers"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"- Cut new release 0.4.2"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"- Switch all projects to new model with connection string"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"dab17558_3c8d2132","line":84,"in_reply_to":"dab17558_fab3bd08","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"}],"osprofiler/_utils.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"f8617b75ae07fad25f89ee10d52376679cd85329","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def parse_url(potential_url):"},{"line_number":180,"context_line":"    if not re.match(\"(\\w+)[:](.*)\", potential_url):"},{"line_number":181,"context_line":"        raise ValueError(\"URL \u0027%s\u0027 must start with a valid scheme\" %"},{"line_number":182,"context_line":"                         potential_url)"},{"line_number":183,"context_line":"    return urlparse.urlparse(potential_url)"}],"source_content_type":"text/x-python","patch_set":40,"id":"3aaa91ec_01666a50","line":180,"updated":"2016-06-30 10:21:53.000000000","message":"function can be simplified by changing into:\n  parsed \u003d urlparse.urlparse(potential_url)\n  if not parsed.scheme:\n       raise ...\n  return parsed\n\nthe benefit is in simpler code and hidden details of url parsing\n\n... but it looks like this function is not needed at all (see comments in base.py)","commit_id":"47dc9c63bcaafbf58c4d03ecf3148d875052b825"}],"osprofiler/drivers/base.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a765215d251a6aa19afc37a7f5301322d233627d","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"},{"line_number":58,"context_line":"    def notify_factory(name, *args, **kwargs):"},{"line_number":59,"context_line":"        for driver in utils.itersubclasses(Driver):"},{"line_number":60,"context_line":"            if name \u003d\u003d driver.__name__:"},{"line_number":61,"context_line":"                return driver(*args, **kwargs).notify"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_c592e3f5","line":59,"updated":"2015-11-19 18:09:06.000000000","message":"I know boris doesn\u0027t like using stevedore, but I think we probably should use it eventually...","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"61dfeb13a333330ccb82a1903771b2b366cb6464","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"},{"line_number":58,"context_line":"    def notify_factory(name, *args, **kwargs):"},{"line_number":59,"context_line":"        for driver in utils.itersubclasses(Driver):"},{"line_number":60,"context_line":"            if name \u003d\u003d driver.__name__:"},{"line_number":61,"context_line":"                return driver(*args, **kwargs).notify"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_50c3ec8a","line":59,"in_reply_to":"ba8a016a_c592e3f5","updated":"2015-11-20 10:15:47.000000000","message":"well, yeah, I think we can do that in separated change once we\u0027ll persuade him :D","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a765215d251a6aa19afc37a7f5301322d233627d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    @staticmethod"},{"line_number":66,"context_line":"    def _build_tree(nodes):"},{"line_number":67,"context_line":"        \"\"\"Builds the tree (forest) data structure based on the list of nodes."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"       Works in O(n)."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"       :param nodes: list of nodes, where each node is a dictionary with fields"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_456cb307","line":68,"updated":"2015-11-19 18:09:06.000000000","message":"Well hmmm, likely works in O(nlogn) since u are sorting a few times here...\n\nAnyways.","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"61dfeb13a333330ccb82a1903771b2b366cb6464","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    @staticmethod"},{"line_number":66,"context_line":"    def _build_tree(nodes):"},{"line_number":67,"context_line":"        \"\"\"Builds the tree (forest) data structure based on the list of nodes."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"       Works in O(n)."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"       :param nodes: list of nodes, where each node is a dictionary with fields"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_d05cbcf2","line":68,"in_reply_to":"ba8a016a_456cb307","updated":"2015-11-20 10:15:47.000000000","message":"it\u0027s the copy of old docstring, I did not manage to recalculate it to check if that\u0027s true :) Although I suppose this line related to the fact of tree building - its sorting is next step","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a765215d251a6aa19afc37a7f5301322d233627d","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                nodes[parent_id].setdefault(\"children\", [])"},{"line_number":87,"context_line":"                nodes[parent_id][\"children\"].append(node)"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                tree.append(node)  # no parent \u003d\u003e top-level node"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        for node in nodes:"},{"line_number":92,"context_line":"            nodes[node][\"children\"].sort(key\u003dlambda x: x[\"info\"][\"started\"])"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_65b8d775","line":89,"updated":"2015-11-19 18:09:06.000000000","message":"Any idea, but perhaps http://docs.openstack.org/developer/taskflow/types.html#module-taskflow.types.tree could be useful, maybe someday :-P","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"97f10c6d85adc18a321856e2acc9e1011c2a46a1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                nodes[parent_id].setdefault(\"children\", [])"},{"line_number":87,"context_line":"                nodes[parent_id][\"children\"].append(node)"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                tree.append(node)  # no parent \u003d\u003e top-level node"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        for node in nodes:"},{"line_number":92,"context_line":"            nodes[node][\"children\"].sort(key\u003dlambda x: x[\"info\"][\"started\"])"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_a0a1cdf9","line":89,"in_reply_to":"ba8a016a_65b8d775","updated":"2015-11-19 18:11:59.000000000","message":"An, not any, ha","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"61dfeb13a333330ccb82a1903771b2b366cb6464","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                nodes[parent_id].setdefault(\"children\", [])"},{"line_number":87,"context_line":"                nodes[parent_id][\"children\"].append(node)"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                tree.append(node)  # no parent \u003d\u003e top-level node"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        for node in nodes:"},{"line_number":92,"context_line":"            nodes[node][\"children\"].sort(key\u003dlambda x: x[\"info\"][\"started\"])"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_d0035cbd","line":89,"in_reply_to":"ba8a016a_a0a1cdf9","updated":"2015-11-20 10:15:47.000000000","message":"intersting, did not know about this structure, will take a look, thanks!","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a765215d251a6aa19afc37a7f5301322d233627d","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise SyntaxError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                              \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                              \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_8534dbfb","line":136,"updated":"2015-11-19 18:09:06.000000000","message":"Hmmm, syntax error?\n\nhttps://docs.python.org/2/library/exceptions.html#exceptions.SyntaxError\n\nThat doesn\u0027t seem to be the right one imho ;)\n\nI always thought ValueError was more appropriate and probably this should be raised in __init__ earlier rather than later right?","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"ec1bc787dab1e87a801eadaf75b7224a83aec263","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise SyntaxError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                              \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                              \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_75db25ee","line":136,"in_reply_to":"ba8a016a_30ff48ac","updated":"2015-11-23 15:45:31.000000000","message":"as for the placement - so well, not in fact - we may use driver for read notifications only, in that case we have no intention to pass messaging info - I believe at least.","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"61dfeb13a333330ccb82a1903771b2b366cb6464","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise SyntaxError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                              \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                              \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_30ff48ac","line":136,"in_reply_to":"ba8a016a_8534dbfb","updated":"2015-11-20 10:15:47.000000000","message":"thanks, it looks like I unintentionally used the wrong Exception :) will change, thanks!","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"22f17e5d7334ecc69273310f8381b74cc41c1d0d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class Driver(object):"},{"line_number":22,"context_line":"    def __init__(self, connection_str\u003dNone):"},{"line_number":23,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":24,"context_line":"        self.parsed_url \u003d urlparse.urlparse(self.connection_str)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":27,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_4cec5cf3","line":24,"updated":"2015-12-01 20:30:04.000000000","message":"I\u0027d recommend making this a _utils method that could be the following:\n\n    import six.moves.urllib.parse as urlparse\n    import re\n\n\n    def parse_url(maybe_url):\n        if not re.match(\"(\\w+)[:](.*)\", maybe_url):\n            raise ValueError(\"URL \u0027%s\u0027 must start with a\"\n                             \" valid scheme\" % maybe_url)\n        return urlparse.urlparse(maybe_url)\n\nThis has additional validation that can be nice to have, and can allow for further api changes easily in the future...","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9dffe5701c9b4a7b18f6946119909fec48b5cca3","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class Driver(object):"},{"line_number":22,"context_line":"    def __init__(self, connection_str\u003dNone):"},{"line_number":23,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":24,"context_line":"        self.parsed_url \u003d urlparse.urlparse(self.connection_str)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":27,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_54dda712","line":24,"in_reply_to":"9a8ffd7b_4cec5cf3","updated":"2015-12-02 09:50:16.000000000","message":"ack, good idea","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c5da5a20d6f4783da887bc104e1c9187ba7fa2b6","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class Driver(object):"},{"line_number":22,"context_line":"    def __init__(self, connection_str\u003dNone):"},{"line_number":23,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":24,"context_line":"        self.parsed_url \u003d urlparse.urlparse(self.connection_str)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":27,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_1f097384","line":24,"in_reply_to":"9a8ffd7b_54dda712","updated":"2015-12-02 11:27:36.000000000","message":"Done","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"da6e320f150ed360cda64664fc99f657c577314a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise ValueError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                             \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_d114654e","line":136,"updated":"2015-12-01 20:19:21.000000000","message":"\u0027possibility\u0027 -\u003e \u0027capability\u0027","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c5da5a20d6f4783da887bc104e1c9187ba7fa2b6","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise ValueError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                             \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_df276b10","line":136,"in_reply_to":"9a8ffd7b_d114654e","updated":"2015-12-02 11:27:36.000000000","message":"Done","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"9dffe5701c9b4a7b18f6946119909fec48b5cca3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise ValueError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                             \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_5404c77c","line":136,"in_reply_to":"9a8ffd7b_d114654e","updated":"2015-12-02 09:50:16.000000000","message":"sorry for bad English :)","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"da6e320f150ed360cda64664fc99f657c577314a","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise ValueError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                             \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"},{"line_number":140,"context_line":"        info[\"service\"] \u003d self.service"},{"line_number":141,"context_line":"        self.notify_client.info(context or self.context,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_f1172952","line":138,"updated":"2015-12-01 20:19:21.000000000","message":"Topic actually doesn\u0027t seem needed, it appears to automatically get set to \u0027profiler\u0027 right? Also these names don\u0027t match to what __init__ takes, should they be the same, it appears publish_id --\u003e host","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c5da5a20d6f4783da887bc104e1c9187ba7fa2b6","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if not self.notify_client:"},{"line_number":136,"context_line":"            raise ValueError(\"To use driver\u0027s notification possibility you \""},{"line_number":137,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":138,"context_line":"                             \"like transport, publisher_id, topic, etc.\")"},{"line_number":139,"context_line":"        info[\"project\"] \u003d self.project"},{"line_number":140,"context_line":"        info[\"service\"] \u003d self.service"},{"line_number":141,"context_line":"        self.notify_client.info(context or self.context,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_9f1d63c0","line":138,"in_reply_to":"9a8ffd7b_f1172952","updated":"2015-12-02 11:27:36.000000000","message":"Done","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"22f17e5d7334ecc69273310f8381b74cc41c1d0d","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                                \"profiler.%s\" % self.service, info)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"def get_driver(name, *args, **kwargs):"},{"line_number":146,"context_line":"    for driver in utils.itersubclasses(Driver):"},{"line_number":147,"context_line":"        if name \u003d\u003d driver.__name__:"},{"line_number":148,"context_line":"            return driver(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_ec8e7026","line":145,"updated":"2015-12-01 20:30:04.000000000","message":"Wouldn\u0027t this just be getting a driver based on connection_url scheme? The name can be the connection_url scheme.\n\nFor example using that code from above:\n\n    u \u003d \"ceilo://blah\"\n    u \u003d parse_url(u)\n    print(u.scheme)\n\nThat outputs \u0027ceilo\u0027 can\u0027t that be then used to find the driver for ceilometer... This matches what I\u0027ve seen in tooz, sqlalchemy, taskflow...","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c5da5a20d6f4783da887bc104e1c9187ba7fa2b6","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                                \"profiler.%s\" % self.service, info)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"def get_driver(name, *args, **kwargs):"},{"line_number":146,"context_line":"    for driver in utils.itersubclasses(Driver):"},{"line_number":147,"context_line":"        if name \u003d\u003d driver.__name__:"},{"line_number":148,"context_line":"            return driver(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_5f7a9bf2","line":145,"in_reply_to":"9a8ffd7b_ec8e7026","updated":"2015-12-02 11:27:36.000000000","message":"Done","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"babc73be3c5c86907f6745b71d9bf876b13aa992","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_5f711c75","line":14,"updated":"2015-12-02 19:00:06.000000000","message":"Why is oslo_log needed.\n\nRegular logging that doesn\u0027t pull in a new requirement doesn\u0027t work fine?\n\n  import logging as log","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c0c2fd51103a32dcd7757b1a375bea5bfabb43be","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_a1f7ced1","line":14,"in_reply_to":"9a8ffd7b_5f711c75","updated":"2015-12-02 19:57:02.000000000","message":"well, simply I did it without any specific thoughts. yep, it should be used :)","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"2aae00148887c12087e81e9275da23c9798f1f5b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_8cb8a812","line":14,"in_reply_to":"9a8ffd7b_a1f7ced1","updated":"2015-12-03 06:50:57.000000000","message":":)","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a8fb041350308427f1cc13a36295757aa3a2ee1a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_04fa6d43","line":28,"updated":"2015-12-02 18:53:40.000000000","message":"Hmmm, why catch and swallow this error?","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"10e3b9195e6cf4a260cc6cecd39c03931c5be299","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_242a1191","line":28,"in_reply_to":"9a8ffd7b_04fa6d43","updated":"2015-12-02 18:55:35.000000000","message":"Nevermind, I think i see why now, due to dual usage of, \u0027name_or_connection_string\u0027. Should we really still allow both? thoughts?\n\nWhy not just pick \u0027connection_string/url\u0027 as the way to go (and not allow for both kinds here?) to big of a change?","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c0c2fd51103a32dcd7757b1a375bea5bfabb43be","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_611486e8","line":28,"in_reply_to":"9a8ffd7b_242a1191","updated":"2015-12-02 19:57:02.000000000","message":"we should allow it due to the backward compatibility... right now projects are using name... we should deprecate it once.","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0b9bc0fd054c53e5a87a678c0646a1e3ad0a5cfa","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_ccdb107b","line":28,"in_reply_to":"9a8ffd7b_611486e8","updated":"2015-12-03 06:50:11.000000000","message":"Okies.","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a8fb041350308427f1cc13a36295757aa3a2ee1a","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    for driver in utils.itersubclasses(Driver):"},{"line_number":168,"context_line":"        if parsed_connection:"},{"line_number":169,"context_line":"            backend \u003d parsed_connection.shema"},{"line_number":170,"context_line":"            if (backend \u003d\u003d driver.read_backend or"},{"line_number":171,"context_line":"                    backend \u003d\u003d driver.notify_backend):"},{"line_number":172,"context_line":"                return driver(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_a46fe1fa","line":169,"updated":"2015-12-02 18:53:40.000000000","message":"shema -\u003e scheme","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c0c2fd51103a32dcd7757b1a375bea5bfabb43be","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    for driver in utils.itersubclasses(Driver):"},{"line_number":168,"context_line":"        if parsed_connection:"},{"line_number":169,"context_line":"            backend \u003d parsed_connection.shema"},{"line_number":170,"context_line":"            if (backend \u003d\u003d driver.read_backend or"},{"line_number":171,"context_line":"                    backend \u003d\u003d driver.notify_backend):"},{"line_number":172,"context_line":"                return driver(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_61eb26dd","line":169,"in_reply_to":"9a8ffd7b_a46fe1fa","updated":"2015-12-02 19:57:02.000000000","message":"oops, yeah","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"7a2d8f1ccefd162924a1182c55922346c0f74d5a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def _build_tree(nodes):"},{"line_number":72,"context_line":"        \"\"\"Builds the tree (forest) data structure based on the list of nodes."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"       Tree building works in O(n)."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"       :param nodes: list of nodes, where each node is a dictionary with fields"},{"line_number":77,"context_line":"                     \"parent_id\", \"trace_id\", \"info\""}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_c9d2ab34","line":74,"updated":"2015-12-10 06:41:01.000000000","message":"Well sort of, the sorting makes it still O(nlogn) but whatever :-P","commit_id":"8b97993a8760e3364656542532a68ae79f03387e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"7a2d8f1ccefd162924a1182c55922346c0f74d5a","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    for driver in utils.itersubclasses(Driver):"},{"line_number":168,"context_line":"        if parsed_connection:"},{"line_number":169,"context_line":"            backend \u003d parsed_connection.sheme"},{"line_number":170,"context_line":"            if (backend \u003d\u003d driver.read_backend or"},{"line_number":171,"context_line":"                    backend \u003d\u003d driver.notify_backend):"},{"line_number":172,"context_line":"                return driver(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_099f5360","line":169,"updated":"2015-12-10 06:41:01.000000000","message":"Still a little off here ;)\n\n    \u003e\u003e\u003e parsed_connection\n    ParseResult(scheme\u003d\u0027http\u0027, netloc\u003d\u0027www.google.com\u0027, path\u003d\u0027\u0027, params\u003d\u0027\u0027, query\u003d\u0027\u0027, fragment\u003d\u0027\u0027)\n    \u003e\u003e\u003e parsed_connection.sheme\n    Traceback (most recent call last):\n      File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n    AttributeError: \u0027ParseResult\u0027 object has no attribute \u0027sheme\u0027","commit_id":"8b97993a8760e3364656542532a68ae79f03387e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"a211bc560c7890c13fe7b234ff4296bcb82863dc","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    for driver in utils.itersubclasses(Driver):"},{"line_number":168,"context_line":"        if parsed_connection:"},{"line_number":169,"context_line":"            backend \u003d parsed_connection.sheme"},{"line_number":170,"context_line":"            if (backend \u003d\u003d driver.read_backend or"},{"line_number":171,"context_line":"                    backend \u003d\u003d driver.notify_backend):"},{"line_number":172,"context_line":"                return driver(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_8ae1ee00","line":169,"in_reply_to":"7a740942_099f5360","updated":"2015-12-10 09:04:08.000000000","message":"I\u0027consistent in making something strange :)","commit_id":"8b97993a8760e3364656542532a68ae79f03387e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"9d96461803118940672892516df5bc2b59a9691a","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    for driver in utils.itersubclasses(Driver):"},{"line_number":168,"context_line":"        if parsed_connection:"},{"line_number":169,"context_line":"            backend \u003d parsed_connection.sheme"},{"line_number":170,"context_line":"            if (backend \u003d\u003d driver.read_backend or"},{"line_number":171,"context_line":"                    backend \u003d\u003d driver.notify_backend):"},{"line_number":172,"context_line":"                return driver(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_74f6b9fa","line":169,"in_reply_to":"7a740942_8ae1ee00","updated":"2015-12-10 22:47:09.000000000","message":";)","commit_id":"8b97993a8760e3364656542532a68ae79f03387e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c383837096a102ab6e051cf48fd858f1b0d80368","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    parsed_connection \u003d None"},{"line_number":158,"context_line":"    try:"},{"line_number":159,"context_line":"        parsed_connection \u003d utils.parse_url(name_or_connection_string)"},{"line_number":160,"context_line":"        LOG.debug(\"String %s looks like a connection string, trying it.\" %"},{"line_number":161,"context_line":"                  name_or_connection_string)"},{"line_number":162,"context_line":"    except ValueError:"},{"line_number":163,"context_line":"        LOG.debug(\"String %s cannot be interpreted as a connection string,\""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_20e1ddd0","line":160,"updated":"2015-12-17 19:17:59.000000000","message":"nit, use delayed interpolation by doing the following so that string interpolation doesn\u0027t even happen if DEBUG isn\u0027t enabled\n\n  LOG.debug(\"String %s looks like a connection string, trying it.\", name_or_connection_string)\n\nJust a good habit to get into IMHO.","commit_id":"adb4dd2518f94004014844b195925002ec08cf18"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"38de712c92caa4fbb8dfc1bc9ba5393155b10a35","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    parsed_connection \u003d None"},{"line_number":158,"context_line":"    try:"},{"line_number":159,"context_line":"        parsed_connection \u003d utils.parse_url(name_or_connection_string)"},{"line_number":160,"context_line":"        LOG.debug(\"String %s looks like a connection string, trying it.\" %"},{"line_number":161,"context_line":"                  name_or_connection_string)"},{"line_number":162,"context_line":"    except ValueError:"},{"line_number":163,"context_line":"        LOG.debug(\"String %s cannot be interpreted as a connection string,\""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_148646b9","line":160,"in_reply_to":"3a7e1126_20e1ddd0","updated":"2015-12-18 09:49:49.000000000","message":"Done","commit_id":"adb4dd2518f94004014844b195925002ec08cf18"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import logging as log"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from osprofiler import _utils as utils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_63e84be3","line":18,"updated":"2015-12-25 01:00:21.000000000","message":"as utils is redundant here","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def __init__(self, connection_str\u003dNone):"},{"line_number":25,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_c3b7bff3","line":27,"updated":"2015-12-25 01:00:21.000000000","message":"Why connection string must be a proper url?","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def __init__(self, connection_str\u003dNone):"},{"line_number":25,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_96724eac","line":27,"in_reply_to":"1a7b0d38_c3b7bff3","updated":"2015-12-25 08:17:00.000000000","message":"it\u0027s not the url in fact, but it has the same format:\n\n\u003cdriver\u003e://\u003cadress\u003e:\u003cport\u003e/?\u003csome_query_where_we_can_hide_everything_needed\u003e","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":32,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_e3a19baa","line":29,"updated":"2015-12-25 01:00:21.000000000","message":"This will lead very hard to debug errors in future. \n\nIf somebody specify wrong option in CONF and put wrong URL format, instead of failure to start service with nice trace back he will just use default empty value. \n\nI would strongly recomend here just to call: \n\n  self.parsed_url \u003d self.connection_str and utils.parse_url(self.connection_str)","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"cca464b931e4e7dd681e5024dd2fe6b6d0d39fe0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":32,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_56514661","line":29,"in_reply_to":"1a7b0d38_165f3e0f","updated":"2015-12-25 08:31:33.000000000","message":"why \u0027and\u0027 in fact?","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"2f0f7e6851a079d441bb067341c4e684e5fa1f4b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":32,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_9960ff02","line":29,"in_reply_to":"1a7b0d38_56514661","updated":"2015-12-29 02:29:08.000000000","message":"not sure that I understand here question...","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.parsed_url \u003d utils.parse_url(self.connection_str)"},{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":32,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_165f3e0f","line":29,"in_reply_to":"1a7b0d38_e3a19baa","updated":"2015-12-25 08:17:00.000000000","message":"ack","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":32,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        To add new drivers you should, create new subclass of this class and"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_a74e3e6d","line":31,"updated":"2015-12-25 01:00:21.000000000","message":"I am not sure that we should actually pass \"context\" to all Drivers implementation because this is related actually only to Messaging based drivers.","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        except ValueError:"},{"line_number":29,"context_line":"            self.parsed_url \u003d None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def notify(self, info, context\u003dNone):"},{"line_number":32,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        To add new drivers you should, create new subclass of this class and"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_d69f76b2","line":31,"in_reply_to":"1a7b0d38_a74e3e6d","updated":"2015-12-25 08:17:00.000000000","message":"ok, I\u0027ll add just kwargs here","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                        current active user and tenant."},{"line_number":51,"context_line":"        \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def parse_notifications(self, notifications):"},{"line_number":54,"context_line":"        \"\"\"Parse \u0026 builds tree structure from list of notifications.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def get_notifications(self, base_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_2359e35a","line":53,"updated":"2015-12-25 01:00:21.000000000","message":"As we are changing everything, let\u0027s change bad interface as well. \nThere is actually no need to have parse_notifications \u0026 get_notifications as a 2 separated methods. Because they are not independent \u0026 can\u0027t be used separately.  \n\nSo let\u0027s just have one method:\n\n  def get_report(self, base_id):\n     pass","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                        current active user and tenant."},{"line_number":51,"context_line":"        \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def parse_notifications(self, notifications):"},{"line_number":54,"context_line":"        \"\"\"Parse \u0026 builds tree structure from list of notifications.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def get_notifications(self, base_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_36b11a48","line":53,"in_reply_to":"1a7b0d38_2359e35a","updated":"2015-12-25 08:17:00.000000000","message":"ok","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"},{"line_number":63,"context_line":"    def notify_factory(name, *args, **kwargs):"},{"line_number":64,"context_line":"        for driver in utils.itersubclasses(Driver):"},{"line_number":65,"context_line":"            if name \u003d\u003d driver.__name__:"},{"line_number":66,"context_line":"                return driver(*args, **kwargs).notify"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_432bcf94","line":63,"updated":"2015-12-25 01:00:21.000000000","message":"Why we need notify_factory? \n\nI would suggest to use proven pattern from Rally for work with plugins. \n\n\nJust do next: \n\n   your_driver \u003d Drvier.get(connection_string)\n\n   your_driver.notify()\n   your_driver.get_report()","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"},{"line_number":63,"context_line":"    def notify_factory(name, *args, **kwargs):"},{"line_number":64,"context_line":"        for driver in utils.itersubclasses(Driver):"},{"line_number":65,"context_line":"            if name \u003d\u003d driver.__name__:"},{"line_number":66,"context_line":"                return driver(*args, **kwargs).notify"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_f6bab222","line":63,"in_reply_to":"1a7b0d38_432bcf94","updated":"2015-12-25 08:17:00.000000000","message":"ok","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class Messaging(Driver):"},{"line_number":103,"context_line":"    def __init__(self, messaging, context, transport, project, service, host,"},{"line_number":104,"context_line":"                 connection_str\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_43ed0fee","line":102,"updated":"2015-12-25 01:00:21.000000000","message":"Please use separated module for each driver. \n\nBy the way Messaging driver should be abstract.\n\nImplementation of get_report() should be done in Ceilometer driver which will inherit Messaging driver.","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class Messaging(Driver):"},{"line_number":103,"context_line":"    def __init__(self, messaging, context, transport, project, service, host,"},{"line_number":104,"context_line":"                 connection_str\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""},{"line_number":106,"context_line":"        super(Messaging, self).__init__(connection_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_47ff5a34","line":103,"updated":"2015-12-25 01:00:21.000000000","message":"We need to have the same set of arguments in __init__ method somehow, otherwise we don\u0027t have any improvments from base code.\n\nThe idea is that we should be able to do in code of all other projects:\n\n  profiler.set_notifer(Driver.get(connection_string))\n\nOtherwise we will have a lot of code in projects that will be quite hard to maintain.\n\n\nOne of the way to process with this is to force everybody to pass everything required by messaging driver, even when this data is not used, at least we will have the signature always.","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"141dc727d66fa2a750724e40af93fe3dc0788593","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class Messaging(Driver):"},{"line_number":103,"context_line":"    def __init__(self, messaging, context, transport, project, service, host,"},{"line_number":104,"context_line":"                 connection_str\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""},{"line_number":106,"context_line":"        super(Messaging, self).__init__(connection_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_7c7d416d","line":103,"in_reply_to":"1a7b0d38_2100f6a9","updated":"2015-12-25 09:39:22.000000000","message":"I think that for backward compatibility we may have here project, service and host as a kwargs, and then to remove it. Meanwhile we may introduce query parsing to the base.Driver.get method like this:\n\n            if parsed_connection:\n                backend \u003d parsed_connection.scheme\n                parsed_query_args \u003d _utils.parse_query(parsed_connection.query)\n                kwargs.update(parsed_query_args)\n                if (backend \u003d\u003d driver.read_backend or\n                        backend \u003d\u003d driver.notify_backend):\n                    return driver(*args, **kwargs)","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"522f9c16324534c94660d3c2bdb3c382522fb4ef","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class Messaging(Driver):"},{"line_number":103,"context_line":"    def __init__(self, messaging, context, transport, project, service, host,"},{"line_number":104,"context_line":"                 connection_str\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""},{"line_number":106,"context_line":"        super(Messaging, self).__init__(connection_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_2100f6a9","line":103,"in_reply_to":"1a7b0d38_47ff5a34","updated":"2015-12-25 09:01:37.000000000","message":"well, we\u0027ll never will be able to hide everything in the connection string - oslo_messaging and transport objects still will be presented.","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"2f0f7e6851a079d441bb067341c4e684e5fa1f4b","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class Messaging(Driver):"},{"line_number":103,"context_line":"    def __init__(self, messaging, context, transport, project, service, host,"},{"line_number":104,"context_line":"                 connection_str\u003dNone):"},{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""},{"line_number":106,"context_line":"        super(Messaging, self).__init__(connection_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_f93d83dd","line":103,"in_reply_to":"1a7b0d38_7c7d416d","updated":"2015-12-29 02:29:08.000000000","message":"I do not understand the code above\u003d(","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""},{"line_number":106,"context_line":"        super(Messaging, self).__init__(connection_str)"},{"line_number":107,"context_line":"        self.notify_backend \u003d \"messaging\""},{"line_number":108,"context_line":"        self.read_backend \u003d None"},{"line_number":109,"context_line":"        self.messaging \u003d messaging"},{"line_number":110,"context_line":"        self.context \u003d context"},{"line_number":111,"context_line":"        self.project \u003d project"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_87a9c2e1","line":108,"updated":"2015-12-25 01:00:21.000000000","message":"I don\u0027t think that we need to create notify_backend, read_backend, project \u0026 service variables as well as notify_client and read_client","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""},{"line_number":106,"context_line":"        super(Messaging, self).__init__(connection_str)"},{"line_number":107,"context_line":"        self.notify_backend \u003d \"messaging\""},{"line_number":108,"context_line":"        self.read_backend \u003d None"},{"line_number":109,"context_line":"        self.messaging \u003d messaging"},{"line_number":110,"context_line":"        self.context \u003d context"},{"line_number":111,"context_line":"        self.project \u003d project"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_f604f2c0","line":108,"in_reply_to":"1a7b0d38_87a9c2e1","updated":"2015-12-25 08:17:00.000000000","message":"but driver may have different backends to use for these two purposes - Ceilometer driver is a good example.","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"2f0f7e6851a079d441bb067341c4e684e5fa1f4b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \"\"\"Driver sending notifications via message queues.\"\"\""},{"line_number":106,"context_line":"        super(Messaging, self).__init__(connection_str)"},{"line_number":107,"context_line":"        self.notify_backend \u003d \"messaging\""},{"line_number":108,"context_line":"        self.read_backend \u003d None"},{"line_number":109,"context_line":"        self.messaging \u003d messaging"},{"line_number":110,"context_line":"        self.context \u003d context"},{"line_number":111,"context_line":"        self.project \u003d project"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_54601ecf","line":108,"in_reply_to":"1a7b0d38_f604f2c0","updated":"2015-12-29 02:29:08.000000000","message":"Let\u0027s keep code simple.\n\nWe are introducing \"driver\" mechanism to have N simple drivers not one big fat not testable code. \n\nIn your case we should have MessagingBaseDriver with abstract method get_report() and as a first implementation we should have CeilometerDriver with own get_report(). \n\nIf we add some other collectors (StackTach or custom implementation) we will create more drivers that inherit MessagingBaseDriver and not add more \"if\" in this code.","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.notify_client \u003d None"},{"line_number":115,"context_line":"        self.read_client \u003d None"},{"line_number":116,"context_line":"        if messaging:"},{"line_number":117,"context_line":"            self.notify_client \u003d messaging.Notifier("},{"line_number":118,"context_line":"                transport, publisher_id\u003dhost, driver\u003d\"messaging\","},{"line_number":119,"context_line":"                topic\u003d\"profiler\", retry\u003d0)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_a7963eee","line":116,"updated":"2015-12-25 01:00:21.000000000","message":"It\u0027s unclear for me, it\u0027s messaging driver, so what we can have except messaging here?","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.notify_client \u003d None"},{"line_number":115,"context_line":"        self.read_client \u003d None"},{"line_number":116,"context_line":"        if messaging:"},{"line_number":117,"context_line":"            self.notify_client \u003d messaging.Notifier("},{"line_number":118,"context_line":"                transport, publisher_id\u003dhost, driver\u003d\"messaging\","},{"line_number":119,"context_line":"                topic\u003d\"profiler\", retry\u003d0)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_d630d6a0","line":116,"in_reply_to":"1a7b0d38_a7963eee","updated":"2015-12-25 08:17:00.000000000","message":"yeah, its redundant. Will remove","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                             \"like oslo.messaging Messaging object, transport \""},{"line_number":144,"context_line":"                             \"and publisher host.\")"},{"line_number":145,"context_line":"        info[\"project\"] \u003d self.project"},{"line_number":146,"context_line":"        info[\"service\"] \u003d self.service"},{"line_number":147,"context_line":"        self.notify_client.info(context or self.context,"},{"line_number":148,"context_line":"                                \"profiler.%s\" % self.service, info)"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_a79cfec0","line":146,"updated":"2015-12-25 01:00:21.000000000","message":"IMHO setting project \u0026 service to info should be done in profiler initialization. Otherwise we will duplicate this code in each driver.","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"2f0f7e6851a079d441bb067341c4e684e5fa1f4b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                             \"like oslo.messaging Messaging object, transport \""},{"line_number":144,"context_line":"                             \"and publisher host.\")"},{"line_number":145,"context_line":"        info[\"project\"] \u003d self.project"},{"line_number":146,"context_line":"        info[\"service\"] \u003d self.service"},{"line_number":147,"context_line":"        self.notify_client.info(context or self.context,"},{"line_number":148,"context_line":"                                \"profiler.%s\" % self.service, info)"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_944d2640","line":146,"in_reply_to":"1a7b0d38_41df4269","updated":"2015-12-29 02:29:08.000000000","message":"We are at the very last point when we are able to do non backward compatible changes.\n\nThe workflow is next: \n\n  - Put to all stable releases osprofiler \u003c 0.4 requirements \n  - Add driver structure that we want to have no matter is it backward compatible or it is absolutely different \n  - Deprecate old mechanism \n  - Cut release 0.4 \n  - Change all projects to use new driver mechanism \n  - Remove old mechanism \n  - Cut release 0.5 \n  - ....\n  - PROFIT!","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"00a3e6484421c7d486ff813862b20193dfa2652a","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                             \"like oslo.messaging Messaging object, transport \""},{"line_number":144,"context_line":"                             \"and publisher host.\")"},{"line_number":145,"context_line":"        info[\"project\"] \u003d self.project"},{"line_number":146,"context_line":"        info[\"service\"] \u003d self.service"},{"line_number":147,"context_line":"        self.notify_client.info(context or self.context,"},{"line_number":148,"context_line":"                                \"profiler.%s\" % self.service, info)"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_41df4269","line":146,"in_reply_to":"1a7b0d38_a79cfec0","updated":"2015-12-25 08:54:36.000000000","message":"ok, so am I right you want to break backward compatibility with what other services are doing now? right now glance, nova, etc. are using the notifier.create and notifier.set methods, where these arguments are passed. I\u0027m ok with this stuff moving to somewhere more appropriate, but how to do that without breaking everything?","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                \"profiler.%s\" % self.service, info)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"def get_driver(name_or_connection_string, *args, **kwargs):"},{"line_number":152,"context_line":"    \"\"\"Returns instance of driver object."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    :param name_or_connection_string:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_031ce775","line":151,"updated":"2015-12-25 01:00:21.000000000","message":"Just make static method Driver.get instead of having this separately","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":151,"context_line":"def get_driver(name_or_connection_string, *args, **kwargs):"},{"line_number":152,"context_line":"    \"\"\"Returns instance of driver object."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    :param name_or_connection_string:"},{"line_number":155,"context_line":"    \"\"\""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    parsed_connection \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_a7271eb5","line":154,"updated":"2015-12-25 01:00:21.000000000","message":"Let\u0027s force people to use connection string always.\n\nReally there is NO need to allow to get drivers without connection string. Because you always need to provide where is the backend (except one case when you are using messaging)","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"2f0f7e6851a079d441bb067341c4e684e5fa1f4b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"def get_driver(name_or_connection_string, *args, **kwargs):"},{"line_number":152,"context_line":"    \"\"\"Returns instance of driver object."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    :param name_or_connection_string:"},{"line_number":155,"context_line":"    \"\"\""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    parsed_connection \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_7450bad4","line":154,"in_reply_to":"1a7b0d38_16173eee","updated":"2015-12-29 02:29:08.000000000","message":"we don\u0027t need to make it backward compatible","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":151,"context_line":"def get_driver(name_or_connection_string, *args, **kwargs):"},{"line_number":152,"context_line":"    \"\"\"Returns instance of driver object."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    :param name_or_connection_string:"},{"line_number":155,"context_line":"    \"\"\""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    parsed_connection \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_16173eee","line":154,"in_reply_to":"1a7b0d38_a7271eb5","updated":"2015-12-25 08:17:00.000000000","message":"we can force it, but we need to make this backward-compatible. Otherwise all stuff currently working in projects will be simply broken","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            if (backend \u003d\u003d driver.read_backend or"},{"line_number":171,"context_line":"                    backend \u003d\u003d driver.notify_backend):"},{"line_number":172,"context_line":"                return driver(*args, **kwargs)"},{"line_number":173,"context_line":"        elif name_or_connection_string \u003d\u003d driver.__name__:"},{"line_number":174,"context_line":"            return driver(*args, **kwargs)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    raise TypeError(\"There is no driver either with name or \""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_e79446e3","line":173,"updated":"2015-12-25 01:00:21.000000000","message":"do not use driver.__name__ for names of plugins, this makes it impossible to rename plugins without breaking backward compability or copy pasting. call some method driver.get_name() which can be classmethod and return cls.__name__ by default","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            if (backend \u003d\u003d driver.read_backend or"},{"line_number":171,"context_line":"                    backend \u003d\u003d driver.notify_backend):"},{"line_number":172,"context_line":"                return driver(*args, **kwargs)"},{"line_number":173,"context_line":"        elif name_or_connection_string \u003d\u003d driver.__name__:"},{"line_number":174,"context_line":"            return driver(*args, **kwargs)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    raise TypeError(\"There is no driver either with name or \""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_d6d77621","line":173,"in_reply_to":"1a7b0d38_e79446e3","updated":"2015-12-25 08:17:00.000000000","message":"ok","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"0f8544e430afdd22f92bc43301f8114cf4d172ad","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":37,"context_line":"        backend \u003d parsed_connection.scheme"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        # parsed_connection contains only lowercase letters"},{"line_number":40,"context_line":"        # classes start with an uppercase letter"},{"line_number":41,"context_line":"        if backend \u003d\u003d driver.get_name().lower():"},{"line_number":42,"context_line":"            return driver(*args, **kwargs)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    raise TypeError(\"There is no driver connection string specified to: \""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a061dce_a625a1c3","line":41,"range":{"start_line":39,"start_character":0,"end_line":41,"end_character":48},"updated":"2016-04-04 16:03:55.000000000","message":"remove lower(), get_name returns lowercase","commit_id":"f2285885a7e165f6122263249945f6266083b860"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_5a9c8969","line":1,"updated":"2016-05-05 22:33:40.000000000","message":"You may want to update the year.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_7c87a90f","line":1,"in_reply_to":"dab17558_5a9c8969","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        LOG.debug(\"String %s looks like a connection string, trying it.\","},{"line_number":33,"context_line":"                  connection_string)"},{"line_number":34,"context_line":"    except ValueError:"},{"line_number":35,"context_line":"        raise ValueError(\"String %s cannot be interpreted as a connection \""},{"line_number":36,"context_line":"                         \"string.\" % connection_string)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    for driver in _utils.itersubclasses(Driver):"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_1ac7a146","line":35,"updated":"2016-05-05 22:33:40.000000000","message":"I think we should raise the original exception as it contains a better exception message, so we can remove the try..except.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        LOG.debug(\"String %s looks like a connection string, trying it.\","},{"line_number":33,"context_line":"                  connection_string)"},{"line_number":34,"context_line":"    except ValueError:"},{"line_number":35,"context_line":"        raise ValueError(\"String %s cannot be interpreted as a connection \""},{"line_number":36,"context_line":"                         \"string.\" % connection_string)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    for driver in _utils.itersubclasses(Driver):"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_dc7cd522","line":35,"in_reply_to":"dab17558_1ac7a146","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":42,"context_line":"            return driver(connection_string, *args, **kwargs)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    raise TypeError(\"There is no driver connection string specified to: \""},{"line_number":45,"context_line":"                    \"%s\" % connection_string)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_ba7815fa","line":44,"updated":"2016-05-05 22:33:40.000000000","message":"This should be ValueError.\n\nAlso, we can change the message to \n\"Driver not found for connection string %s\"","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":42,"context_line":"            return driver(connection_string, *args, **kwargs)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    raise TypeError(\"There is no driver connection string specified to: \""},{"line_number":45,"context_line":"                    \"%s\" % connection_string)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_bc791132","line":44,"in_reply_to":"dab17558_ba7815fa","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.finished_at \u003d 0"},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            self.parsed_url \u003d _utils.parse_url(self.connection_str)"},{"line_number":59,"context_line":"        except ValueError:"},{"line_number":60,"context_line":"            self.parsed_url \u003d self.connection_str"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def notify(self, info, **kwargs):"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_fa3a9de6","line":59,"updated":"2016-05-05 22:33:40.000000000","message":"The fact that we instantiated the driver indicates that the url parsing was successful in line 31, so this try..except is not necessary.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.finished_at \u003d 0"},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            self.parsed_url \u003d _utils.parse_url(self.connection_str)"},{"line_number":59,"context_line":"        except ValueError:"},{"line_number":60,"context_line":"            self.parsed_url \u003d self.connection_str"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def notify(self, info, **kwargs):"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_1c777d3b","line":59,"in_reply_to":"dab17558_fa3a9de6","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        except ValueError:"},{"line_number":60,"context_line":"            self.parsed_url \u003d self.connection_str"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def notify(self, info, **kwargs):"},{"line_number":63,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        To add new drivers you should, create new subclass of this class and"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_7a2fcda1","line":62,"updated":"2016-05-05 22:33:40.000000000","message":"We can raise a NotImplemented for all methods in this class to be implemented by the subclasses.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        except ValueError:"},{"line_number":60,"context_line":"            self.parsed_url \u003d self.connection_str"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def notify(self, info, **kwargs):"},{"line_number":63,"context_line":"        \"\"\"This method will be called on each notifier.notify() call."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        To add new drivers you should, create new subclass of this class and"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_fc73994b","line":62,"in_reply_to":"dab17558_7a2fcda1","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                      \"base_id\" - uuid that is common for all notifications"},{"line_number":71,"context_line":"                                  related to one trace. Used to simplify"},{"line_number":72,"context_line":"                                  retrieving of all trace elements from"},{"line_number":73,"context_line":"                                  Ceilometer."},{"line_number":74,"context_line":"                      \"parent_id\" - uuid of parent element in trace"},{"line_number":75,"context_line":"                      \"trace_id\" - uuid of current element in trace"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_5a03e90f","line":73,"updated":"2016-05-05 22:33:40.000000000","message":"Ceilometer -\u003e the backend.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                      \"base_id\" - uuid that is common for all notifications"},{"line_number":71,"context_line":"                                  related to one trace. Used to simplify"},{"line_number":72,"context_line":"                                  retrieving of all trace elements from"},{"line_number":73,"context_line":"                                  Ceilometer."},{"line_number":74,"context_line":"                      \"parent_id\" - uuid of parent element in trace"},{"line_number":75,"context_line":"                      \"trace_id\" - uuid of current element in trace"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_9c99ad71","line":73,"in_reply_to":"dab17558_5a03e90f","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        :param name: name of operation"},{"line_number":131,"context_line":"        :param project: project name"},{"line_number":132,"context_line":"        :param service: service name"},{"line_number":133,"context_line":"        :param host: host name ot FQDN"},{"line_number":134,"context_line":"        :param timestamp: Unicode-style timestamp matching the pattern"},{"line_number":135,"context_line":"                          \"%Y-%m-%dT%H:%M:%S.%f\" , e.g. 2016-04-18T17:42:10.77"},{"line_number":136,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_25ac06ed","line":133,"range":{"start_line":133,"start_character":31,"end_line":133,"end_character":33},"updated":"2016-05-05 22:33:40.000000000","message":"or","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        :param name: name of operation"},{"line_number":131,"context_line":"        :param project: project name"},{"line_number":132,"context_line":"        :param service: service name"},{"line_number":133,"context_line":"        :param host: host name ot FQDN"},{"line_number":134,"context_line":"        :param timestamp: Unicode-style timestamp matching the pattern"},{"line_number":135,"context_line":"                          \"%Y-%m-%dT%H:%M:%S.%f\" , e.g. 2016-04-18T17:42:10.77"},{"line_number":136,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_bca0f191","line":133,"range":{"start_line":133,"start_character":31,"end_line":133,"end_character":33},"in_reply_to":"dab17558_25ac06ed","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            return int(microsec / 1000.0)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        for r in self.result.values():"},{"line_number":179,"context_line":"            # NOTE(boris-42): We are not able to guarantee that ceilometer"},{"line_number":180,"context_line":"            # consumed all messages \u003d\u003e so we should at make duration 0ms."},{"line_number":181,"context_line":"            if \"started\" not in r[\"info\"]:"},{"line_number":182,"context_line":"                r[\"info\"][\"started\"] \u003d r[\"info\"][\"finished\"]"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_658d6e7b","line":179,"range":{"start_line":179,"start_character":64,"end_line":179,"end_character":74},"updated":"2016-05-05 22:33:40.000000000","message":"backend","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            return int(microsec / 1000.0)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        for r in self.result.values():"},{"line_number":179,"context_line":"            # NOTE(boris-42): We are not able to guarantee that ceilometer"},{"line_number":180,"context_line":"            # consumed all messages \u003d\u003e so we should at make duration 0ms."},{"line_number":181,"context_line":"            if \"started\" not in r[\"info\"]:"},{"line_number":182,"context_line":"                r[\"info\"][\"started\"] \u003d r[\"info\"][\"finished\"]"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_fcaa796f","line":179,"range":{"start_line":179,"start_character":64,"end_line":179,"end_character":74},"in_reply_to":"dab17558_658d6e7b","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"              connection_string)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":36,"context_line":"        backend \u003d parsed_connection.scheme"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":39,"context_line":"            return driver(connection_string, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_08e03728","line":36,"updated":"2016-05-17 06:36:34.000000000","message":"We can move this outside the loop.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"              connection_string)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":36,"context_line":"        backend \u003d parsed_connection.scheme"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":39,"context_line":"            return driver(connection_string, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_b4b616da","line":36,"in_reply_to":"dab17558_08e03728","updated":"2016-05-19 10:53:47.000000000","message":"+1 to Vipin","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"              connection_string)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":36,"context_line":"        backend \u003d parsed_connection.scheme"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":39,"context_line":"            return driver(connection_string, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_ca27ab62","line":36,"in_reply_to":"dab17558_08e03728","updated":"2016-05-19 15:16:33.000000000","message":"Done","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":36,"context_line":"        backend \u003d parsed_connection.scheme"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":39,"context_line":"            return driver(connection_string, *args, **kwargs)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    raise ValueError(\"Driver not found for connection string: \""}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_f31de80f","line":38,"updated":"2016-05-17 06:36:34.000000000","message":"We may need to do ignore the case or change the messaging driver name. The existing OS services specify \"Messaging\" as the plugin name.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":36,"context_line":"        backend \u003d parsed_connection.scheme"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":39,"context_line":"            return driver(connection_string, *args, **kwargs)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    raise ValueError(\"Driver not found for connection string: \""}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_6ad79f23","line":38,"in_reply_to":"bab6814e_74f30e9f","updated":"2016-05-19 15:16:33.000000000","message":"there had been .lower() in my previous patch sets, but it\u0027s not needed. utils.parse_url already returns lowercase.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":36,"context_line":"        backend \u003d parsed_connection.scheme"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":39,"context_line":"            return driver(connection_string, *args, **kwargs)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    raise ValueError(\"Driver not found for connection string: \""}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_74f30e9f","line":38,"in_reply_to":"dab17558_f31de80f","updated":"2016-05-19 10:53:47.000000000","message":"Yes, please use .lower() to ignore make this check case insensitive. Having two plugins like \"Bla\" and \"bla\" won\u0027t be good idea anyway.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                     \"%s\" % connection_string)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class Driver(object):"},{"line_number":46,"context_line":"    def __init__(self, connection_str, project\u003dNone, service\u003dNone, host\u003dNone):"},{"line_number":47,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":48,"context_line":"        self.project \u003d project"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_54452ab1","line":45,"updated":"2016-05-19 10:53:47.000000000","message":"please specify extended doctoring for this class. Like what this object is supposed to do, etc. This is an important model object in OSprofiler arch, it requires good explanation around.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                     \"%s\" % connection_string)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class Driver(object):"},{"line_number":46,"context_line":"    def __init__(self, connection_str, project\u003dNone, service\u003dNone, host\u003dNone):"},{"line_number":47,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":48,"context_line":"        self.project \u003d project"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_cd7d0570","line":45,"in_reply_to":"bab6814e_54452ab1","updated":"2016-05-19 15:16:33.000000000","message":"Done","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"       Tree building works in O(n*log(n))."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"       :param nodes: list of nodes, where each node is a dictionary with fields"},{"line_number":98,"context_line":"                     \"parent_id\", \"trace_id\", \"info\""},{"line_number":99,"context_line":"       :returns: list of top level (\"root\") nodes in form of dictionaries,"},{"line_number":100,"context_line":"                 each containing the \"info\" and \"children\" fields, where"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_e8f5f382","line":97,"range":{"start_line":97,"start_character":21,"end_line":97,"end_character":34},"updated":"2016-05-17 06:36:34.000000000","message":"Is it a list or dict? See line 108.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"       Tree building works in O(n*log(n))."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"       :param nodes: list of nodes, where each node is a dictionary with fields"},{"line_number":98,"context_line":"                     \"parent_id\", \"trace_id\", \"info\""},{"line_number":99,"context_line":"       :returns: list of top level (\"root\") nodes in form of dictionaries,"},{"line_number":100,"context_line":"                 each containing the \"info\" and \"children\" fields, where"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_ad1081a9","line":97,"range":{"start_line":97,"start_character":21,"end_line":97,"end_character":34},"in_reply_to":"dab17558_e8f5f382","updated":"2016-05-19 15:16:33.000000000","message":"Done","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                tree.append(node)  # no parent \u003d\u003e top-level node"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        for node in nodes:"},{"line_number":118,"context_line":"            nodes[node][\"children\"].sort(key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_a80dab90","line":117,"range":{"start_line":117,"start_character":12,"end_line":117,"end_character":16},"updated":"2016-05-17 06:36:34.000000000","message":"node -\u003e trace_id?","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                tree.append(node)  # no parent \u003d\u003e top-level node"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        for node in nodes:"},{"line_number":118,"context_line":"            nodes[node][\"children\"].sort(key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_f3c0a67e","line":117,"range":{"start_line":117,"start_character":12,"end_line":117,"end_character":16},"in_reply_to":"bab6814e_14fe0238","updated":"2016-05-19 15:16:33.000000000","message":"Vipin, Done.\n\nDina, I think that we have to fill out the list of children before sorting it. Seems to be more reasonable, as for me. Sure, we can move this operation under the previous loop, but this will make the code more tangled. But if you think it\u0027s a better solution, then I\u0027ll do it.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                tree.append(node)  # no parent \u003d\u003e top-level node"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        for node in nodes:"},{"line_number":118,"context_line":"            nodes[node][\"children\"].sort(key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_14fe0238","line":117,"range":{"start_line":117,"start_character":12,"end_line":117,"end_character":16},"in_reply_to":"dab17558_a80dab90","updated":"2016-05-19 10:53:47.000000000","message":"it\u0027s a question of naming, although I\u0027ll love trace_id as well. BTW can\u0027t we move this loop operation under previous loop?","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def results_append(self, trace_id, parent_id, name, project, service, host,"},{"line_number":123,"context_line":"                       timestamp, raw_payload\u003dNone):"},{"line_number":124,"context_line":"        \"\"\"Appends the notification to the dictionary of notifications."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_b463b619","line":122,"updated":"2016-05-19 10:53:47.000000000","message":"shouldn\u0027t this be a private method? Starting with \"_\" - as I suppose public methods will be only notify(), get_report() and get_name()","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def results_append(self, trace_id, parent_id, name, project, service, host,"},{"line_number":123,"context_line":"                       timestamp, raw_payload\u003dNone):"},{"line_number":124,"context_line":"        \"\"\"Appends the notification to the dictionary of notifications."},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_f347061b","line":122,"in_reply_to":"bab6814e_b463b619","updated":"2016-05-19 15:16:33.000000000","message":"Done","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :param host: host name or FQDN"},{"line_number":132,"context_line":"        :param timestamp: Unicode-style timestamp matching the pattern"},{"line_number":133,"context_line":"                          \"%Y-%m-%dT%H:%M:%S.%f\" , e.g. 2016-04-18T17:42:10.77"},{"line_number":134,"context_line":"        \"\"\""},{"line_number":135,"context_line":"        timestamp \u003d datetime.datetime.strptime(timestamp,"},{"line_number":136,"context_line":"                                               \"%Y-%m-%dT%H:%M:%S.%f\")"},{"line_number":137,"context_line":"        if trace_id not in self.result:"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_c8e62faf","line":134,"updated":"2016-05-17 06:36:34.000000000","message":"raw_payload is missing","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :param host: host name or FQDN"},{"line_number":132,"context_line":"        :param timestamp: Unicode-style timestamp matching the pattern"},{"line_number":133,"context_line":"                          \"%Y-%m-%dT%H:%M:%S.%f\" , e.g. 2016-04-18T17:42:10.77"},{"line_number":134,"context_line":"        \"\"\""},{"line_number":135,"context_line":"        timestamp \u003d datetime.datetime.strptime(timestamp,"},{"line_number":136,"context_line":"                                               \"%Y-%m-%dT%H:%M:%S.%f\")"},{"line_number":137,"context_line":"        if trace_id not in self.result:"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_f31c2615","line":134,"in_reply_to":"dab17558_c8e62faf","updated":"2016-05-19 15:16:33.000000000","message":"Done","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        if not self.finished_at or self.finished_at \u003c timestamp:"},{"line_number":161,"context_line":"            self.finished_at \u003d timestamp"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def parse_results(self):"},{"line_number":164,"context_line":"        \"\"\"Parses Driver\u0027s notifications placed by results_append() ."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        :returns: full profiling report"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_7482ee95","line":163,"updated":"2016-05-19 10:53:47.000000000","message":"ditto my previous comment regarding primate method naming scheme","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        if not self.finished_at or self.finished_at \u003c timestamp:"},{"line_number":161,"context_line":"            self.finished_at \u003d timestamp"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def parse_results(self):"},{"line_number":164,"context_line":"        \"\"\"Parses Driver\u0027s notifications placed by results_append() ."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        :returns: full profiling report"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_93d4ba20","line":163,"in_reply_to":"bab6814e_7482ee95","updated":"2016-05-19 15:16:33.000000000","message":"Done","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6cc10c602907a3711f124f07d5c2202ecc107a00","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    This class provides protected common methods that"},{"line_number":48,"context_line":"    do not rely on a specific storage backend. Public methods notify() and/or"},{"line_number":49,"context_line":"    get_report(), which require using storage backend API, must be overriden"},{"line_number":50,"context_line":"    and implemented by any class derived from this class."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"bab6814e_44ca1c1c","line":49,"range":{"start_line":49,"start_character":67,"end_line":49,"end_character":76},"updated":"2016-05-23 08:20:19.000000000","message":"nit: overridden","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"29787484422003823bd534d2e31c6e435d9f5c9d","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    This class provides protected common methods that"},{"line_number":48,"context_line":"    do not rely on a specific storage backend. Public methods notify() and/or"},{"line_number":49,"context_line":"    get_report(), which require using storage backend API, must be overriden"},{"line_number":50,"context_line":"    and implemented by any class derived from this class."},{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_579a586f","line":49,"range":{"start_line":49,"start_character":67,"end_line":49,"end_character":76},"in_reply_to":"bab6814e_44ca1c1c","updated":"2016-06-10 14:37:25.000000000","message":"Done","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6cc10c602907a3711f124f07d5c2202ecc107a00","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, connection_str, project\u003dNone, service\u003dNone, host\u003dNone):"},{"line_number":54,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":55,"context_line":"        self.project \u003d project"},{"line_number":56,"context_line":"        self.service \u003d service"},{"line_number":57,"context_line":"        self.host \u003d host"}],"source_content_type":"text/x-python","patch_set":36,"id":"bab6814e_44669c2a","line":54,"updated":"2016-05-23 08:20:19.000000000","message":"This can never be None due to the validation in get_driver.","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"29787484422003823bd534d2e31c6e435d9f5c9d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, connection_str, project\u003dNone, service\u003dNone, host\u003dNone):"},{"line_number":54,"context_line":"        self.connection_str \u003d connection_str or \"\""},{"line_number":55,"context_line":"        self.project \u003d project"},{"line_number":56,"context_line":"        self.service \u003d service"},{"line_number":57,"context_line":"        self.host \u003d host"}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_978a0019","line":54,"in_reply_to":"bab6814e_44669c2a","updated":"2016-06-10 14:37:25.000000000","message":"Done","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6cc10c602907a3711f124f07d5c2202ecc107a00","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        raise NotImplementedError(\"This method is either not supported \""},{"line_number":83,"context_line":"                                  \"or has to be overriden\")"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def get_report(self, base_id):"},{"line_number":86,"context_line":"        \"\"\"Forms and returns report composed from the stored notifications."}],"source_content_type":"text/x-python","patch_set":36,"id":"bab6814e_a40ae823","line":83,"range":{"start_line":83,"start_character":48,"end_line":83,"end_character":57},"updated":"2016-05-23 08:20:19.000000000","message":"overridden","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"29787484422003823bd534d2e31c6e435d9f5c9d","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        raise NotImplementedError(\"This method is either not supported \""},{"line_number":83,"context_line":"                                  \"or has to be overriden\")"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def get_report(self, base_id):"},{"line_number":86,"context_line":"        \"\"\"Forms and returns report composed from the stored notifications."}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_f781c4fc","line":83,"range":{"start_line":83,"start_character":48,"end_line":83,"end_character":57},"in_reply_to":"bab6814e_a40ae823","updated":"2016-06-10 14:37:25.000000000","message":"Done","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6cc10c602907a3711f124f07d5c2202ecc107a00","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        :param base_id: Base id of trace elements."},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        raise NotImplementedError(\"This method is either not supported \""},{"line_number":91,"context_line":"                                  \"or has to be overriden\")"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @classmethod"},{"line_number":94,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":36,"id":"bab6814e_1f05fd0f","line":91,"range":{"start_line":91,"start_character":48,"end_line":91,"end_character":57},"updated":"2016-05-23 08:20:19.000000000","message":"overridden","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"29787484422003823bd534d2e31c6e435d9f5c9d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        :param base_id: Base id of trace elements."},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        raise NotImplementedError(\"This method is either not supported \""},{"line_number":91,"context_line":"                                  \"or has to be overriden\")"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @classmethod"},{"line_number":94,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_d784880c","line":91,"range":{"start_line":91,"start_character":48,"end_line":91,"end_character":57},"in_reply_to":"bab6814e_1f05fd0f","updated":"2016-06-10 14:37:25.000000000","message":"Done","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6cc10c602907a3711f124f07d5c2202ecc107a00","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def _results_append(self, trace_id, parent_id, name, project, service,"},{"line_number":131,"context_line":"                        host, timestamp, raw_payload\u003dNone):"},{"line_number":132,"context_line":"        \"\"\"Appends the notification to the dictionary of notifications."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"bab6814e_5f5ae5f2","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":23},"updated":"2016-05-23 08:20:19.000000000","message":"A better name would be _append_results","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"29787484422003823bd534d2e31c6e435d9f5c9d","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        return sorted(tree, key\u003dlambda x: x[\"info\"][\"started\"])"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def _results_append(self, trace_id, parent_id, name, project, service,"},{"line_number":131,"context_line":"                        host, timestamp, raw_payload\u003dNone):"},{"line_number":132,"context_line":"        \"\"\"Appends the notification to the dictionary of notifications."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_1777303c","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":23},"in_reply_to":"bab6814e_5f5ae5f2","updated":"2016-06-10 14:37:25.000000000","message":"Agree.","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6cc10c602907a3711f124f07d5c2202ecc107a00","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self.finished_at \u003d timestamp"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _parse_results(self):"},{"line_number":174,"context_line":"        \"\"\"Parses Driver\u0027s notifications placed by results_append() ."},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        :returns: full profiling report"},{"line_number":177,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"bab6814e_df4ff531","line":174,"range":{"start_line":174,"start_character":51,"end_line":174,"end_character":65},"updated":"2016-05-23 08:20:19.000000000","message":"_results_append()","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"29787484422003823bd534d2e31c6e435d9f5c9d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self.finished_at \u003d timestamp"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def _parse_results(self):"},{"line_number":174,"context_line":"        \"\"\"Parses Driver\u0027s notifications placed by results_append() ."},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        :returns: full profiling report"},{"line_number":177,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_5771b843","line":174,"range":{"start_line":174,"start_character":51,"end_line":174,"end_character":65},"in_reply_to":"bab6814e_df4ff531","updated":"2016-06-10 14:37:25.000000000","message":"Done","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"2eab8c3723e41e4f4a18b818f93d09e0e44ab76a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        raise NotImplementedError(\"{0}: This method is either not supported \""},{"line_number":105,"context_line":"                                  \"or has to be overridden\".format("},{"line_number":106,"context_line":"                                      self.get_name()))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @staticmethod"},{"line_number":109,"context_line":"    def _build_tree(nodes):"}],"source_content_type":"text/x-python","patch_set":38,"id":"3aaa91ec_1a08d72b","line":106,"range":{"start_line":106,"start_character":38,"end_line":106,"end_character":53},"updated":"2016-06-23 11:00:05.000000000","message":"We do not print the driver name in other places. See get_report and notify.","commit_id":"ae6ec97ba0c827ad94a31a78e4015157d9c42e8a"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"459f2bfb518c040b51ffe1235121ea30bd1ff09c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        raise NotImplementedError(\"{0}: This method is either not supported \""},{"line_number":105,"context_line":"                                  \"or has to be overridden\".format("},{"line_number":106,"context_line":"                                      self.get_name()))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @staticmethod"},{"line_number":109,"context_line":"    def _build_tree(nodes):"}],"source_content_type":"text/x-python","patch_set":38,"id":"3aaa91ec_5d89b925","line":106,"range":{"start_line":106,"start_character":38,"end_line":106,"end_character":53},"in_reply_to":"3aaa91ec_1a08d72b","updated":"2016-06-23 11:06:51.000000000","message":"probably it\u0027ll be better to print it in these methods as well. to see what driver exactly is not supporting the method","commit_id":"ae6ec97ba0c827ad94a31a78e4015157d9c42e8a"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"17e31ede9831a4f707313593ebefd64e83c0b910","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        raise NotImplementedError(\"{0}: This method is either not supported \""},{"line_number":105,"context_line":"                                  \"or has to be overridden\".format("},{"line_number":106,"context_line":"                                      self.get_name()))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @staticmethod"},{"line_number":109,"context_line":"    def _build_tree(nodes):"}],"source_content_type":"text/x-python","patch_set":38,"id":"3aaa91ec_bd5a5d4e","line":106,"range":{"start_line":106,"start_character":38,"end_line":106,"end_character":53},"in_reply_to":"3aaa91ec_5d89b925","updated":"2016-06-23 11:14:35.000000000","message":"I think it will be clear from the stack trace.","commit_id":"ae6ec97ba0c827ad94a31a78e4015157d9c42e8a"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"29bd372a9693def05542612928509ba802edb521","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.service \u003d service"},{"line_number":57,"context_line":"        self.host \u003d host"},{"line_number":58,"context_line":"        self.result \u003d {}"},{"line_number":59,"context_line":"        self.started_at \u003d 0"},{"line_number":60,"context_line":"        self.finished_at \u003d 0"},{"line_number":61,"context_line":"        self.parsed_url \u003d _utils.parse_url(self.connection_str)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_446b201e","line":59,"updated":"2016-06-27 09:19:47.000000000","message":"in the further code started_at is of type datetype; it\u0027s misleading to initialize it with 0, better assign None","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"29bd372a9693def05542612928509ba802edb521","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.host \u003d host"},{"line_number":58,"context_line":"        self.result \u003d {}"},{"line_number":59,"context_line":"        self.started_at \u003d 0"},{"line_number":60,"context_line":"        self.finished_at \u003d 0"},{"line_number":61,"context_line":"        self.parsed_url \u003d _utils.parse_url(self.connection_str)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def notify(self, info, **kwargs):"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_8471880e","line":60,"updated":"2016-06-27 09:19:47.000000000","message":"ditto","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"29bd372a9693def05542612928509ba802edb521","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        for r in self.result.values():"},{"line_number":199,"context_line":"            # NOTE(boris-42): We are not able to guarantee that the backend"},{"line_number":200,"context_line":"            # consumed all messages \u003d\u003e so we should at make duration 0ms."},{"line_number":201,"context_line":"            if \"started\" not in r[\"info\"]:"},{"line_number":202,"context_line":"                r[\"info\"][\"started\"] \u003d r[\"info\"][\"finished\"]"},{"line_number":203,"context_line":"            if \"finished\" not in r[\"info\"]:"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_5fb2c94c","line":200,"updated":"2016-06-27 09:19:47.000000000","message":"users will trust the statistics - if part of data is lost the record should be marked as partial, but with the following code it will contain 0s","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"133c08ca847bc3efbda1644f6b0da27bdaa65ab4","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                r[\"info\"][\"finished\"] \u003d r[\"info\"][\"started\"]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"            r[\"info\"][\"started\"] \u003d msec(r[\"info\"][\"started\"] - self.started_at)"},{"line_number":207,"context_line":"            r[\"info\"][\"finished\"] \u003d msec(r[\"info\"][\"finished\"] -"},{"line_number":208,"context_line":"                                         self.started_at)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_51fbdd78","line":207,"updated":"2016-06-27 09:46:32.000000000","message":"pls keep on one line","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"973bf0114b2f41f6da0104071d07ab0cdc9989fd","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                r[\"info\"][\"finished\"] \u003d r[\"info\"][\"started\"]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"            r[\"info\"][\"started\"] \u003d msec(r[\"info\"][\"started\"] - self.started_at)"},{"line_number":207,"context_line":"            r[\"info\"][\"finished\"] \u003d msec(r[\"info\"][\"finished\"] -"},{"line_number":208,"context_line":"                                         self.started_at)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_9c7af522","line":207,"in_reply_to":"3aaa91ec_51fbdd78","updated":"2016-06-29 12:03:33.000000000","message":"E501 line too long","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"cb4d26163b8ee218b4e1b76c30a8a5bcb87c8b7c","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                r[\"info\"][\"finished\"] \u003d r[\"info\"][\"started\"]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"            r[\"info\"][\"started\"] \u003d msec(r[\"info\"][\"started\"] - self.started_at)"},{"line_number":207,"context_line":"            r[\"info\"][\"finished\"] \u003d msec(r[\"info\"][\"finished\"] -"},{"line_number":208,"context_line":"                                         self.started_at)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_e1c51e5c","line":207,"in_reply_to":"3aaa91ec_9c7af522","updated":"2016-06-30 09:51:30.000000000","message":"yep, sorry for misleading you","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"133c08ca847bc3efbda1644f6b0da27bdaa65ab4","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                \"name\": \"total\","},{"line_number":213,"context_line":"                \"started\": 0,"},{"line_number":214,"context_line":"                \"finished\": msec(self.finished_at -"},{"line_number":215,"context_line":"                                 self.started_at) if self.started_at else 0"},{"line_number":216,"context_line":"            },"},{"line_number":217,"context_line":"            \"children\": self._build_tree(self.result)"},{"line_number":218,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_7171b90b","line":215,"updated":"2016-06-27 09:46:32.000000000","message":"if self.started_at is 0 it means that no results were collected at all - it\u0027s better to separate this case from a case when the execution was completed with msec.","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"f8617b75ae07fad25f89ee10d52376679cd85329","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    LOG.debug(\"String %s looks like a connection string, trying it.\","},{"line_number":33,"context_line":"              connection_string)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    backend \u003d parsed_connection.scheme"},{"line_number":36,"context_line":"    for driver in _utils.itersubclasses(Driver):"},{"line_number":37,"context_line":"        if backend \u003d\u003d driver.get_name():"},{"line_number":38,"context_line":"            return driver(connection_string, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":40,"id":"3aaa91ec_c100e204","line":35,"updated":"2016-06-30 10:21:53.000000000","message":"it\u0027s better to raise exception here when `backend` is empty instead of introducing a new function _utils.parse_url(); 2 reasons:\n 1) contract of parse_url() is not obvious - it does not only parse, but also verifies constraint\n 2) parse_url() is used in 2 places - here and in Driver(), but Driver() is always built by get_driver() function","commit_id":"47dc9c63bcaafbf58c4d03ecf3148d875052b825"}],"osprofiler/drivers/ceilometer.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"97f10c6d85adc18a321856e2acc9e1011c2a46a1","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                if k[\"name\"] not in skip_keys:"},{"line_number":100,"context_line":"                    result[trace_id][\"info\"][\"meta.%s\" % k[\"name\"]] \u003d \\"},{"line_number":101,"context_line":"                        k[\"value\"]"},{"line_number":102,"context_line":"            try:"},{"line_number":103,"context_line":"                timestamp \u003d datetime.datetime.strptime(n[\"generated\"],"},{"line_number":104,"context_line":"                                                       \"%Y-%m-%dT%H:%M:%S.%f\")"},{"line_number":105,"context_line":"            except ValueError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_e0b83513","line":102,"updated":"2015-11-19 18:11:59.000000000","message":"Any idea why we aren\u0027t just using just regular iso8601 parsing and such??\n\nhttps://github.com/openstack/oslo.utils/blob/master/oslo_utils/timeutils.py#L61 and equivalents...","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"61dfeb13a333330ccb82a1903771b2b366cb6464","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                if k[\"name\"] not in skip_keys:"},{"line_number":100,"context_line":"                    result[trace_id][\"info\"][\"meta.%s\" % k[\"name\"]] \u003d \\"},{"line_number":101,"context_line":"                        k[\"value\"]"},{"line_number":102,"context_line":"            try:"},{"line_number":103,"context_line":"                timestamp \u003d datetime.datetime.strptime(n[\"generated\"],"},{"line_number":104,"context_line":"                                                       \"%Y-%m-%dT%H:%M:%S.%f\")"},{"line_number":105,"context_line":"            except ValueError:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_90db944f","line":102,"in_reply_to":"ba8a016a_e0b83513","updated":"2015-11-20 10:15:47.000000000","message":"no idea, I just moved parts of old code here :) I suppose Boris initially did not want to depend on the slo.utils just because of datetime.datetime.strptime :)","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a765215d251a6aa19afc37a7f5301322d233627d","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                finished_at \u003d timestamp"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        def msec(dt):"},{"line_number":121,"context_line":"            # NOTE(boris-42): Unfortunately this is the simplest way that works"},{"line_number":122,"context_line":"            #                 in py26 and py27"},{"line_number":123,"context_line":"            microsec \u003d ("},{"line_number":124,"context_line":"                dt.microseconds + (dt.seconds + dt.days * 24 * 3600) * 1e6)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_20395dd7","line":121,"updated":"2015-11-19 18:09:06.000000000","message":"Does oslo.utils.timeutils have anything for this?\n\nIf not it seems like it should...\n\nAlso are we still supporting py26, do we want to change that?","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"61dfeb13a333330ccb82a1903771b2b366cb6464","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                finished_at \u003d timestamp"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        def msec(dt):"},{"line_number":121,"context_line":"            # NOTE(boris-42): Unfortunately this is the simplest way that works"},{"line_number":122,"context_line":"            #                 in py26 and py27"},{"line_number":123,"context_line":"            microsec \u003d ("},{"line_number":124,"context_line":"                dt.microseconds + (dt.seconds + dt.days * 24 * 3600) * 1e6)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_90a95493","line":121,"in_reply_to":"ba8a016a_20395dd7","updated":"2015-11-20 10:15:47.000000000","message":"Again, I suppose that\u0027s the results of the fact osprofiler is quite old initiative in fact. I think we should not support py26 now and I need to check timeutils, yep","commit_id":"9b11968b8365d7daea59a8f68cb358754e5d1be6"}],"osprofiler/drivers/messaging.py":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_a5ed9627","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2016-05-05 22:33:40.000000000","message":"2016","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_9cb08ddf","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"dab17558_a5ed9627","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_28009b01","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"updated":"2016-05-17 06:36:34.000000000","message":"Is messaging a driver because it doesn\u0027t have a corresponding backend like the MongoDB driver. This is only a means to send notifications to Ceilometer. Why can\u0027t we move the notify implementation here to the ceilometer driver?\n\nAlso see workitems section, bullet 2 in https://review.openstack.org/#/c/247005/35/doc/specs/in-progress/multi_backend_support.rst","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"108166049217eaa60f91df9eb4acc9f936b98ed9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"7aa08908_7b931601","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"in_reply_to":"7aa08908_3ad173fc","updated":"2016-06-16 07:52:05.000000000","message":"I agree with your point regarding dealing with two connection strings if we inherit the ceilometer driver from the messaging driver. But I don\u0027t understand why we need to move get_report from ceilometer driver to messaging driver.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"34fecd9030ea5612f182e44cf2fb0bf4f391963a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_af5a794e","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"in_reply_to":"bab6814e_19efdd1e","updated":"2016-05-24 11:11:48.000000000","message":"one more moment is that currently services that use OSprofiler set only messaging-related arguments to the profiler initialisation. If we\u0027ll make Messaging driver as abstract right now (with no get_name modified), we\u0027ll break the backward compatibility we need to keep for at least 1 year.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"5becec54a74c9a1e98b2c44edec4c1f99d79b8ed","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_19efdd1e","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"in_reply_to":"bab6814e_6fe85b11","updated":"2016-05-23 07:06:10.000000000","message":"Dina, I agree with your point that there may be drivers which publish data to their backend using the message broker. But this messaging driver is not stand-alone and should be abstract. The drivers which use the message broker (for e.g. the Ceilometer driver) can inherit from this messaging driver. For the Ceilometer driver, it doesn\u0027t have to override get_name to ensure backward compatibility. Comments?","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"1c4be87a74bcbe7ff3c05fd7773112614b07512d","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_b2f49c87","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"in_reply_to":"bab6814e_928198fe","updated":"2016-05-24 11:25:57.000000000","message":"hm, probably I may be wrong - Alexey, please check this moment.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"44fe85f53c1d2b65645c6359e82765fbe851dfd7","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_928198fe","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"in_reply_to":"bab6814e_af5a794e","updated":"2016-05-24 11:23:16.000000000","message":"I\u0027m not sure whether I understand your point. This change in hierarchy will not affect the OpenStack services. To ensure backward compatibility, we can add a check in get_driver to return the Ceilometer driver if the scheme is \u0027Messaging\u0027. We already have code to add the suffix to \u0027://\u0027 to ensure backward compatibility. We can remove this special logic once we update the openstack services to use the new driver framework.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"6358df5338d2b8842f8e73b0a256417b4564de08","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"7aa08908_3ad173fc","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"in_reply_to":"bab6814e_b2f49c87","updated":"2016-06-10 14:37:39.000000000","message":"I agree with you Vipin, but it\u0027s gonna stay like that for some time.\n\nSee ceilometer.py L21.\n    def __init__(self, connection_str, **kwargs):\n\nif we use get_report from ceilometer driver, then we\u0027ll have to provide all the arguments needed to create a Messaging driver. This is terrible. After all openstack services switch to kwargs, I\u0027ll move get_report from ceilometer driver to messaging. So that will be done in the next version.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from osprofiler.drivers import base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Messaging(base.Driver):"},{"line_number":20,"context_line":"    def __init__(self, connection_str, messaging\u003dNone, context\u003dNone,"},{"line_number":21,"context_line":"                 transport\u003dNone, project\u003dNone, service\u003dNone,"},{"line_number":22,"context_line":"                 host\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_6fe85b11","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":15},"in_reply_to":"dab17558_28009b01","updated":"2016-05-19 10:53:47.000000000","message":"I guess because in common case drivers might contain only notify or report - just in case similar to the situation we\u0027re sending notifications to one backend (queue) and getting report from other (Ceilometer, for instance). It may be more drivers that are listening to the queue like Ceilometer - so we\u0027ll be still notifying the queue, but getting report from something else.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                        current active user and tenant."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        if not self.client:"},{"line_number":59,"context_line":"            raise ValueError(\"To use driver\u0027s notification capability you \""},{"line_number":60,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":61,"context_line":"                             \"like oslo.messaging Messaging object, transport \""}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_b37d206f","line":58,"updated":"2016-05-17 06:36:34.000000000","message":"Why do we need this? See line 31.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                        current active user and tenant."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        if not self.client:"},{"line_number":59,"context_line":"            raise ValueError(\"To use driver\u0027s notification capability you \""},{"line_number":60,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":61,"context_line":"                             \"like oslo.messaging Messaging object, transport \""}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_b339fe43","line":58,"in_reply_to":"bab6814e_8f2f7f3d","updated":"2016-05-19 15:16:33.000000000","message":"yes, my bad :(","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                        current active user and tenant."},{"line_number":56,"context_line":"        \"\"\""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        if not self.client:"},{"line_number":59,"context_line":"            raise ValueError(\"To use driver\u0027s notification capability you \""},{"line_number":60,"context_line":"                             \"need to specify Messaging-related information \""},{"line_number":61,"context_line":"                             \"like oslo.messaging Messaging object, transport \""}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_8f2f7f3d","line":58,"in_reply_to":"dab17558_b37d206f","updated":"2016-05-19 10:53:47.000000000","message":"++, it looks like it\u0027s an old piece of code","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"}],"osprofiler/notifier.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"22f17e5d7334ecc69273310f8381b74cc41c1d0d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    :returns: Callable notifier method"},{"line_number":58,"context_line":"    :raises TypeError: In case of invalid name of plugin raises TypeError"},{"line_number":59,"context_line":"    \"\"\""},{"line_number":60,"context_line":"    return base.get_driver(driver_name, *args, **kwargs).notify"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_2cc4783e","line":60,"updated":"2015-12-01 20:30:04.000000000","message":"Same question as previously, driver_name seems odd here when this is also taking a connection_url...","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"c5da5a20d6f4783da887bc104e1c9187ba7fa2b6","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    :returns: Callable notifier method"},{"line_number":58,"context_line":"    :raises TypeError: In case of invalid name of plugin raises TypeError"},{"line_number":59,"context_line":"    \"\"\""},{"line_number":60,"context_line":"    return base.get_driver(driver_name, *args, **kwargs).notify"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_3f8557ce","line":60,"in_reply_to":"9a8ffd7b_2cc4783e","updated":"2015-12-02 11:27:36.000000000","message":"Done","commit_id":"e6486e3c18da81e8c290ca438e592b0c639e5ada"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"bbeb344234d0748f58b4a5bd05b2d931b64d666b","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    :param driver_name_or_connection_string: Name of plugin that creates"},{"line_number":55,"context_line":"                                             notifier or connection_url with"},{"line_number":56,"context_line":"                                             valid schema e.g. \"messaging://\""},{"line_number":57,"context_line":"                                             or \"ceilometer://\""},{"line_number":58,"context_line":"    :param *args: args that will be passed to plugin init method"},{"line_number":59,"context_line":"    :param **kwargs: kwargs that will be passed to plugin init method"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_e993e74d","line":56,"updated":"2015-12-10 06:41:36.000000000","message":"\u0027schema\u0027 -\u003e \u0027scheme\u0027 :)","commit_id":"8b97993a8760e3364656542532a68ae79f03387e"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"76ccdd8a19ba7bc89a072064c7aec4f9c6dd7028","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    __notifier \u003d notifier"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def create(driver_name_or_connection_string, *args, **kwargs):"},{"line_number":52,"context_line":"    \"\"\"Create notifier based on specified plugin_name"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    :param driver_name_or_connection_string: Name of plugin that creates"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_c7c02ae3","line":51,"updated":"2015-12-25 01:00:21.000000000","message":"let\u0027s have here alwasy connection_string","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5f20e80167c59a040be3cc4a77ea113605e59f2e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    __notifier \u003d notifier"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def create(driver_name_or_connection_string, *args, **kwargs):"},{"line_number":52,"context_line":"    \"\"\"Create notifier based on specified plugin_name"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    :param driver_name_or_connection_string: Name of plugin that creates"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a7b0d38_96e1ee00","line":51,"in_reply_to":"1a7b0d38_c7c02ae3","updated":"2015-12-25 08:17:00.000000000","message":"as said, we need this for backward compatibility","commit_id":"184c8d385b56fe476e1dabeb4735084d5c44236b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"dee26065dad5f39cf9835e2b9779a36e3e788d28","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    :raises TypeError: In case of invalid name of plugin raises TypeError"},{"line_number":60,"context_line":"    \"\"\""},{"line_number":61,"context_line":"    global __driver"},{"line_number":62,"context_line":"    __driver \u003d base.get_driver(connection_string, *args, **kwargs)"},{"line_number":63,"context_line":"    return __driver.notify"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a061dce_537993f5","line":62,"updated":"2016-04-05 22:08:44.000000000","message":"Should this be a __driver_cache that the index is the  connection string? Seems odd that a call to this could change a global variable in such a manner...\n\nIe this would be:\n\n   def create(connection_string, *args, **kwargs):\n        try:\n           return __driver_cache[connection_string]\n        except KeyError:\n           d \u003d base.get_driver(connection_string, *args, **kwargs)\n           \n           __driver_cache[connection_string] \u003d d\n           return d\n\nBut then if this has a good reason to be like this that\u0027s fine, I just really think globals like this are weird/bad but that\u0027s just my 2 cents.","commit_id":"6ab8a98847365cdea71826076621c3651fa00180"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"73112fffb1b70cedb15b9c36343787185432134b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    :raises TypeError: In case of invalid name of plugin raises TypeError"},{"line_number":60,"context_line":"    \"\"\""},{"line_number":61,"context_line":"    global __driver"},{"line_number":62,"context_line":"    __driver \u003d base.get_driver(connection_string, *args, **kwargs)"},{"line_number":63,"context_line":"    return __driver.notify"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a18252c_5721ac9e","line":62,"in_reply_to":"5a18252c_384d1c73","updated":"2016-04-13 05:52:43.000000000","message":"Ok, u may agree :-P","commit_id":"6ab8a98847365cdea71826076621c3651fa00180"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"f5664a854121c5462982c222073037aa4adcc599","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    :raises TypeError: In case of invalid name of plugin raises TypeError"},{"line_number":60,"context_line":"    \"\"\""},{"line_number":61,"context_line":"    global __driver"},{"line_number":62,"context_line":"    __driver \u003d base.get_driver(connection_string, *args, **kwargs)"},{"line_number":63,"context_line":"    return __driver.notify"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a18252c_384d1c73","line":62,"in_reply_to":"9a061dce_537993f5","updated":"2016-04-12 15:41:26.000000000","message":"Joshua, I\u0027ll agree with yours comment.","commit_id":"6ab8a98847365cdea71826076621c3651fa00180"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"45295024832b1e699102e9ec17639d39e86e64d2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"def create(connection_string, *args, **kwargs):"},{"line_number":53,"context_line":"    \"\"\"Create notifier based on specified plugin_name"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    :param plugin_name: Name of plugin that creates notifier"},{"line_number":56,"context_line":"    :param *args: args that will be passed to plugin init method"},{"line_number":57,"context_line":"    :param **kwargs: kwargs that will be passed to plugin init method"},{"line_number":58,"context_line":"    :returns: Callable notifier method"}],"source_content_type":"text/x-python","patch_set":34,"id":"dab17558_3608a291","line":55,"updated":"2016-05-12 17:20:25.000000000","message":"Parameter documentation is no longer correct.","commit_id":"35f4a157d58e514df2c9c138a1684fcbdaec229f"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# NOTE(boris-42): By default we are using noop notifier."},{"line_number":24,"context_line":"__notifier \u003d _noop_notifier"},{"line_number":25,"context_line":"__driver_cache \u003d {}"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def notify(info):"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_73bf38d0","line":25,"updated":"2016-05-17 06:36:34.000000000","message":"Why do we need a cache? We don\u0027t have it currently.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# NOTE(boris-42): By default we are using noop notifier."},{"line_number":24,"context_line":"__notifier \u003d _noop_notifier"},{"line_number":25,"context_line":"__driver_cache \u003d {}"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def notify(info):"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_5ec0997b","line":25,"in_reply_to":"dab17558_73bf38d0","updated":"2016-05-19 15:16:33.000000000","message":"see Joshua\u0027s comment on patch set 26","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"}],"osprofiler/opts.py":[{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4a1859770bed95e05d82dea19d19598e2595a45a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Possible values:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* messaging://: use oslo_messaging driver for sending notifications."},{"line_number":91,"context_line":"* mongodb://localhost:27017: use MongoDB to store notifications.\"\"\")"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"_PROFILER_OPTS \u003d ["}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_ef828bff","line":91,"updated":"2016-05-19 10:53:47.000000000","message":"you need to add mongo-db related line only in the mongo-db related change","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"}],"osprofiler/profiler.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"5bd60ac1bc01ee667a942e14b4027b1bc471754e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    __local_ctx.profiler \u003d None"},{"line_number":36,"context_line":"    global HOST_NAME"},{"line_number":37,"context_line":"    HOST_NAME \u003d None"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def init(hmac_key, base_id\u003dNone, parent_id\u003dNone, connection_str\u003dNone):"},{"line_number":41,"context_line":"    \"\"\"Init profiler instance for current thread."}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_1f8b9469","line":38,"updated":"2015-12-02 18:59:01.000000000","message":"i\u0027d almost rather there be a _get_hostname() function here in this class that can do the population of \u0027global HOST_NAME\u0027, avoiding further usage in this module from even caring that it is cached...\n\nSomething like:\n\n   def _get_hostname():\n       global HOST_NAME\n       if not HOST_NAME:\n           HOST_NAME \u003d socket.gethostname()\n       return HOST_NAME\n\nHaving every usage of this HOST_NAME have to know its cached seems sorta crappy (_clean and _get_hostname functions would be the only functions touching the global HOST_NAME attribute)","commit_id":"42cb31b82fe29fafb60665357605d075fcc69a0e"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"4e9c9dea1c5ca9435a411e9d4c0420ea1320a864","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    __local_ctx.profiler \u003d None"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def init(hmac_key, base_id\u003dNone, parent_id\u003dNone, connection_str\u003dNone,"},{"line_number":38,"context_line":"         project\u003dNone, service\u003dNone):"},{"line_number":39,"context_line":"    \"\"\"Init profiler instance for current thread."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_b27c4b73","line":37,"updated":"2016-01-13 11:20:44.000000000","message":"heh, I have issue with this line now. Boris and I wanted to set project and service in profiler init not to duplicate this stuff everywhere, but in OpenStack RPC services it\u0027s very tricky to identify what the current service is. NO success yet here.","commit_id":"0917ee09a8132321bf108c45097f081ddb0c8d4b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"a153187a6dfee0420c4c7f1ed04701a16bb5dfaf","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    __local_ctx.profiler \u003d None"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def init(hmac_key, base_id\u003dNone, parent_id\u003dNone, connection_str\u003dNone,"},{"line_number":38,"context_line":"         project\u003dNone, service\u003dNone):"},{"line_number":39,"context_line":"    \"\"\"Init profiler instance for current thread."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_4d9c295d","line":37,"in_reply_to":"da6ed579_b27c4b73","updated":"2016-01-13 22:35:24.000000000","message":"Hmmmm, ya I could see that being hard/a pain in the ass.","commit_id":"0917ee09a8132321bf108c45097f081ddb0c8d4b"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        self._trace_stack \u003d collections.deque([base_id, parent_id or base_id])"},{"line_number":335,"context_line":"        self._name \u003d collections.deque()"},{"line_number":336,"context_line":"        self._host \u003d socket.gethostname()"},{"line_number":337,"context_line":"        self._connection_str \u003d connection_str"},{"line_number":338,"context_line":"        self._project \u003d project"},{"line_number":339,"context_line":"        self._service \u003d service"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_ee65fbe0","line":337,"updated":"2016-05-17 06:36:34.000000000","message":"Why do we need connection string? profiler uses a notifier and only the notifier needs to know about the connection.","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        self._trace_stack \u003d collections.deque([base_id, parent_id or base_id])"},{"line_number":335,"context_line":"        self._name \u003d collections.deque()"},{"line_number":336,"context_line":"        self._host \u003d socket.gethostname()"},{"line_number":337,"context_line":"        self._connection_str \u003d connection_str"},{"line_number":338,"context_line":"        self._project \u003d project"},{"line_number":339,"context_line":"        self._service \u003d service"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_d3e92282","line":337,"in_reply_to":"dab17558_ee65fbe0","updated":"2016-05-19 15:16:33.000000000","message":"Done","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        info \u003d info or {}"},{"line_number":372,"context_line":"        info[\"host\"] \u003d self._host"},{"line_number":373,"context_line":"        info[\"project\"] \u003d self._project"},{"line_number":374,"context_line":"        info[\"service\"] \u003d self._service"},{"line_number":375,"context_line":"        self._name.append(name)"},{"line_number":376,"context_line":"        self._trace_stack.append(str(uuid.uuid4()))"},{"line_number":377,"context_line":"        self._notify(\"%s-start\" % name, info)"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_0e3ddfc3","line":374,"range":{"start_line":373,"start_character":7,"end_line":374,"end_character":39},"updated":"2016-05-17 06:36:34.000000000","message":"Why do we need this? It is already in the base driver. See lines 64, 65 in https://review.openstack.org/#/c/247005/35/osprofiler/drivers/messaging.py","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"be9130ed42137b695190ef69e17cdef2f96b1ea7","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        info \u003d info or {}"},{"line_number":372,"context_line":"        info[\"host\"] \u003d self._host"},{"line_number":373,"context_line":"        info[\"project\"] \u003d self._project"},{"line_number":374,"context_line":"        info[\"service\"] \u003d self._service"},{"line_number":375,"context_line":"        self._name.append(name)"},{"line_number":376,"context_line":"        self._trace_stack.append(str(uuid.uuid4()))"},{"line_number":377,"context_line":"        self._notify(\"%s-start\" % name, info)"}],"source_content_type":"text/x-python","patch_set":35,"id":"bab6814e_be5b852d","line":374,"range":{"start_line":373,"start_character":7,"end_line":374,"end_character":39},"in_reply_to":"dab17558_0e3ddfc3","updated":"2016-05-19 15:16:33.000000000","message":"these variables along with the connection_str will be used in future, when the driver instance will be a field of Profiler class","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6cc10c602907a3711f124f07d5c2202ecc107a00","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        info \u003d info or {}"},{"line_number":372,"context_line":"        info[\"host\"] \u003d self._host"},{"line_number":373,"context_line":"        info[\"project\"] \u003d self._project"},{"line_number":374,"context_line":"        info[\"service\"] \u003d self._service"},{"line_number":375,"context_line":"        self._name.append(name)"},{"line_number":376,"context_line":"        self._trace_stack.append(str(uuid.uuid4()))"},{"line_number":377,"context_line":"        self._notify(\"%s-start\" % name, info)"}],"source_content_type":"text/x-python","patch_set":36,"id":"bab6814e_fffbd944","line":374,"range":{"start_line":373,"start_character":8,"end_line":374,"end_character":39},"updated":"2016-05-23 08:20:19.000000000","message":"Why do we need this? See line 58-59 in messaging.py. I think we should remove those lines in messaging.py.","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"8459fd0e2610c7ae34082ab90ac5cd19be3338bc","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        info \u003d info or {}"},{"line_number":372,"context_line":"        info[\"host\"] \u003d self._host"},{"line_number":373,"context_line":"        info[\"project\"] \u003d self._project"},{"line_number":374,"context_line":"        info[\"service\"] \u003d self._service"},{"line_number":375,"context_line":"        self._name.append(name)"},{"line_number":376,"context_line":"        self._trace_stack.append(str(uuid.uuid4()))"},{"line_number":377,"context_line":"        self._notify(\"%s-start\" % name, info)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_569eefb8","line":374,"range":{"start_line":373,"start_character":8,"end_line":374,"end_character":39},"in_reply_to":"7aa08908_d7280836","updated":"2016-06-16 07:52:14.000000000","message":"Thanks for clarifying that.","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"29787484422003823bd534d2e31c6e435d9f5c9d","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"        info \u003d info or {}"},{"line_number":372,"context_line":"        info[\"host\"] \u003d self._host"},{"line_number":373,"context_line":"        info[\"project\"] \u003d self._project"},{"line_number":374,"context_line":"        info[\"service\"] \u003d self._service"},{"line_number":375,"context_line":"        self._name.append(name)"},{"line_number":376,"context_line":"        self._trace_stack.append(str(uuid.uuid4()))"},{"line_number":377,"context_line":"        self._notify(\"%s-start\" % name, info)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7aa08908_d7280836","line":374,"range":{"start_line":373,"start_character":8,"end_line":374,"end_character":39},"in_reply_to":"bab6814e_fffbd944","updated":"2016-06-10 14:37:25.000000000","message":"No, we shouldn\u0027t. Currently openstack services do not send \u0027project\u0027 and \u0027service\u0027 arguments to profiler.init() method. These lines are here in order to be used in future to start deprecating the old way of creating a notifier instance. In the next version of osprofiler the notifier method will likely be a field of Profiler class.","commit_id":"2b6219092bed83f2f616be2b6ac061c2b61cfa41"}],"tests/drivers/test_base.py":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_a5bab6be","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2016-05-05 22:33:40.000000000","message":"2016","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_3cbfe1d1","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"dab17558_a5bab6be","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            def notify(self, a):"},{"line_number":32,"context_line":"                return a"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        self.assertEqual(base.Driver.get(\"a://\").notify(10), 10)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def test_factory_with_args(self):"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_a5a596b6","line":34,"updated":"2016-05-05 22:33:40.000000000","message":"Please reverse the argument order.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            def notify(self, a):"},{"line_number":32,"context_line":"                return a"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        self.assertEqual(base.Driver.get(\"a://\").notify(10), 10)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def test_factory_with_args(self):"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_dcce9582","line":34,"in_reply_to":"dab17558_a5a596b6","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"360b3f304553a1baf3b534a7a83e659b714be2e1","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            def notify(self, c):"},{"line_number":49,"context_line":"                return self.a + self.b + c"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.assertEqual(base.Driver.get(\"b://\", 5, b\u003d7).notify(10), 22)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_driver_not_found(self):"},{"line_number":54,"context_line":"        self.assertRaises(ValueError, base.Driver.get,"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_0582a200","line":51,"updated":"2016-05-05 22:33:40.000000000","message":"Same comment.","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":18654,"name":"Alexey Yelistratov","email":"ayelistratov@mirantis.com","username":"rohanion"},"change_message_id":"e48729756ae9fe955f1ef48e2b3ea00dcb7dd6fd","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            def notify(self, c):"},{"line_number":49,"context_line":"                return self.a + self.b + c"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.assertEqual(base.Driver.get(\"b://\", 5, b\u003d7).notify(10), 22)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_driver_not_found(self):"},{"line_number":54,"context_line":"        self.assertRaises(ValueError, base.Driver.get,"}],"source_content_type":"text/x-python","patch_set":33,"id":"dab17558_1cc93d79","line":51,"in_reply_to":"dab17558_0582a200","updated":"2016-05-06 15:29:51.000000000","message":"Done","commit_id":"c1a5dbc2d9617a843415c19606fc55050b67fe5c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_aea6530c","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2016-05-17 06:36:34.000000000","message":"2016","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"4da2a8e882e7736213b059d7a22068ad6a695ed9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_bfc12de6","line":1,"updated":"2016-06-27 09:30:26.000000000","message":"Tests should go under osprofiler/tests -- otherwise they are not even executed","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"4da2a8e882e7736213b059d7a22068ad6a695ed9","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                        \"transport\", \"host\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_build_empty_tree(self):"},{"line_number":65,"context_line":"        self.assertEqual(base.Driver()._build_tree({}), [])"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_build_complex_tree(self):"},{"line_number":68,"context_line":"        test_input \u003d {"}],"source_content_type":"text/x-python","patch_set":39,"id":"3aaa91ec_1f6cc106","line":65,"updated":"2016-06-27 09:30:26.000000000","message":"base.Driver() requires one mandatory parameter, isn\u0027t it?","commit_id":"0cc1578806371e42ec3f76175cd56300e4fef229"}],"tests/drivers/test_messaging.py":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"bec402ca396c430ce8dc7952c74ee98bb815a7e7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Mirantis Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":35,"id":"dab17558_0eb2ff4b","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2016-05-17 06:36:34.000000000","message":"2016","commit_id":"dd9a01edb72194f86a64ce3e256092f70a267f95"}]}
