)]}'
{"smaug/loadables.py":[{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2011-2012 OpenStack Foundation"},{"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":14,"id":"9aed3d3a_f82d15a9","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2016-02-29 09:11:36.000000000","message":"update to the correct year","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"26e946766e608002e2ff9583b9f552df955511a8","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Generic Loadable class support."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Meant to be used by such things as scheduler filters and weights where we"},{"line_number":20,"context_line":"want to load modules from certain directories and find certain types of"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_f1ba5d09","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":30},"updated":"2016-02-28 13:22:16.000000000","message":"This looks like something that is covered by stevedore.\n\nhttp://docs.openstack.org/developer/stevedore/","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Generic Loadable class support."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Meant to be used by such things as scheduler filters and weights where we"},{"line_number":20,"context_line":"want to load modules from certain directories and find certain types of"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_09a98a7b","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":30},"in_reply_to":"9aed3d3a_83073e17","updated":"2016-03-03 02:50:00.000000000","message":"got it. thanks.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Generic Loadable class support."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Meant to be used by such things as scheduler filters and weights where we"},{"line_number":20,"context_line":"want to load modules from certain directories and find certain types of"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_099b4a73","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":30},"in_reply_to":"9aed3d3a_f1ba5d09","updated":"2016-03-03 02:50:00.000000000","message":"got it. later I will learn the stevedore. If the functions are covered, I will use it. thanks.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Generic Loadable class support."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Meant to be used by such things as scheduler filters and weights where we"},{"line_number":20,"context_line":"want to load modules from certain directories and find certain types of"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_83073e17","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":30},"in_reply_to":"9aed3d3a_f1ba5d09","updated":"2016-02-29 09:11:36.000000000","message":"see Saggi\u0027s comments, it likely copied from other place.please check if it\u0027s necessary to define a single class here.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"419382f87366041c813d31cd18c5710b22d25e05","unresolved":false,"context_lines":[{"line_number":44,"context_line":"from smaug import exception"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class BaseLoader(object):"},{"line_number":48,"context_line":"    def __init__(self, loadable_cls_type):"},{"line_number":49,"context_line":"        mod \u003d sys.modules[self.__class__.__module__]"},{"line_number":50,"context_line":"        self.path \u003d os.path.abspath(mod.__path__[0])"}],"source_content_type":"text/x-python","patch_set":21,"id":"3afc51ec_7ca020f5","line":47,"range":{"start_line":47,"start_character":6,"end_line":47,"end_character":16},"updated":"2016-03-13 13:35:31.000000000","message":"wht not use stevedore as saggi suggested \nhttp://docs.openstack.org/developer/stevedore/","commit_id":"25458a5bb519fb3afd8619f14fff112a64c2c9d5"}],"smaug/operationengine/engine/triggers/timetrigger/job.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"6c9a1dfc562e8d16f99f62d7d4e170113fc7effa","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from smaug import utils\r"},{"line_number":26,"context_line":"\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"class Job(object):\r"},{"line_number":29,"context_line":"    \"\"\"Encapsulate the operation and generate the next run times for it.\"\"\"\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    Trigger_TIME_FORMAT_MANAGER \u003d\\\r"}],"source_content_type":"text/x-python","patch_set":21,"id":"3afc51ec_d7a129ab","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":18},"updated":"2016-03-14 14:47:44.000000000","message":"This whole class can be removed by just defining an interface that all timed operations must implement.\n\n @six.metaclass(abc.ABC)\n class ScheduledOperation(object):\n       @abstractmethod\n       def get_next_runtime()\n ....\n\nAlso the Trigger should implement the conversion to the common format not the Job.","commit_id":"25458a5bb519fb3afd8619f14fff112a64c2c9d5"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"a9e3b69ff9a6482cbfb7b8a359e3e8f683780f4d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from smaug import utils\r"},{"line_number":26,"context_line":"\r"},{"line_number":27,"context_line":"\r"},{"line_number":28,"context_line":"class Job(object):\r"},{"line_number":29,"context_line":"    \"\"\"Encapsulate the operation and generate the next run times for it.\"\"\"\r"},{"line_number":30,"context_line":"\r"},{"line_number":31,"context_line":"    Trigger_TIME_FORMAT_MANAGER \u003d\\\r"}],"source_content_type":"text/x-python","patch_set":21,"id":"3afc51ec_76de3740","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":18},"in_reply_to":"3afc51ec_d7a129ab","updated":"2016-03-15 03:45:20.000000000","message":"each operation has its own trigger. so I create Job class to include the operation id and its trigger info in order to get its next run time more conveniently.","commit_id":"25458a5bb519fb3afd8619f14fff112a64c2c9d5"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        self._next_run_time \u003d self._compute_next_run_time(start_time)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def get_run_times(self, now):"},{"line_number":158,"context_line":"        \"\"\"Computes the run times."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :param now: datetime"},{"line_number":161,"context_line":"        :returns: list[datetime]"},{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        run_times \u003d []"},{"line_number":165,"context_line":"        next_run_time \u003d self._next_run_time"},{"line_number":166,"context_line":"        while next_run_time and next_run_time \u003c\u003d now:"},{"line_number":167,"context_line":"            run_times.append(next_run_time)"},{"line_number":168,"context_line":"            next_run_time \u003d self._compute_next_run_time(next_run_time)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        return run_times"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_88a6480e","line":170,"range":{"start_line":157,"start_character":0,"end_line":170,"end_character":24},"updated":"2016-03-17 10:05:19.000000000","message":"Why would we want to return an array of run times and not just the last one?\nIf more than 2 or more times are returned, we can assume all but the last one will be dropped by the window.\nI can\u0027t think of a \u0027missed\u0027 operation, that we would now want to execute 2 or more times in a row.","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"f761d8151a375d3f83a4e652b36731b975e1165a","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        self._next_run_time \u003d self._compute_next_run_time(start_time)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def get_run_times(self, now):"},{"line_number":158,"context_line":"        \"\"\"Computes the run times."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :param now: datetime"},{"line_number":161,"context_line":"        :returns: list[datetime]"},{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        run_times \u003d []"},{"line_number":165,"context_line":"        next_run_time \u003d self._next_run_time"},{"line_number":166,"context_line":"        while next_run_time and next_run_time \u003c\u003d now:"},{"line_number":167,"context_line":"            run_times.append(next_run_time)"},{"line_number":168,"context_line":"            next_run_time \u003d self._compute_next_run_time(next_run_time)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        return run_times"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_4d1ed25f","line":170,"range":{"start_line":157,"start_character":0,"end_line":170,"end_character":24},"in_reply_to":"1af94dfe_88a6480e","updated":"2016-03-18 09:59:53.000000000","message":"I agree with you. But the logic should be put at time_trigger.py, because it is the inefficient scheduling of time trigger leads to generate more run times for a job.\nAnd we must make sure the window will not be bigger than the interval of two run times. if it is allowed, then the operation will be executed more times.","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"}],"smaug/operationengine/engine/triggers/timetrigger/job_store.py":[{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2013 IBM Corp\r"},{"line_number":2,"context_line":"#\r"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may\r"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_436096a5","line":1,"range":{"start_line":1,"start_character":15,"end_line":1,"end_character":19},"updated":"2016-02-29 09:11:36.000000000","message":"update to the correct year and Company please","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2013 IBM Corp\r"},{"line_number":2,"context_line":"#\r"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may\r"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_e9d37e02","line":1,"range":{"start_line":1,"start_character":15,"end_line":1,"end_character":19},"in_reply_to":"9aed3d3a_436096a5","updated":"2016-03-03 02:50:00.000000000","message":"got it.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def __init__(self):"},{"line_number":30,"context_line":"        super(JobStore, self).__init__()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        self._jobs \u003d []"},{"line_number":33,"context_line":"        self._jobs_index \u003d {}  # job.id -\u003e job.next_run_tim"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def shutdown(self):"},{"line_number":36,"context_line":"        \"\"\"Frees any resources stored this job store.\"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_68a3fc4f","line":33,"range":{"start_line":32,"start_character":0,"end_line":33,"end_character":59},"updated":"2016-03-17 10:05:19.000000000","message":"You implement the jobs queue using a list and a binary search.\nBut adding/removing into a list using .insert() or del(lst[i]) is O(n).\nYou can use python\u0027s heapq to maintain O(log(n)) complexity.\nThat would get_due_jobs() to use heapq.heappop() to remove them, and add them back in time_trigger.py with the new next_run_time in _process_jobs.","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"f761d8151a375d3f83a4e652b36731b975e1165a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def __init__(self):"},{"line_number":30,"context_line":"        super(JobStore, self).__init__()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        self._jobs \u003d []"},{"line_number":33,"context_line":"        self._jobs_index \u003d {}  # job.id -\u003e job.next_run_tim"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def shutdown(self):"},{"line_number":36,"context_line":"        \"\"\"Frees any resources stored this job store.\"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_2db386ea","line":33,"range":{"start_line":32,"start_character":0,"end_line":33,"end_character":59},"in_reply_to":"1af94dfe_68a3fc4f","updated":"2016-03-18 09:59:53.000000000","message":"you are right. thanks for your comments. it is great. i will update it. \nby the way, if use the heap, then time trigger can only treat one job per scheduling, because heapq.heappop() only returns one item. if more than one jods need to be triggered at the same time, then we must schedule more times. i will update the _process_jobs to treat at most 3 jobs on one scheduling in order to reduce the time of scheduling.","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"}],"smaug/operationengine/engine/triggers/timetrigger/time_trigger.py":[{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2013 IBM Corp\r"},{"line_number":2,"context_line":"#\r"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may\r"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_fb7ceab6","line":1,"range":{"start_line":1,"start_character":15,"end_line":1,"end_character":19},"updated":"2016-02-29 09:11:36.000000000","message":"update to the current year and correct company if you are not from IBM please.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2013 IBM Corp\r"},{"line_number":2,"context_line":"#\r"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may\r"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_29f1e695","line":1,"range":{"start_line":1,"start_character":15,"end_line":1,"end_character":19},"in_reply_to":"9aed3d3a_fb7ceab6","updated":"2016-03-03 02:50:00.000000000","message":"got it","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                        executor.submit_operation(job.id, now,\r"},{"line_number":139,"context_line":"                                                  run_time, job.window)\r"},{"line_number":140,"context_line":"                    except Exception:\r"},{"line_number":141,"context_line":"                        LOG.exception(\"Submit job to executor failed,\"\r"},{"line_number":142,"context_line":"                                      \" id\u003d%s, name\u003d%s\", job.id, job.name)\r"},{"line_number":143,"context_line":"\r"},{"line_number":144,"context_line":"                # Update the job if it has a next execution time.\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_318033c0","line":141,"range":{"start_line":141,"start_character":39,"end_line":141,"end_character":45},"updated":"2016-02-29 09:11:36.000000000","message":"add marker function please.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                        executor.submit_operation(job.id, now,\r"},{"line_number":139,"context_line":"                                                  run_time, job.window)\r"},{"line_number":140,"context_line":"                    except Exception:\r"},{"line_number":141,"context_line":"                        LOG.exception(\"Submit job to executor failed,\"\r"},{"line_number":142,"context_line":"                                      \" id\u003d%s, name\u003d%s\", job.id, job.name)\r"},{"line_number":143,"context_line":"\r"},{"line_number":144,"context_line":"                # Update the job if it has a next execution time.\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_c4dca775","line":141,"range":{"start_line":141,"start_character":39,"end_line":141,"end_character":45},"in_reply_to":"9aed3d3a_318033c0","updated":"2016-03-03 02:50:00.000000000","message":"got it. thanks.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"a8cbdf8477edc97bf423580b7be8673e2b92e41e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\r"},{"line_number":13,"context_line":"\"\"\"\r"},{"line_number":14,"context_line":"Time Trigger. Reference the implementation of\r"},{"line_number":15,"context_line":"APScheduler(https://pypi.python.org/pypi/APScheduler)\r"},{"line_number":16,"context_line":"\"\"\"\r"},{"line_number":17,"context_line":"\r"},{"line_number":18,"context_line":"from oslo_log import log as logging\r"}],"source_content_type":"text/x-python","patch_set":18,"id":"5aef4532_64824a96","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":11},"updated":"2016-03-08 02:10:41.000000000","message":"suggest to add more description to explain why do not use APScheduler directly","commit_id":"b6fdff51609b5bb6dc1f9afaaee9c196ae12485c"}],"smaug/operationengine/engine/triggers/timetrigger/trigger_time_format_manager.py":[{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def check_time_format(self, format_type, pattern):\r"},{"line_number":41,"context_line":"        \"\"\"Check time format\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"        :param pattern: The pattern of the time\r"},{"line_number":44,"context_line":"        \"\"\"\r"},{"line_number":45,"context_line":"        cls \u003d self._get_timeformat_cls(format_type)\r"},{"line_number":46,"context_line":"        cls.check_time_format(pattern)\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_aef7c289","line":43,"range":{"start_line":43,"start_character":9,"end_line":43,"end_character":14},"updated":"2016-02-29 09:11:36.000000000","message":"suggest to add the description of \"format_type\" parameter","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def check_time_format(self, format_type, pattern):\r"},{"line_number":41,"context_line":"        \"\"\"Check time format\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"        :param pattern: The pattern of the time\r"},{"line_number":44,"context_line":"        \"\"\"\r"},{"line_number":45,"context_line":"        cls \u003d self._get_timeformat_cls(format_type)\r"},{"line_number":46,"context_line":"        cls.check_time_format(pattern)\r"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_890f5a87","line":43,"range":{"start_line":43,"start_character":9,"end_line":43,"end_character":14},"in_reply_to":"9aed3d3a_aef7c289","updated":"2016-03-03 02:50:00.000000000","message":"got it","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"}],"smaug/operationengine/manager.py":[{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def __init__(self, service_name\u003dNone,"},{"line_number":39,"context_line":"                 *args, **kwargs):"},{"line_number":40,"context_line":"        super(OperationEngineManager, self).__init__(*args, **kwargs)"},{"line_number":41,"context_line":"        self.protection_api \u003d protection_api.API()"},{"line_number":42,"context_line":"        self._time_trigger \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def create_scheduled_operation(self, context, request_spec\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_313833ef","line":41,"range":{"start_line":41,"start_character":13,"end_line":41,"end_character":27},"updated":"2016-02-29 09:11:36.000000000","message":"I am not sure why need this? please check if it\u0027s necessary to use the protection API here.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def __init__(self, service_name\u003dNone,"},{"line_number":39,"context_line":"                 *args, **kwargs):"},{"line_number":40,"context_line":"        super(OperationEngineManager, self).__init__(*args, **kwargs)"},{"line_number":41,"context_line":"        self.protection_api \u003d protection_api.API()"},{"line_number":42,"context_line":"        self._time_trigger \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def create_scheduled_operation(self, context, request_spec\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_c96cc237","line":41,"range":{"start_line":41,"start_character":13,"end_line":41,"end_character":27},"in_reply_to":"9aed3d3a_313833ef","updated":"2016-03-03 02:50:00.000000000","message":"got it. thanks.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"6e3abffa9da1940ae4360f76b3b759cd58b774c5","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self._time_trigger \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def create_scheduled_operation(self, context, request_spec\u003dNone):"},{"line_number":45,"context_line":"        LOG.debug(\"Received a rpc call from a api service.\""},{"line_number":46,"context_line":"                  \"request_spec:%s\", request_spec)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def init_host(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aed3d3a_ac07ca16","line":45,"range":{"start_line":45,"start_character":19,"end_line":45,"end_character":27},"updated":"2016-02-29 09:11:36.000000000","message":"add marker function please.","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"7de1359b60b5a925aa02004c537d996d1a146709","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self._time_trigger \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def create_scheduled_operation(self, context, request_spec\u003dNone):"},{"line_number":45,"context_line":"        LOG.debug(\"Received a rpc call from a api service.\""},{"line_number":46,"context_line":"                  \"request_spec:%s\", request_spec)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def init_host(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7af24918_c9da02e8","line":45,"range":{"start_line":45,"start_character":19,"end_line":45,"end_character":27},"in_reply_to":"9aed3d3a_ac07ca16","updated":"2016-03-03 02:50:00.000000000","message":"no need to add marker for debug","commit_id":"44c7f11021efd5290723a0db6bb78a0f7d9532b3"}],"smaug/tests/unit/operationengine/engine/triggers/timetrigger/test_job.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        try:"},{"line_number":31,"context_line":"            Job(None, None, trigger_property)"},{"line_number":32,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":33,"context_line":"            bingo \u003d 1 if ex.msg.find(\"format\") \u003e\u003d 0 else 0"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_trigger_none_pattern(self):"},{"line_number":38,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_eb726648","line":35,"range":{"start_line":33,"start_character":0,"end_line":35,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"You could use assertRaisesRegex instead of bingo and find","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        try:"},{"line_number":31,"context_line":"            Job(None, None, trigger_property)"},{"line_number":32,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":33,"context_line":"            bingo \u003d 1 if ex.msg.find(\"format\") \u003e\u003d 0 else 0"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_trigger_none_pattern(self):"},{"line_number":38,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_24760aa4","line":35,"range":{"start_line":33,"start_character":0,"end_line":35,"end_character":34},"in_reply_to":"1af94dfe_eb726648","updated":"2016-03-18 05:59:32.000000000","message":"got it. Thank you very much.","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        bingo \u003d 0"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            Job(None, None, trigger_property)"},{"line_number":46,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":47,"context_line":"            bingo \u003d 1 if ex.msg.find(\"pattern\") \u003e\u003d 0 else 0"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_trigger_pattern_format(self):"},{"line_number":52,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_ab9fbe4e","line":49,"range":{"start_line":46,"start_character":0,"end_line":49,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"ditto","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        bingo \u003d 0"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            Job(None, None, trigger_property)"},{"line_number":46,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":47,"context_line":"            bingo \u003d 1 if ex.msg.find(\"pattern\") \u003e\u003d 0 else 0"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_trigger_pattern_format(self):"},{"line_number":52,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_047b0e8d","line":49,"range":{"start_line":46,"start_character":0,"end_line":49,"end_character":34},"in_reply_to":"1af94dfe_ab9fbe4e","updated":"2016-03-18 05:59:32.000000000","message":"Done","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        bingo \u003d 0"},{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            Job(None, None, trigger_property)"},{"line_number":60,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":61,"context_line":"            bingo \u003d 1 if ex.msg.find(\"pattern\") \u003e\u003d 0 else 0"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_trigger_window(self):"},{"line_number":66,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_eba9c67c","line":63,"range":{"start_line":60,"start_character":0,"end_line":63,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"ditto","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        bingo \u003d 0"},{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            Job(None, None, trigger_property)"},{"line_number":60,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":61,"context_line":"            bingo \u003d 1 if ex.msg.find(\"pattern\") \u003e\u003d 0 else 0"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_trigger_window(self):"},{"line_number":66,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_447196a7","line":63,"range":{"start_line":60,"start_character":0,"end_line":63,"end_character":34},"in_reply_to":"1af94dfe_eba9c67c","updated":"2016-03-18 05:59:32.000000000","message":"Done","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        bingo \u003d 0"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            Job(None, None, trigger_property)"},{"line_number":75,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":76,"context_line":"            bingo \u003d 1 if ex.msg.find(\"window\") \u003e\u003d 0 else 0"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_trigger_start_time(self):"},{"line_number":81,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_8bb122e4","line":78,"range":{"start_line":75,"start_character":0,"end_line":78,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"ditto","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        bingo \u003d 0"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            Job(None, None, trigger_property)"},{"line_number":75,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":76,"context_line":"            bingo \u003d 1 if ex.msg.find(\"window\") \u003e\u003d 0 else 0"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_trigger_start_time(self):"},{"line_number":81,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_a46a1ab1","line":78,"range":{"start_line":75,"start_character":0,"end_line":78,"end_character":34},"in_reply_to":"1af94dfe_8bb122e4","updated":"2016-03-18 05:59:32.000000000","message":"Done","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        bingo \u003d 0"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            Job(None, None, trigger_property)"},{"line_number":91,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":92,"context_line":"            bingo \u003d 1 if ex.msg.find(\"start_time\") \u003e\u003d 0 else 0"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def test_trigger_end_time(self):"},{"line_number":97,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_cbcb2a52","line":94,"range":{"start_line":91,"start_character":0,"end_line":94,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"ditto","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        bingo \u003d 0"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            Job(None, None, trigger_property)"},{"line_number":91,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":92,"context_line":"            bingo \u003d 1 if ex.msg.find(\"start_time\") \u003e\u003d 0 else 0"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def test_trigger_end_time(self):"},{"line_number":97,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_84671ee8","line":94,"range":{"start_line":91,"start_character":0,"end_line":94,"end_character":34},"in_reply_to":"1af94dfe_cbcb2a52","updated":"2016-03-18 05:59:32.000000000","message":"Done","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        bingo \u003d 0"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            Job(None, None, trigger_property)"},{"line_number":107,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":108,"context_line":"            bingo \u003d 1 if ex.msg.find(\"end_time\") \u003e\u003d 0 else 0"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def test_update_next_run_time(self):"},{"line_number":113,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_ebc0a62c","line":110,"range":{"start_line":107,"start_character":0,"end_line":110,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"ditto","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        bingo \u003d 0"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            Job(None, None, trigger_property)"},{"line_number":107,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":108,"context_line":"            bingo \u003d 1 if ex.msg.find(\"end_time\") \u003e\u003d 0 else 0"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def test_update_next_run_time(self):"},{"line_number":113,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_e460a2d1","line":110,"range":{"start_line":107,"start_character":0,"end_line":110,"end_character":34},"in_reply_to":"1af94dfe_ebc0a62c","updated":"2016-03-18 05:59:32.000000000","message":"Done","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"}],"smaug/tests/unit/operationengine/engine/triggers/timetrigger/test_job_store.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        bingo \u003d 0"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            job_store.add_job(job)"},{"line_number":37,"context_line":"        except exception.InvalidOperationObject as ex:"},{"line_number":38,"context_line":"            bingo \u003d 1 if ex.msg.find(\"next\") \u003e\u003d 0 else 0"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_add_same_job(self):"},{"line_number":43,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_cbb16a91","line":40,"range":{"start_line":37,"start_character":0,"end_line":40,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"ditto in this file also","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        bingo \u003d 0"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            job_store.add_job(job)"},{"line_number":37,"context_line":"        except exception.InvalidOperationObject as ex:"},{"line_number":38,"context_line":"            bingo \u003d 1 if ex.msg.find(\"next\") \u003e\u003d 0 else 0"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_add_same_job(self):"},{"line_number":43,"context_line":"        trigger_property \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_24844a5c","line":40,"range":{"start_line":37,"start_character":0,"end_line":40,"end_character":34},"in_reply_to":"1af94dfe_cbb16a91","updated":"2016-03-18 05:59:32.000000000","message":"Done","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"}],"smaug/tests/unit/operationengine/engine/triggers/timetrigger/test_time_trigger.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"c1d5e012996ebb343c74e9aa7dd94ea8006181fa","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        try:"},{"line_number":70,"context_line":"            time_trigger.register_operation(1, \"op\","},{"line_number":71,"context_line":"                                            trigger_property\u003dtrigger_property)"},{"line_number":72,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":73,"context_line":"            bingo \u003d 1 if ex.msg.find(\"pattern\") \u003e\u003d 0 else 0"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_unregister_operation(self):"},{"line_number":78,"context_line":"        executor \u003d FakeExecutor()"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_4b643a21","line":75,"range":{"start_line":72,"start_character":0,"end_line":75,"end_character":34},"updated":"2016-03-17 10:05:19.000000000","message":"ditto in this file","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"18219f75a2c1921c23a3bf7a04b573fc8e01ece7","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        try:"},{"line_number":70,"context_line":"            time_trigger.register_operation(1, \"op\","},{"line_number":71,"context_line":"                                            trigger_property\u003dtrigger_property)"},{"line_number":72,"context_line":"        except exception.InvalidInput as ex:"},{"line_number":73,"context_line":"            bingo \u003d 1 if ex.msg.find(\"pattern\") \u003e\u003d 0 else 0"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertEqual(1, bingo)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_unregister_operation(self):"},{"line_number":78,"context_line":"        executor \u003d FakeExecutor()"}],"source_content_type":"text/x-python","patch_set":24,"id":"1af94dfe_e48ee277","line":75,"range":{"start_line":72,"start_character":0,"end_line":75,"end_character":34},"in_reply_to":"1af94dfe_4b643a21","updated":"2016-03-18 05:59:32.000000000","message":"Done","commit_id":"9cb2889b20e92fc312b81b2f7d5de010384aa5ab"}]}
