)]}'
{"doc/notification_samples/service-failed.json":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7242913caa9171526e1ccb4a0ed0dcc1031267c9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"\t\t\t\t\"watcher_object.name\": \"ServiceStatusUpdatePayload\","},{"line_number":8,"context_line":"\t\t\t\t\"watcher_object.namespace\": \"watcher\","},{"line_number":9,"context_line":"\t\t\t\t\"watcher_object.data\": {"},{"line_number":10,"context_line":"\t\t\t\t\t\"service_status\": \"FAILED\""},{"line_number":11,"context_line":"\t\t\t\t},"},{"line_number":12,"context_line":"\t\t\t\t\"watcher_object.version\": \"1.0\""},{"line_number":13,"context_line":"\t\t\t},"}],"source_content_type":"application/json","patch_set":4,"id":"3a1ff146_bc4bb52a","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":5},"updated":"2017-03-15 09:20:46.000000000","message":"nit: can you please please use spaces instead of tabs for indentation?","commit_id":"9471a030298b8dca174991f6dd51b526ec823ba1"}],"watcher/api/controllers/v1/service.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"d51c2555d0cb0af5f86f2133f5261d3cdfc4c085","unresolved":false,"context_lines":[{"line_number":38,"context_line":"from watcher.common import context"},{"line_number":39,"context_line":"from watcher.common import exception"},{"line_number":40,"context_line":"from watcher.common import policy"},{"line_number":41,"context_line":"from watcher.notifications import service as n_service"},{"line_number":42,"context_line":"from watcher import objects"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a1ff146_5d8d5b30","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":54},"updated":"2017-03-15 09:38:16.000000000","message":"IMHO, you should keep the import consistent with the other notification import  like in objects/audit.py like:\n    \n    from watcher import notifications","commit_id":"4e1f7ac18e8b2c2d822d8a10f58f19fe844644ad"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"043e2dfab1dfc3ccf5108576b2b04792dfa976aa","unresolved":false,"context_lines":[{"line_number":38,"context_line":"from watcher.common import context"},{"line_number":39,"context_line":"from watcher.common import exception"},{"line_number":40,"context_line":"from watcher.common import policy"},{"line_number":41,"context_line":"from watcher.notifications import service as n_service"},{"line_number":42,"context_line":"from watcher import objects"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a1ff146_1ed3d639","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":54},"in_reply_to":"3a1ff146_5d8d5b30","updated":"2017-03-15 11:56:28.000000000","message":"Done","commit_id":"4e1f7ac18e8b2c2d822d8a10f58f19fe844644ad"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"d51c2555d0cb0af5f86f2133f5261d3cdfc4c085","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self._status \u003d objects.service.ServiceStatus.FAILED"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"            def _notify():"},{"line_number":87,"context_line":"                n_service.send_service_failed(self._context, service)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"            _notify()"},{"line_number":90,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a1ff146_bda3af9d","line":87,"range":{"start_line":87,"start_character":16,"end_line":87,"end_character":69},"updated":"2017-03-15 09:38:16.000000000","message":"given the above import suggestion, you would have instead:\n\n    notifications.service.send_service_failed(self._context, service)","commit_id":"4e1f7ac18e8b2c2d822d8a10f58f19fe844644ad"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"043e2dfab1dfc3ccf5108576b2b04792dfa976aa","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self._status \u003d objects.service.ServiceStatus.FAILED"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"            def _notify():"},{"line_number":87,"context_line":"                n_service.send_service_failed(self._context, service)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"            _notify()"},{"line_number":90,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a1ff146_3ed89253","line":87,"range":{"start_line":87,"start_character":16,"end_line":87,"end_character":69},"in_reply_to":"3a1ff146_bda3af9d","updated":"2017-03-15 11:56:28.000000000","message":"Done","commit_id":"4e1f7ac18e8b2c2d822d8a10f58f19fe844644ad"}],"watcher/api/scheduling.py":[{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"4187754aea31a25c82173e658adbb2c752844cb3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                                                          state\u003dresult)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_service_status(self, context, name):"},{"line_number":55,"context_line":"        service \u003d objects.Service.get_by_name(context, name)"},{"line_number":56,"context_line":"        last_heartbeat \u003d (service.last_seen_up or service.updated_at"},{"line_number":57,"context_line":"                          or service.created_at)"},{"line_number":58,"context_line":"        if isinstance(last_heartbeat, six.string_types):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_3c422f10","line":55,"range":{"start_line":55,"start_character":17,"end_line":55,"end_character":60},"updated":"2017-05-25 05:46:14.000000000","message":"If there are two controllers as HA and \nWatcher services run on them, the service table will have the two same name services. In this case, the objects.Service.get_by_name(context, name) will trigger exception of MultipleResultsFound.\n(https://review.openstack.org/#/c/447354/)\nWe should use objects.Service.get(context, id).","commit_id":"e08f614e084cbee8825449b70709dc7de34a9cb9"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"cc036f1ed3ab38fdb2d181f391bf445ab5c59368","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                                                          state\u003dresult)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_service_status(self, context, name):"},{"line_number":55,"context_line":"        service \u003d objects.Service.get_by_name(context, name)"},{"line_number":56,"context_line":"        last_heartbeat \u003d (service.last_seen_up or service.updated_at"},{"line_number":57,"context_line":"                          or service.created_at)"},{"line_number":58,"context_line":"        if isinstance(last_heartbeat, six.string_types):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_16a502a2","line":55,"range":{"start_line":55,"start_character":17,"end_line":55,"end_character":60},"in_reply_to":"ff0f0b1f_3c422f10","updated":"2017-05-25 09:51:31.000000000","message":"Done","commit_id":"e08f614e084cbee8825449b70709dc7de34a9cb9"}],"watcher/notifications/service.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"00b76815dfc36f47e20c6d5211b5eb2db787f233","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"# Copyright (c) 2016 Servionica"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":5,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":1,"id":"da36d5c6_5a8c067f","line":2,"range":{"start_line":2,"start_character":16,"end_line":2,"end_character":20},"updated":"2017-02-23 12:42:22.000000000","message":"nit: 2017 ;)","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"25365e70fb9a0a266151b75b469fb9b4aae01971","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"# Copyright (c) 2016 Servionica"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":5,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_99cc3937","line":2,"range":{"start_line":2,"start_character":16,"end_line":2,"end_character":20},"in_reply_to":"da36d5c6_5a8c067f","updated":"2017-03-01 12:28:48.000000000","message":"oh, fixed","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":21361,"name":"Chris Spencer","email":"christopher.m.spencer@intel.com","username":"chrisspencer"},"change_message_id":"f56845c96607d34e1b05866b556170618d5ff6c7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    }"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __init__(self, service):"},{"line_number":41,"context_line":"        super(ServiceStatusPayload, self).__init__()"},{"line_number":42,"context_line":"        self.populate_schema(service\u003dservice)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da36d5c6_d8647dba","line":41,"range":{"start_line":41,"start_character":14,"end_line":41,"end_character":34},"updated":"2017-02-23 14:18:31.000000000","message":"undefined name","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":21361,"name":"Chris Spencer","email":"christopher.m.spencer@intel.com","username":"chrisspencer"},"change_message_id":"f56845c96607d34e1b05866b556170618d5ff6c7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.populate_schema(service\u003dservice)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def send_service_failed(context, service, service\u003d\u0027infra-optim\u0027, host\u003dNone):"},{"line_number":46,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":47,"context_line":"    notification.emit(context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da36d5c6_383cb9c7","line":45,"range":{"start_line":45,"start_character":33,"end_line":45,"end_character":49},"updated":"2017-02-23 14:18:31.000000000","message":"duplicate \"service\" is not liked by jenkins","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"25365e70fb9a0a266151b75b469fb9b4aae01971","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.populate_schema(service\u003dservice)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def send_service_failed(context, service, service\u003d\u0027infra-optim\u0027, host\u003dNone):"},{"line_number":46,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":47,"context_line":"    notification.emit(context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_79eea58c","line":45,"range":{"start_line":45,"start_character":33,"end_line":45,"end_character":49},"in_reply_to":"da36d5c6_383cb9c7","updated":"2017-03-01 12:28:48.000000000","message":"fixed","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"00b76815dfc36f47e20c6d5211b5eb2db787f233","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.populate_schema(service\u003dservice)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def send_service_failed(context, service, service\u003d\u0027infra-optim\u0027, host\u003dNone):"},{"line_number":46,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":47,"context_line":"    notification.emit(context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da36d5c6_3a8f5276","line":47,"range":{"start_line":45,"start_character":0,"end_line":47,"end_character":30},"updated":"2017-02-23 12:42:22.000000000","message":"the notification payload isn\u0027t finished here","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":21361,"name":"Chris Spencer","email":"christopher.m.spencer@intel.com","username":"chrisspencer"},"change_message_id":"f56845c96607d34e1b05866b556170618d5ff6c7","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def send_service_failed(context, service, service\u003d\u0027infra-optim\u0027, host\u003dNone):"},{"line_number":46,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":47,"context_line":"    notification.emit(context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da36d5c6_185b75f7","line":47,"range":{"start_line":47,"start_character":4,"end_line":47,"end_character":16},"updated":"2017-02-23 14:18:31.000000000","message":"undefined name notification","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"25365e70fb9a0a266151b75b469fb9b4aae01971","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.populate_schema(service\u003dservice)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def send_service_failed(context, service, service\u003d\u0027infra-optim\u0027, host\u003dNone):"},{"line_number":46,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":47,"context_line":"    notification.emit(context)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_d9edd18c","line":47,"range":{"start_line":45,"start_character":0,"end_line":47,"end_character":30},"in_reply_to":"da36d5c6_3a8f5276","updated":"2017-03-01 12:28:48.000000000","message":"yes, it was in progress","commit_id":"44fabee19f2d230ebb8d475875f653e95e4d5f50"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7242913caa9171526e1ccb4a0ed0dcc1031267c9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    fields \u003d {"},{"line_number":36,"context_line":"        \u0027sevice_host\u0027: wfields.StringField(),"},{"line_number":37,"context_line":"        \u0027name\u0027: wfields.StringField(),"},{"line_number":38,"context_line":"        \u0027last_seen_up\u0027: wfields.DateTimeField(),"},{"line_number":39,"context_line":"    }"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, failed_service, status_update, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a1ff146_dce4f10e","line":38,"range":{"start_line":38,"start_character":32,"end_line":38,"end_character":45},"updated":"2017-03-15 09:20:46.000000000","message":"shouldn\u0027t this field be nullable\u003dTrue just like its object counterpart in https://github.com/openstack/watcher/blob/master/watcher/objects/service.py#L42-L43?","commit_id":"9471a030298b8dca174991f6dd51b526ec823ba1"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7242913caa9171526e1ccb4a0ed0dcc1031267c9","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                        service\u003d\u0027infra-optim\u0027,"},{"line_number":84,"context_line":"                        host\u003dNone):"},{"line_number":85,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":86,"context_line":"    status_update \u003d ServiceStatusUpdatePayload(service_status\u003d\u0027FAILED\u0027)"},{"line_number":87,"context_line":"    versioned_payload \u003d ServiceUpdatePayload("},{"line_number":88,"context_line":"        failed_service\u003dfailed_service,"},{"line_number":89,"context_line":"        status_update\u003dstatus_update"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a1ff146_4212dab5","line":86,"range":{"start_line":86,"start_character":62,"end_line":86,"end_character":70},"updated":"2017-03-15 09:20:46.000000000","message":"Can you please use ServiceStatus.FAILED instead of using the hardcoded value?","commit_id":"9471a030298b8dca174991f6dd51b526ec823ba1"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1d0dee0b133387abebd59a128b9c7fb24382b80a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"def send_service_update(context, failed_service,"},{"line_number":85,"context_line":"                        service\u003d\u0027infra-optim\u0027,"},{"line_number":86,"context_line":"                        host\u003dNone,"},{"line_number":87,"context_line":"                        state\u003do_service.ServiceStatus.FAILED):"},{"line_number":88,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":89,"context_line":"    if state \u003d\u003d o_service.ServiceStatus.FAILED:"},{"line_number":90,"context_line":"        status_update \u003d ServiceStatusUpdatePayload("}],"source_content_type":"text/x-python","patch_set":7,"id":"5ff73747_19629a17","line":87,"range":{"start_line":87,"start_character":24,"end_line":87,"end_character":60},"updated":"2017-05-17 14:49:43.000000000","message":"IMHO, you shouldn\u0027t define a default state here (make it the 3rd argument of the function)","commit_id":"bf0419cde161505a408bdddfe2daa38c5ef82896"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"05df058499be8a354b13cb24accbb0a345192307","unresolved":false,"context_lines":[{"line_number":84,"context_line":"def send_service_update(context, failed_service,"},{"line_number":85,"context_line":"                        service\u003d\u0027infra-optim\u0027,"},{"line_number":86,"context_line":"                        host\u003dNone,"},{"line_number":87,"context_line":"                        state\u003do_service.ServiceStatus.FAILED):"},{"line_number":88,"context_line":"    \"\"\"Emit an service failed notification.\"\"\""},{"line_number":89,"context_line":"    if state \u003d\u003d o_service.ServiceStatus.FAILED:"},{"line_number":90,"context_line":"        status_update \u003d ServiceStatusUpdatePayload("}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_3c5712cd","line":87,"range":{"start_line":87,"start_character":24,"end_line":87,"end_character":60},"in_reply_to":"5ff73747_19629a17","updated":"2017-05-24 07:50:50.000000000","message":"Done","commit_id":"bf0419cde161505a408bdddfe2daa38c5ef82896"},{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"4187754aea31a25c82173e658adbb2c752844cb3","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    )"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    notification \u003d ServiceUpdateNotification("},{"line_number":102,"context_line":"        priority\u003dwfields.NotificationPriority.WARNING,"},{"line_number":103,"context_line":"        event_type\u003dnotificationbase.EventType("},{"line_number":104,"context_line":"            object\u003d\u0027service\u0027,"},{"line_number":105,"context_line":"            action\u003dwfields.NotificationAction.UPDATE),"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_7cc1c753","line":102,"range":{"start_line":102,"start_character":25,"end_line":102,"end_character":53},"updated":"2017-05-25 05:46:14.000000000","message":"Priority is WARNING when state from ACTIVE to FAILED,\nbut when state frome FAILED to ACTIVE, maybe priority INFO is enough.","commit_id":"e08f614e084cbee8825449b70709dc7de34a9cb9"},{"author":{"_account_id":21865,"name":"Vladimir Ostroverkhov","email":"ostroverkhov@servionica.ru","username":"Ostroverkhov"},"change_message_id":"cc036f1ed3ab38fdb2d181f391bf445ab5c59368","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    )"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    notification \u003d ServiceUpdateNotification("},{"line_number":102,"context_line":"        priority\u003dwfields.NotificationPriority.WARNING,"},{"line_number":103,"context_line":"        event_type\u003dnotificationbase.EventType("},{"line_number":104,"context_line":"            object\u003d\u0027service\u0027,"},{"line_number":105,"context_line":"            action\u003dwfields.NotificationAction.UPDATE),"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_168062f4","line":102,"range":{"start_line":102,"start_character":25,"end_line":102,"end_character":53},"in_reply_to":"ff0f0b1f_7cc1c753","updated":"2017-05-25 09:51:31.000000000","message":"Done","commit_id":"e08f614e084cbee8825449b70709dc7de34a9cb9"}],"watcher/tests/notifications/test_service_notifications.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7242913caa9171526e1ccb4a0ed0dcc1031267c9","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import datetime"},{"line_number":18,"context_line":"import freezegun"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"import oslo_messaging as om"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a1ff146_c2db2aec","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":15},"updated":"2017-03-15 09:20:46.000000000","message":"an extra blank space is needed after this import to separate builtin imports from 3rd party imports","commit_id":"9471a030298b8dca174991f6dd51b526ec823ba1"}]}
