)]}'
{"karbor/services/operationengine/engine/triggers/timetrigger/calendar_time.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"272a190864490452fc29239538a80b54a97867cc","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class ICal(object):"},{"line_number":35,"context_line":"    \"\"\"icalendar.\"\"\""},{"line_number":36,"context_line":"    FORMAT_TYPE \u003d \"ical\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, dtstart, pattern):"},{"line_number":39,"context_line":"        self.dtstart, self.rrule_obj \u003d self.get_rrule_obj(pattern)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_112de494","line":36,"range":{"start_line":36,"start_character":4,"end_line":36,"end_character":15},"updated":"2016-08-30 02:18:31.000000000","message":"I think it is not used now.","commit_id":"0789905407f722ba61bd96bae87fc88d1537c74c"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"272a190864490452fc29239538a80b54a97867cc","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def __init__(self, dtstart, pattern):"},{"line_number":39,"context_line":"        self.dtstart, self.rrule_obj \u003d self.get_rrule_obj(pattern)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @staticmethod"},{"line_number":42,"context_line":"    def timezone_transfer(dt):"},{"line_number":43,"context_line":"        if dt.tzinfo is not None:"},{"line_number":44,"context_line":"            dt \u003d dt.astimezone(tz\u003dtz.gettz(\"UTC\")).replace(tzinfo\u003dNone)"},{"line_number":45,"context_line":"        return dt"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def _rrule_obj(rrules, dtstart):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_716ab0b4","line":45,"range":{"start_line":41,"start_character":0,"end_line":45,"end_character":17},"updated":"2016-08-30 02:18:31.000000000","message":"In Karbor, we only use \u0027utc\u0027 timezone, so there is no need to change the time which is \u0027utc\u0027 time now.","commit_id":"0789905407f722ba61bd96bae87fc88d1537c74c"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"272a190864490452fc29239538a80b54a97867cc","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                                    for recur in rrule_list)"},{"line_number":52,"context_line":"        return rrule.rrulestr(rrule_str, dtstart\u003ddtstart)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_rrule_obj(self, pattern):"},{"line_number":55,"context_line":"        cal \u003d Calendar.from_ical(pattern)"},{"line_number":56,"context_line":"        event \u003d cal.walk(\u0027VEVENT\u0027)[0]"},{"line_number":57,"context_line":"        dt \u003d event.get(\u0027DTSTART\u0027).dt"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_517f6c65","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":21},"updated":"2016-08-30 02:18:31.000000000","message":"It is better to change the name to _get_rrule_obj since it is the \nprivate method.","commit_id":"0789905407f722ba61bd96bae87fc88d1537c74c"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"272a190864490452fc29239538a80b54a97867cc","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            # and only consist of one \u0027VEVENT\u0027 component."},{"line_number":73,"context_line":"            vevent \u003d cal_obj.walk(\u0027VEVENT\u0027)[0]"},{"line_number":74,"context_line":"            # Component must has \u0027DTSTART\u0027 and \u0027RRULE\u0027 property"},{"line_number":75,"context_line":"            if vevent.get(\u0027DTSTART\u0027) is None or vevent.get(\u0027RRULE\u0027) is None:"},{"line_number":76,"context_line":"                raise"},{"line_number":77,"context_line":"        except Exception:"},{"line_number":78,"context_line":"            msg \u003d (_(\"The trigger pattern(%s) is invalid\") % pattern)"},{"line_number":79,"context_line":"            raise exception.InvalidInput(msg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_9125740a","line":76,"range":{"start_line":75,"start_character":0,"end_line":76,"end_character":21},"updated":"2016-08-30 02:18:31.000000000","message":"I think it is better to remove these two statements out of try, \nand use \u0027raise exception.InvalidInput\u0027 instead of single raise.","commit_id":"0789905407f722ba61bd96bae87fc88d1537c74c"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1d32348a18cec777dc24202aef1ce75493c79f96","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        :return int(seconds) or None"},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        if self.rrule_obj._cache_complete:"},{"line_number":95,"context_line":"            gen \u003d self.rrule_obj._cache"},{"line_number":96,"context_line":"            endtime \u003d gen[-1]"},{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            gen \u003d self.rrule_obj"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_e68a5a1a","line":95,"range":{"start_line":95,"start_character":23,"end_line":95,"end_character":39},"updated":"2016-08-30 14:32:26.000000000","message":"Accessing a private","commit_id":"770d7f137965fb06cc0428003166338309e49b88"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1d32348a18cec777dc24202aef1ce75493c79f96","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            else:"},{"line_number":103,"context_line":"                rrule_objs \u003d [gen]"},{"line_number":104,"context_line":"            for rrule_obj in rrule_objs:"},{"line_number":105,"context_line":"                freq_list.append(rrule_obj._freq)"},{"line_number":106,"context_line":"            min_freq \u003d max(freq_list)"},{"line_number":107,"context_line":"            kwargs \u003d FREQTOKWARGS[min_freq]"},{"line_number":108,"context_line":"            endtime \u003d self.dtstart + timedelta(**kwargs)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_a405ad46","line":105,"range":{"start_line":105,"start_character":33,"end_line":105,"end_character":48},"updated":"2016-08-30 14:32:26.000000000","message":"You are accessing a private value of rrule. Why is that?","commit_id":"770d7f137965fb06cc0428003166338309e49b88"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"9d8cee3f83acec5dedf938f2440dfbec4549c256","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            \"SECONDLY\": 6}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ICal(object):"},{"line_number":42,"context_line":"    \"\"\"icalendar.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, dtstart, pattern):"},{"line_number":45,"context_line":"        cal \u003d Calendar.from_ical(pattern)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_9a4ec994","line":42,"range":{"start_line":41,"start_character":0,"end_line":42,"end_character":20},"updated":"2016-09-15 07:01:18.000000000","message":"Missing FORMAT_TYPE class variable","commit_id":"ef406da1b6bc52e6e809a247421e32056d408680"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"9d8cee3f83acec5dedf938f2440dfbec4549c256","unresolved":false,"context_lines":[{"line_number":41,"context_line":"class ICal(object):"},{"line_number":42,"context_line":"    \"\"\"icalendar.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, dtstart, pattern):"},{"line_number":45,"context_line":"        cal \u003d Calendar.from_ical(pattern)"},{"line_number":46,"context_line":"        vevent \u003d cal.walk(\u0027VEVENT\u0027)[0]"},{"line_number":47,"context_line":"        self.dtstart \u003d dtstart"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_5af9a14c","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":41},"updated":"2016-09-15 07:01:18.000000000","message":"timeformat objects are not instantized","commit_id":"ef406da1b6bc52e6e809a247421e32056d408680"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"ecb0c34f8d607686e80d474657a4d6d23c732bce","unresolved":false,"context_lines":[{"line_number":41,"context_line":"class ICal(object):"},{"line_number":42,"context_line":"    \"\"\"icalendar.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, dtstart, pattern):"},{"line_number":45,"context_line":"        cal \u003d Calendar.from_ical(pattern)"},{"line_number":46,"context_line":"        vevent \u003d cal.walk(\u0027VEVENT\u0027)[0]"},{"line_number":47,"context_line":"        self.dtstart \u003d dtstart"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_4999161f","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":41},"in_reply_to":"7a8ec9b2_5af9a14c","updated":"2016-09-20 03:54:17.000000000","message":"@yuval, time trigger will use an instance of time format class instead of class itself. please see this patch to get details, thanks.\nhttps://review.openstack.org/#/c/352826/","commit_id":"ef406da1b6bc52e6e809a247421e32056d408680"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"ecb0c34f8d607686e80d474657a4d6d23c732bce","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                freq_list.append(RREQ_MAP[freq.upper()])"},{"line_number":67,"context_line":"        return max(freq_list)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"},{"line_number":70,"context_line":"    def check_time_format(pattern):"},{"line_number":71,"context_line":"        \"\"\"Check time format"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_89ba3e6d","line":69,"range":{"start_line":69,"start_character":4,"end_line":69,"end_character":17},"updated":"2016-09-20 03:54:17.000000000","message":"change it to \u0027classmethod\u0027 to keep in consistence, thanks.","commit_id":"ef406da1b6bc52e6e809a247421e32056d408680"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"9d8cee3f83acec5dedf938f2440dfbec4549c256","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                     \"include less than one RRULE property\") % pattern)"},{"line_number":93,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def compute_next_time(self, current_time):"},{"line_number":96,"context_line":"        \"\"\"Compute next time"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        :param current_time: the time before the next time"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_1a22b9b9","line":95,"range":{"start_line":95,"start_character":0,"end_line":95,"end_character":46},"updated":"2016-09-15 07:01:18.000000000","message":"should be classmethod","commit_id":"ef406da1b6bc52e6e809a247421e32056d408680"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"9d8cee3f83acec5dedf938f2440dfbec4549c256","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        next_time \u003d self.rrule_obj.after(current_time)"},{"line_number":102,"context_line":"        return next_time if next_time else None"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def get_min_interval(self):"},{"line_number":105,"context_line":"        \"\"\"Get minimum interval of two adjacent time points"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        :return int(seconds) or None"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_dd5beb2c","line":104,"range":{"start_line":104,"start_character":0,"end_line":104,"end_character":31},"updated":"2016-09-15 07:01:18.000000000","message":"couldn\u0027t find this method anywhere else. who calls it?","commit_id":"ef406da1b6bc52e6e809a247421e32056d408680"}],"karbor/services/operationengine/engine/triggers/timetrigger/timeformats/calendar_time.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"1e8817bf37c05c68c929f217ec0b458588414238","unresolved":false,"context_lines":[{"line_number":33,"context_line":"UTC_TZINFO \u003d tz.gettz(\"UTC\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class Calendar(timeformats.TimeFormat):"},{"line_number":37,"context_line":"    \"\"\"recurrence rule.\"\"\""},{"line_number":38,"context_line":"    FORMAT_TYPE \u003d \"rrule\""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_ab30959f","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":39},"updated":"2016-08-28 13:44:13.000000000","message":"maybe change name to iCal or ICal?","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"fbfb0ff16c4b51603d0602ffce342ef0bf05499f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"UTC_TZINFO \u003d tz.gettz(\"UTC\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class Calendar(timeformats.TimeFormat):"},{"line_number":37,"context_line":"    \"\"\"recurrence rule.\"\"\""},{"line_number":38,"context_line":"    FORMAT_TYPE \u003d \"rrule\""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_e742c93d","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":39},"in_reply_to":"fa7ab95a_ab30959f","updated":"2016-08-29 00:58:35.000000000","message":"ok","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"1e8817bf37c05c68c929f217ec0b458588414238","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class Calendar(timeformats.TimeFormat):"},{"line_number":37,"context_line":"    \"\"\"recurrence rule.\"\"\""},{"line_number":38,"context_line":"    FORMAT_TYPE \u003d \"rrule\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def to_ical(cls, recur_list):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_0b226152","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":25},"updated":"2016-08-28 13:44:13.000000000","message":"ical?","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"fbfb0ff16c4b51603d0602ffce342ef0bf05499f","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class Calendar(timeformats.TimeFormat):"},{"line_number":37,"context_line":"    \"\"\"recurrence rule.\"\"\""},{"line_number":38,"context_line":"    FORMAT_TYPE \u003d \"rrule\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def to_ical(cls, recur_list):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_073ecdb7","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":25},"in_reply_to":"fa7ab95a_0b226152","updated":"2016-08-29 00:58:35.000000000","message":"ok","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"e79e472471724471c3ca689062d6d01c2589f08f","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def to_ical(cls, recur_list):"},{"line_number":42,"context_line":"        retval \u003d os.linesep"},{"line_number":43,"context_line":"        for recur in recur_list:"},{"line_number":44,"context_line":"            if recur:"},{"line_number":45,"context_line":"                retval +\u003d (recur.to_ical().decode(\"utf-8\") + os.linesep)"},{"line_number":46,"context_line":"        return retval"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @staticmethod"},{"line_number":49,"context_line":"    def timezone_transfer(dt):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_133617e6","line":46,"range":{"start_line":42,"start_character":0,"end_line":46,"end_character":21},"updated":"2016-08-28 14:38:33.000000000","message":"return os.linesep.join(recur.to_ical().decode(\"utf-8\") for recur in recur_list)","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"1e8817bf37c05c68c929f217ec0b458588414238","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            cal_tmp \u003d Cal_cls.from_ical(pattern)"},{"line_number":78,"context_line":"            # Here, Calendar object must specifies component as a \u0027VEVENT\u0027,"},{"line_number":79,"context_line":"            # and only consist of one \u0027VEVENT\u0027 component."},{"line_number":80,"context_line":"            vevent \u003d cal_tmp.walk(\u0027VEVENT\u0027)[0]"},{"line_number":81,"context_line":"            # Component must has \u0027DTSTART\u0027 and \u0027RRULE\u0027 property"},{"line_number":82,"context_line":"            if vevent.get(\u0027DTSTART\u0027) is None or vevent.get(\u0027RRULE\u0027) is None:"},{"line_number":83,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_40bb630e","line":80,"range":{"start_line":78,"start_character":0,"end_line":80,"end_character":46},"updated":"2016-08-28 13:44:13.000000000","message":"what if there are not VEVENTs or multiple?","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"fbfb0ff16c4b51603d0602ffce342ef0bf05499f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            cal_tmp \u003d Cal_cls.from_ical(pattern)"},{"line_number":78,"context_line":"            # Here, Calendar object must specifies component as a \u0027VEVENT\u0027,"},{"line_number":79,"context_line":"            # and only consist of one \u0027VEVENT\u0027 component."},{"line_number":80,"context_line":"            vevent \u003d cal_tmp.walk(\u0027VEVENT\u0027)[0]"},{"line_number":81,"context_line":"            # Component must has \u0027DTSTART\u0027 and \u0027RRULE\u0027 property"},{"line_number":82,"context_line":"            if vevent.get(\u0027DTSTART\u0027) is None or vevent.get(\u0027RRULE\u0027) is None:"},{"line_number":83,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_2792f19e","line":80,"range":{"start_line":78,"start_character":0,"end_line":80,"end_character":46},"in_reply_to":"fa7ab95a_40bb630e","updated":"2016-08-29 00:58:35.000000000","message":"If there is no VEVENT, there will be no DTSTART or RRULE；\nAnd if there are multiple VEVENTs, i think there only need one DTSTART and RRULE to specify timeformat for trigger.","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"1e8817bf37c05c68c929f217ec0b458588414238","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            vevent \u003d cal_tmp.walk(\u0027VEVENT\u0027)[0]"},{"line_number":81,"context_line":"            # Component must has \u0027DTSTART\u0027 and \u0027RRULE\u0027 property"},{"line_number":82,"context_line":"            if vevent.get(\u0027DTSTART\u0027) is None or vevent.get(\u0027RRULE\u0027) is None:"},{"line_number":83,"context_line":"                raise"},{"line_number":84,"context_line":"        except Exception:"},{"line_number":85,"context_line":"            msg \u003d (_(\"The trigger pattern(%s) is invalid\") % pattern)"},{"line_number":86,"context_line":"            raise exception.InvalidInput(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_603867a1","line":83,"range":{"start_line":83,"start_character":0,"end_line":83,"end_character":21},"updated":"2016-08-28 13:44:13.000000000","message":"raise what?","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"fbfb0ff16c4b51603d0602ffce342ef0bf05499f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            vevent \u003d cal_tmp.walk(\u0027VEVENT\u0027)[0]"},{"line_number":81,"context_line":"            # Component must has \u0027DTSTART\u0027 and \u0027RRULE\u0027 property"},{"line_number":82,"context_line":"            if vevent.get(\u0027DTSTART\u0027) is None or vevent.get(\u0027RRULE\u0027) is None:"},{"line_number":83,"context_line":"                raise"},{"line_number":84,"context_line":"        except Exception:"},{"line_number":85,"context_line":"            msg \u003d (_(\"The trigger pattern(%s) is invalid\") % pattern)"},{"line_number":86,"context_line":"            raise exception.InvalidInput(msg)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_c7f785f3","line":83,"range":{"start_line":83,"start_character":0,"end_line":83,"end_character":21},"in_reply_to":"fa7ab95a_603867a1","updated":"2016-08-29 00:58:35.000000000","message":"If there is no VEVENT, there will be no DTSTART or RRULE；\u0027raise\u0027 will raise an exception for next statement.","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9b697d35af3e18db399fe11a505830fac75ec88b","unresolved":false,"context_lines":[{"line_number":33,"context_line":"UTC_TZINFO \u003d tz.gettz(\"UTC\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class iCal(timeformats.TimeFormat):"},{"line_number":37,"context_line":"    \"\"\"icalendar.\"\"\""},{"line_number":38,"context_line":"    FORMAT_TYPE \u003d \"ical\""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_5993554f","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":10},"updated":"2016-08-29 07:40:51.000000000","message":"I think \u0027ICal\u0027 is better to keep consistent with other classes.","commit_id":"596de426e8bd70b72a19d53c7869b6c16cee4f5a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9b697d35af3e18db399fe11a505830fac75ec88b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    @staticmethod"},{"line_number":46,"context_line":"    def timezone_transfer(dt):"},{"line_number":47,"context_line":"        if dt.tzinfo is not None:"},{"line_number":48,"context_line":"            dt \u003d dt.astimezone(tz\u003dUTC_TZINFO).replace(tzinfo\u003dNone)"},{"line_number":49,"context_line":"        return dt"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_19c1cd2e","line":48,"range":{"start_line":48,"start_character":34,"end_line":48,"end_character":44},"updated":"2016-08-29 07:40:51.000000000","message":"If it is only used once, it is better to use \u0027tz.gettz(\"UTC\")\u0027 instead.","commit_id":"596de426e8bd70b72a19d53c7869b6c16cee4f5a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9b697d35af3e18db399fe11a505830fac75ec88b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return rrule.rrulestr(rrule_str, dtstart\u003ddtstart, cache\u003dTrue)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def get_rrule_obj(cls, pattern):"},{"line_number":59,"context_line":"        cal \u003d Calendar.from_ical(pattern)"},{"line_number":60,"context_line":"        event \u003d cal.walk(\u0027VEVENT\u0027)[0]"},{"line_number":61,"context_line":"        dt \u003d event.get(\u0027DTSTART\u0027).dt"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_19d8ed1c","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":21},"updated":"2016-08-29 07:40:51.000000000","message":"As we discussed, time trigger will create an instance of this class to compute next time. Please change it to instance method.","commit_id":"596de426e8bd70b72a19d53c7869b6c16cee4f5a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9b697d35af3e18db399fe11a505830fac75ec88b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @classmethod"},{"line_number":86,"context_line":"    def compute_next_time(cls, pattern, current_time):"},{"line_number":87,"context_line":"        \"\"\"Compute next time"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param pattern: The pattern of the icalendar time"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_b9554151","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":25},"updated":"2016-08-29 07:40:51.000000000","message":"ditto","commit_id":"596de426e8bd70b72a19d53c7869b6c16cee4f5a"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9b697d35af3e18db399fe11a505830fac75ec88b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        return next_time if next_time else None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @classmethod"},{"line_number":98,"context_line":"    def get_interval(cls, pattern):"},{"line_number":99,"context_line":"        \"\"\"Get minimum interval of two adjacent time points"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :param pattern: The pattern of the icalendar time"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_79d2d9d3","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":20},"updated":"2016-08-29 07:40:51.000000000","message":"ditto, and change the name to \u0027get_min_interval\u0027.","commit_id":"596de426e8bd70b72a19d53c7869b6c16cee4f5a"}],"karbor/tests/unit/operationengine/engine/triggers/timetrigger/test_calendar_time.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"35bfd5dde27c57664dde55d9f9c02336cc9ab73d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            try:"},{"line_number":64,"context_line":"                calendar_time.ICal.check_time_format(pattern)"},{"line_number":65,"context_line":"            except Exception as e:"},{"line_number":66,"context_line":"                self.assertIsInstance(e, Exception)"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                msg \u003d \"\\r\\nThe trigger pattern(%s) is valid.\\r\\n\" % pattern"},{"line_number":69,"context_line":"                self.assertTrue(0, msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_3833d815","line":66,"range":{"start_line":66,"start_character":16,"end_line":66,"end_character":51},"updated":"2016-09-07 02:58:39.000000000","message":"If the codes go here, then the type of \u0027e\u0027 must be Exception. so the assert is meaningless.","commit_id":"dba4ef385b8450c8ffbf037a6f56348714166466"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"35bfd5dde27c57664dde55d9f9c02336cc9ab73d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            except Exception as e:"},{"line_number":66,"context_line":"                self.assertIsInstance(e, Exception)"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                msg \u003d \"\\r\\nThe trigger pattern(%s) is valid.\\r\\n\" % pattern"},{"line_number":69,"context_line":"                self.assertTrue(0, msg)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_compute_next_time(self):"},{"line_number":72,"context_line":"        pattern1 \u003d \"BEGIN:VEVENT\\n\" \\"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_586a5cef","line":69,"range":{"start_line":68,"start_character":16,"end_line":69,"end_character":39},"updated":"2016-09-07 02:58:39.000000000","message":"I think the codes can not go here. Because all the patterns are invalid, exception will happen certainly.","commit_id":"dba4ef385b8450c8ffbf037a6f56348714166466"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"35bfd5dde27c57664dde55d9f9c02336cc9ab73d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            \"END:VCALENDAR\","},{"line_number":60,"context_line":"        ]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        for pattern in patterns:"},{"line_number":63,"context_line":"            try:"},{"line_number":64,"context_line":"                calendar_time.ICal.check_time_format(pattern)"},{"line_number":65,"context_line":"            except Exception as e:"},{"line_number":66,"context_line":"                self.assertIsInstance(e, Exception)"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                msg \u003d \"\\r\\nThe trigger pattern(%s) is valid.\\r\\n\" % pattern"},{"line_number":69,"context_line":"                self.assertTrue(0, msg)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_compute_next_time(self):"},{"line_number":72,"context_line":"        pattern1 \u003d \"BEGIN:VEVENT\\n\" \\"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_381af87d","line":69,"range":{"start_line":62,"start_character":0,"end_line":69,"end_character":39},"updated":"2016-09-07 02:58:39.000000000","message":"IMO, if you want to test ICal.check_time_format, you can test the all exceptions from it with different patterns.","commit_id":"dba4ef385b8450c8ffbf037a6f56348714166466"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"35bfd5dde27c57664dde55d9f9c02336cc9ab73d","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        time2 \u003d datetime(2016, 3, 26, 17, 1, 0)"},{"line_number":80,"context_line":"        self.assertEqual(time2, time1)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        pattern2 \u003d \"BEGIN:VEVENT\\n\" \\"},{"line_number":83,"context_line":"                   \"RRULE:FREQ\u003dWEEKLY;BYDAY\u003dMO,WE,FR;BYHOUR\u003d10;BYMINUTE\u003d0\\n\" \\"},{"line_number":84,"context_line":"                   \"RRULE:FREQ\u003dWEEKLY;BYDAY\u003dTU,TH,SA;BYHOUR\u003d20;BYMINUTE\u003d0\\n\" \\"},{"line_number":85,"context_line":"                   \"END:VEVENT\""},{"line_number":86,"context_line":"        dtstart \u003d datetime(2016, 2, 20, 17, 0, 0)"},{"line_number":87,"context_line":"        time_obj \u003d calendar_time.ICal(dtstart, pattern2)"},{"line_number":88,"context_line":"        now \u003d datetime(2016, 7, 31, 15, 11, 0)"},{"line_number":89,"context_line":"        time1 \u003d time_obj.compute_next_time(now)"},{"line_number":90,"context_line":"        time2 \u003d datetime(2016, 8, 1, 10, 0, 0)"},{"line_number":91,"context_line":"        self.assertEqual(time2, time1)"},{"line_number":92,"context_line":"        time3 \u003d time_obj.compute_next_time(time2)"},{"line_number":93,"context_line":"        time4 \u003d datetime(2016, 8, 2, 20, 0, 0)"},{"line_number":94,"context_line":"        self.assertEqual(time4, time3)"},{"line_number":95,"context_line":"        time5 \u003d time_obj.compute_next_time(time4)"},{"line_number":96,"context_line":"        time6 \u003d datetime(2016, 8, 3, 10, 0, 0)"},{"line_number":97,"context_line":"        self.assertEqual(time6, time5)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_get_min_interval(self):"},{"line_number":100,"context_line":"        pattern1 \u003d \"BEGIN:VEVENT\\n\" \\"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_bb3c42c9","line":97,"range":{"start_line":82,"start_character":0,"end_line":97,"end_character":38},"updated":"2016-09-07 02:58:39.000000000","message":"Maybe it is better not to define so many variables, you can reuse before\u0027s, such as pattern1, time1, time2.","commit_id":"dba4ef385b8450c8ffbf037a6f56348714166466"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"ebbf1e9e3eb1ae23ff38013f5ce48176631d6e3e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            \"END:VCALENDAR\","},{"line_number":61,"context_line":"        ]"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self.assertRaises(exception.InvalidInput,"},{"line_number":64,"context_line":"                          calendar_time.ICal.check_time_format,"},{"line_number":65,"context_line":"                          patterns)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_compute_next_time(self):"},{"line_number":68,"context_line":"        pattern \u003d \"BEGIN:VEVENT\\n\" \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_097be828","line":65,"range":{"start_line":63,"start_character":0,"end_line":65,"end_character":34},"updated":"2016-09-08 03:09:03.000000000","message":"there are 3 kinds of exceptions in \u0027check_time_format\u0027, do you need to test them separately?","commit_id":"0517eb4e917f36df8cc3e168d5b6ddd451d94f3c"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"b17da1e756a330a1c2e0a15dc5e17c3588e2e438","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            \"END:VCALENDAR\","},{"line_number":61,"context_line":"        ]"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self.assertRaises(exception.InvalidInput,"},{"line_number":64,"context_line":"                          calendar_time.ICal.check_time_format,"},{"line_number":65,"context_line":"                          patterns)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_compute_next_time(self):"},{"line_number":68,"context_line":"        pattern \u003d \"BEGIN:VEVENT\\n\" \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a89bdaa_04458f44","line":65,"range":{"start_line":63,"start_character":0,"end_line":65,"end_character":34},"in_reply_to":"9a89bdaa_097be828","updated":"2016-09-08 03:40:21.000000000","message":"ok, yes, that will be more clear.","commit_id":"0517eb4e917f36df8cc3e168d5b6ddd451d94f3c"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"0569a8296069af8f18b198cbbd58d71b056d78de","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        ]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        for pattern in patterns:"},{"line_number":83,"context_line":"            self.assertRaises(exception.InvalidRRulePropertyInput,"},{"line_number":84,"context_line":"                              calendar_time.ICal.check_time_format,"},{"line_number":85,"context_line":"                              pattern)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a89bdaa_37d523b9","line":83,"range":{"start_line":83,"start_character":12,"end_line":83,"end_character":65},"updated":"2016-09-09 02:58:22.000000000","message":"good job. but sorry, i have to suggest you that don\u0027t define three different exceptions. you can use exception.InvlidInput, and use self.assertRaisesRegexp to differentiate them as you do before.\n\nfor pattern in patterns:\n    self.assertRaisesRegexp(\n        exception.InvalidInput,\n        \u0027some message\u0027,                                          \n        calendar_time.ICal.check_time_format,\n        pattern)","commit_id":"8e733f386f563b7817ff9afe63ea6ce4e0593587"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"cb75ac15d9364328b8c232c52c2fed06b5c8a8f7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        ]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        for pattern in patterns:"},{"line_number":83,"context_line":"            self.assertRaises(exception.InvalidRRulePropertyInput,"},{"line_number":84,"context_line":"                              calendar_time.ICal.check_time_format,"},{"line_number":85,"context_line":"                              pattern)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a89bdaa_12258d5b","line":83,"range":{"start_line":83,"start_character":12,"end_line":83,"end_character":65},"in_reply_to":"9a89bdaa_37d523b9","updated":"2016-09-09 03:19:17.000000000","message":"Yes, I used to use self.assertRaisesRegexp to assert, but Yuval is recommended to use self.assertRaises on it.","commit_id":"8e733f386f563b7817ff9afe63ea6ce4e0593587"}],"karbor/tests/unit/operationengine/engine/triggers/timetrigger/timeformats/test_calendar_time.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"1e8817bf37c05c68c929f217ec0b458588414238","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_invalid_pattern(self):"},{"line_number":29,"context_line":"        patterns \u003d ["},{"line_number":30,"context_line":"            # 1"},{"line_number":31,"context_line":"            b\"\","},{"line_number":32,"context_line":"            # 2"},{"line_number":33,"context_line":"            b\"BEGIN:VEVENT\\n\""},{"line_number":34,"context_line":"            b\"END:VEVENT\","},{"line_number":35,"context_line":"            # 3"},{"line_number":36,"context_line":"            b\"BEGIN:VCALENDAR\\n\""},{"line_number":37,"context_line":"            b\"END:VCALENDAR\","},{"line_number":38,"context_line":"            # 4"},{"line_number":39,"context_line":"            b\"BEGIN:VEVENT\\n\""},{"line_number":40,"context_line":"            b\"RRULE:FREQ\u003dWEEKLY;INTERVAL\u003d1;BYHOUR\u003d17;BYMINUTE\u003d1\\n\""},{"line_number":41,"context_line":"            b\"END:VEVENT\","},{"line_number":42,"context_line":"            # 5"},{"line_number":43,"context_line":"            b\"BEGIN:VEVENT\\n\""},{"line_number":44,"context_line":"            b\"DTSTART:20070220T170000Z\\n\""},{"line_number":45,"context_line":"            b\"END:VEVENT\","},{"line_number":46,"context_line":"            # 6"},{"line_number":47,"context_line":"            b\"DTSTART:20070220T170000Z\\n\""},{"line_number":48,"context_line":"            b\"RRULE:FREQ\u003dWEEKLY;INTERVAL\u003d1;BYHOUR\u003d17;BYMINUTE\u003d1\\n\","},{"line_number":49,"context_line":"            # 7"},{"line_number":50,"context_line":"            b\"BEGIN:VCALENDAR\\n\""},{"line_number":51,"context_line":"            b\"DTSTART:20070220T170000\\n\""},{"line_number":52,"context_line":"            b\"RRULE:FREQ\u003dWEEKLY;INTERVAL\u003d1;BYHOUR\u003d17;BYMINUTE\u003d6\\n\""},{"line_number":53,"context_line":"            b\"END:VCALENDAR\","},{"line_number":54,"context_line":"            # 8"},{"line_number":55,"context_line":"            b\"BEGIN:VCALENDAR\\n\""},{"line_number":56,"context_line":"            b\"BEGIN:VEVENT\\n\""},{"line_number":57,"context_line":"            b\"DTSTART:20070220T170000\\n\""},{"line_number":58,"context_line":"            b\"RRULE:FREQ\u003dWEEKLY;INTERVAL\u003d1;BYHOUR\u003d17;BYMINUTE\u003d6\\n\""},{"line_number":59,"context_line":"            b\"END:VCALENDAR\","},{"line_number":60,"context_line":"            # 9"},{"line_number":61,"context_line":"            b\"BEGIN:VCALENDAR\\n\""},{"line_number":62,"context_line":"            b\"DTSTART:20070220T170000\\n\""},{"line_number":63,"context_line":"            b\"RRULE:FREQ\u003dWEEKLY;INTERVAL\u003d1;BYHOUR\u003d17;BYMINUTE\u003d6\\n\""},{"line_number":64,"context_line":"            b\"END:VEVENT\\n\","},{"line_number":65,"context_line":"            b\"END:VCALENDAR\","},{"line_number":66,"context_line":"        ]"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        regexp \u003d re.compile(\"^The trigger pattern.* is invalid$\", re.DOTALL)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_0b742166","line":65,"range":{"start_line":30,"start_character":0,"end_line":65,"end_character":29},"updated":"2016-08-28 13:44:13.000000000","message":"Why use \u0027bytes\u0027 and not string type?\nWhy are the comments needed?","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"1e8817bf37c05c68c929f217ec0b458588414238","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            self.assertRaisesRegexp(exception.InvalidInput,"},{"line_number":71,"context_line":"                                    regexp,"},{"line_number":72,"context_line":"                                    self._time_format.check_time_format,"},{"line_number":73,"context_line":"                                    pattern)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_compute_next_time(self):"},{"line_number":76,"context_line":"        pattern \u003d b\"BEGIN:VEVENT\\n\" \\"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_ab16d5a4","line":73,"range":{"start_line":73,"start_character":0,"end_line":73,"end_character":44},"updated":"2016-08-28 13:44:13.000000000","message":"I think we shouldn\u0027t rely on the text of an external library\u0027s exception. Just expecting the exception is fine, no need to regex the text","commit_id":"866c20d04b8cc30018a0884f292d0b5039c625cf"}]}
