)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0a7f4ef17c98f20d67b6c62589ee6ed34f70edc","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow \u0027forever_retry_uncaught_exceptions\u0027 to take a custom logger"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Sometimes it is more appropriate to use a projects own logger"},{"line_number":10,"context_line":"instead of the default root logger, so make such a thing possible"},{"line_number":11,"context_line":"to do."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a122d0e_b490da44","line":9,"range":{"start_line":9,"start_character":42,"end_line":9,"end_character":50},"updated":"2016-04-18 21:53:54.000000000","message":"project\u0027s","commit_id":"d02ea0f1e130a24cc3d1f87e7d59c6d21f8dd8c7"}],"oslo_utils/excutils.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0a7f4ef17c98f20d67b6c62589ee6ed34f70edc","unresolved":false,"context_lines":[{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    A custom logger (which defaults to the root logger) can also be passed"},{"line_number":240,"context_line":"    in via the ``logger`` keyword argument (allowing projects to specify"},{"line_number":241,"context_line":"    there own logger instead of the root)."},{"line_number":242,"context_line":"    \"\"\""},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def decorator(infunc):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_f4837202","line":241,"range":{"start_line":241,"start_character":4,"end_line":241,"end_character":9},"updated":"2016-04-18 21:53:54.000000000","message":"their","commit_id":"d02ea0f1e130a24cc3d1f87e7d59c6d21f8dd8c7"}],"oslo_utils/tests/test_excutils.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0a7f4ef17c98f20d67b6c62589ee6ed34f70edc","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class ForeverRetryUncaughtExceptionsTest(test_base.BaseTestCase):"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _exc_retrier_shared(self,"},{"line_number":166,"context_line":"                            mock_now, mock_sleep, mock_get_logger,"},{"line_number":167,"context_line":"                            exc_am, exc_id_it, monotonic_it\u003dNone):"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_b4ef3a86","line":165,"updated":"2016-04-18 21:53:54.000000000","message":"why _shared on the function name? Isn\u0027t that the point of a function that it can be shared?","commit_id":"d02ea0f1e130a24cc3d1f87e7d59c6d21f8dd8c7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0a7f4ef17c98f20d67b6c62589ee6ed34f70edc","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _exc_retrier_shared(self,"},{"line_number":166,"context_line":"                            mock_now, mock_sleep, mock_get_logger,"},{"line_number":167,"context_line":"                            exc_am, exc_id_it, monotonic_it\u003dNone):"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        def now_monotonic():"},{"line_number":170,"context_line":"            start \u003d int(time.time())"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_94e15ed3","line":167,"updated":"2016-04-18 21:53:54.000000000","message":"exc_am and exc_id_it need more descriptive names.","commit_id":"d02ea0f1e130a24cc3d1f87e7d59c6d21f8dd8c7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0a7f4ef17c98f20d67b6c62589ee6ed34f70edc","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        def iter_an_exception_to_raise():"},{"line_number":178,"context_line":"            for _i in range(0, exc_am):"},{"line_number":179,"context_line":"                exc_id \u003d six.next(exc_id_it)"},{"line_number":180,"context_line":"                yield Exception(\u0027unexpected %d\u0027 % exc_id)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        mock_logger \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_5446a6bf","line":179,"updated":"2016-04-18 21:53:54.000000000","message":"next() exists in py27. No need for six.","commit_id":"d02ea0f1e130a24cc3d1f87e7d59c6d21f8dd8c7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0a7f4ef17c98f20d67b6c62589ee6ed34f70edc","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        exc_am \u003d 1"},{"line_number":203,"context_line":"        mock_logger \u003d self._exc_retrier_shared(mock_now, mock_sleep,"},{"line_number":204,"context_line":"                                               mock_get_logger,"},{"line_number":205,"context_line":"                                               exc_am, itertools.cycle([1]))"},{"line_number":206,"context_line":"        mock_logger.exception.assert_called_with("},{"line_number":207,"context_line":"            \u0027Unexpected exception occurred 1 time(s)... retrying.\u0027)"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_d45e3675","line":205,"updated":"2016-04-18 21:53:54.000000000","message":"the \"itertools.cycle([1])\" magic value should be given a name, e.g., monotonic_it\u003ditertools.cycle([1]).\n\nNot that that really helps me understand what this is doing since its so obtuse.","commit_id":"d02ea0f1e130a24cc3d1f87e7d59c6d21f8dd8c7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0a7f4ef17c98f20d67b6c62589ee6ed34f70edc","unresolved":false,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    @mock.patch(\u0027logging.getLogger\u0027)"},{"line_number":279,"context_line":"    @mock.patch(\u0027time.sleep\u0027)"},{"line_number":280,"context_line":"    @mock.patch(\u0027oslo_utils.timeutils.now\u0027)"},{"line_number":281,"context_line":"    def test_exc_retrier_mixed_4exc_2min_gives_3logs(self, mock_now,"},{"line_number":282,"context_line":"                                                     mock_sleep,"},{"line_number":283,"context_line":"                                                     mock_get_logger):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a122d0e_94f2fe6d","line":280,"updated":"2016-04-18 21:53:54.000000000","message":"any way to do this in _exc_retrier_shared rather than having to copy-paste these to all the tests?","commit_id":"d02ea0f1e130a24cc3d1f87e7d59c6d21f8dd8c7"}]}
