)]}'
{"oslo_utils/tests/test_timeutils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dad11c85da521046ea80b200c69a535a5b5019f","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        @timeutils.time_it(fake_logger, log_level\u003dlogging.INFO,"},{"line_number":413,"context_line":"                           message\u003d\"That took a long time\")"},{"line_number":414,"context_line":"        def slow_function():"},{"line_number":415,"context_line":"            time.sleep(0.1)"},{"line_number":416,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_f59d190b","line":413,"updated":"2015-10-12 16:41:38.000000000","message":"If I were using this in nova, for example, and log_level were INFO, I\u0027d be passing an _LI object for i18n, so maybe that\u0027s what the test case should use.","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d11b91dc8d0fd739ec058870550f4807e595f760","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        @timeutils.time_it(fake_logger, log_level\u003dlogging.INFO,"},{"line_number":413,"context_line":"                           message\u003d\"That took a long time\")"},{"line_number":414,"context_line":"        def slow_function():"},{"line_number":415,"context_line":"            time.sleep(0.1)"},{"line_number":416,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_094bd92c","line":413,"in_reply_to":"7a2fa921_0e951f3f","updated":"2015-10-12 19:30:41.000000000","message":"So just tried that, bringing oslo.log in creates a circular dependency, soooo am going to avoid this, it should work as expected anyway.","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c0974ebbb5e11d5a0d4c2e61ae1377786479316a","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        @timeutils.time_it(fake_logger, log_level\u003dlogging.INFO,"},{"line_number":413,"context_line":"                           message\u003d\"That took a long time\")"},{"line_number":414,"context_line":"        def slow_function():"},{"line_number":415,"context_line":"            time.sleep(0.1)"},{"line_number":416,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_0e951f3f","line":413,"in_reply_to":"7a2fa921_f59d190b","updated":"2015-10-12 19:04:46.000000000","message":"Sure. Seems fine with me.","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dad11c85da521046ea80b200c69a535a5b5019f","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        mock_now.side_effect \u003d monotonic_iter(incr\u003d0.1)"},{"line_number":429,"context_line":"        fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        @timeutils.time_it(fake_logger, log_level\u003dlogging.INFO)"},{"line_number":432,"context_line":"        def slow_function():"},{"line_number":433,"context_line":"            time.sleep(0.1)"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_b5da41e8","line":431,"updated":"2015-10-12 16:41:38.000000000","message":"This is already tested in the previous test case.","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"dfdb7d1243bada788939604b5506558e140d5827","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        mock_now.side_effect \u003d monotonic_iter(incr\u003d0.1)"},{"line_number":450,"context_line":"        fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        @timeutils.time_it(fake_logger, message\u003d\"That took a long time\")"},{"line_number":453,"context_line":"        def slow_function():"},{"line_number":454,"context_line":"            time.sleep(0.1)"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_f004de4a","line":452,"updated":"2015-11-10 20:07:09.000000000","message":"Hum, don\u0027t you need to add a %s somewhere?\n\nlogging logs a TypeError if \"not all arguments converted during string formatting\".","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"93ef758fc7663833fc8b3743f2500af53d231136","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        mock_now.side_effect \u003d monotonic_iter(incr\u003d0.1)"},{"line_number":450,"context_line":"        fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        @timeutils.time_it(fake_logger, message\u003d\"That took a long time\")"},{"line_number":453,"context_line":"        def slow_function():"},{"line_number":454,"context_line":"            time.sleep(0.1)"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_e4578d24","line":452,"in_reply_to":"da85f559_507418ce","updated":"2015-11-13 18:29:21.000000000","message":"Actually due to interpolation with dicts this isn\u0027t needed.\n\n \u003e\u003e\u003e d \u003d {\u0027func_name\u0027: \u0027b\u0027}\n \u003e\u003e\u003e msg \u003d \"hello how are you\"\n \u003e\u003e\u003e msg % d\n \u0027hello how are you\u0027\n\nNothing bad happens...","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"6a30ecbfcad8cbad0723b115275542a54db6d36c","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        mock_now.side_effect \u003d monotonic_iter(incr\u003d0.1)"},{"line_number":450,"context_line":"        fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        @timeutils.time_it(fake_logger, message\u003d\"That took a long time\")"},{"line_number":453,"context_line":"        def slow_function():"},{"line_number":454,"context_line":"            time.sleep(0.1)"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_507418ce","line":452,"in_reply_to":"da85f559_f004de4a","updated":"2015-11-13 18:06:59.000000000","message":"Likely doesn\u0027t do to mocking...\n\n fake_logger \u003d mock.MagicMock(logging.getLogger(), autospec\u003dTrue)\n\nthat probably hides any errors, i\u0027ll adjust those to make it more realistic...","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"}],"oslo_utils/timeutils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6dad11c85da521046ea80b200c69a535a5b5019f","unresolved":false,"context_lines":[{"line_number":326,"context_line":"def time_it(logger, log_level\u003dlogging.DEBUG, message\u003dNone):"},{"line_number":327,"context_line":"    \"\"\"Decorator that will log how long its decorated function takes to run."},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    This does **not** output a log if the decorated function fails"},{"line_number":330,"context_line":"    with an exception."},{"line_number":331,"context_line":"    \"\"\""},{"line_number":332,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_75a90924","line":329,"updated":"2015-10-12 16:41:38.000000000","message":"You should probably have a unit test for the exception case.","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"a14db468ef538203cb32af553bc0b210aaeae902","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        @six.wraps(func)"},{"line_number":336,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":337,"context_line":"            with StopWatch() as w:"},{"line_number":338,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":339,"context_line":"            if not message:"},{"line_number":340,"context_line":"                logger.log(log_level,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_2ea34651","line":337,"updated":"2015-10-12 15:04:58.000000000","message":"StopWatch looks complex. Why not using a simpler code?\n\nstart \u003d now()\nresult \u003d func(...)\nelapsed \u003d now() - start","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"651e2a0f0fa60219c6e6cc551342916d2cdaea16","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        @six.wraps(func)"},{"line_number":336,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":337,"context_line":"            with StopWatch() as w:"},{"line_number":338,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":339,"context_line":"            if not message:"},{"line_number":340,"context_line":"                logger.log(log_level,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_7a61f8d2","line":337,"in_reply_to":"7a2fa921_1fa9d6df","updated":"2015-10-12 16:06:32.000000000","message":"The class has 5 attributes including a state. I don\u0027t think that we need such much code just to get a duration.\n\nNote: I never looked at StopWatch before.","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"ee48ae5d800fe11ad42c1c619e4b8de85bb5c645","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        @six.wraps(func)"},{"line_number":336,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":337,"context_line":"            with StopWatch() as w:"},{"line_number":338,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":339,"context_line":"            if not message:"},{"line_number":340,"context_line":"                logger.log(log_level,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_1fa9d6df","line":337,"in_reply_to":"7a2fa921_2ea34651","updated":"2015-10-12 15:47:33.000000000","message":"Complex huh? Wat, lol.\n\nWhat about using it here is complex?","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"8741f349f50a8271260272842bc0d7c613e153a0","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        @six.wraps(func)"},{"line_number":336,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":337,"context_line":"            with StopWatch() as w:"},{"line_number":338,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":339,"context_line":"            if not message:"},{"line_number":340,"context_line":"                logger.log(log_level,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a2fa921_f510b95b","line":337,"in_reply_to":"7a2fa921_7a61f8d2","updated":"2015-10-12 16:44:26.000000000","message":"Meh, thanks for the evaluation; but I\u0027ll agree to disagree, it serves its purpose, could it be simpler, sure, does it matter, imho no.","commit_id":"df1ac46fabf7a7a8886dc79b1731ec0d8472d451"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"a9595b567fb8da8f54585dab73a5246f5cdaa0a4","unresolved":false,"context_lines":[{"line_number":324,"context_line":""},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"def time_it(logger, log_level\u003dlogging.DEBUG,"},{"line_number":327,"context_line":"            message\u003dNone, enabled\u003dTrue):"},{"line_number":328,"context_line":"    \"\"\"Decorator that will log how long its decorated function takes to run."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    This does **not** output a log if the decorated function fails"}],"source_content_type":"text/x-python","patch_set":7,"id":"da85f559_9306d3cc","line":327,"updated":"2015-11-10 13:30:31.000000000","message":"yes, we can toggle switch  the log  by parameter enabled. One usage example is that passing CONF.debug to enabled.","commit_id":"7fd1abca77b15fb96ec77616ad190fe4f9ddf4a3"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"a492e311ff7442750398c678e6ed78c93189ecb0","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            if not enabled:"},{"line_number":339,"context_line":"                return func(*args, **kwargs)"},{"line_number":340,"context_line":"            with StopWatch() as w:"},{"line_number":341,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":342,"context_line":"            if not message:"},{"line_number":343,"context_line":"                logger.log(log_level,"},{"line_number":344,"context_line":"                           \"It took %(seconds).02f seconds to run\""}],"source_content_type":"text/x-python","patch_set":7,"id":"da85f559_536e2b02","line":341,"updated":"2015-11-10 13:37:49.000000000","message":"Again, I suggest to add an option to only emit a log if the function took longer than \u0027min_duration\u0027 seconds. For example, we can use a default value of min_duration\u003d0.01 since the default log (\"%.02f\") has a resolution of 10 ms (0.010 sec).\n\nOtherwise, emitting useless logs can have a negative impact on performances. And it can flood logs with useless lines like \"It took 0.00 seconds to run function xxx\".","commit_id":"7fd1abca77b15fb96ec77616ad190fe4f9ddf4a3"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"925ace075117cff0bc3a52aec4d38d1594a0ebc4","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            if not enabled:"},{"line_number":339,"context_line":"                return func(*args, **kwargs)"},{"line_number":340,"context_line":"            with StopWatch() as w:"},{"line_number":341,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":342,"context_line":"            if not message:"},{"line_number":343,"context_line":"                logger.log(log_level,"},{"line_number":344,"context_line":"                           \"It took %(seconds).02f seconds to run\""}],"source_content_type":"text/x-python","patch_set":7,"id":"da85f559_e7cc266c","line":341,"in_reply_to":"da85f559_536e2b02","updated":"2015-11-10 18:41:06.000000000","message":"Ok, fair enough for me. Will add.","commit_id":"7fd1abca77b15fb96ec77616ad190fe4f9ddf4a3"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"dfdb7d1243bada788939604b5506558e140d5827","unresolved":false,"context_lines":[{"line_number":324,"context_line":""},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"def time_it(logger, log_level\u003dlogging.DEBUG,"},{"line_number":327,"context_line":"            message\u003dNone, enabled\u003dTrue, min_duration\u003d0.01):"},{"line_number":328,"context_line":"    \"\"\"Decorator that will log how long its decorated function takes to run."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    This does **not** output a log if the decorated function fails"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_30b4a680","line":327,"updated":"2015-11-10 20:07:09.000000000","message":"You may put the default message here:\n\nmessage\u003d\"It took %(seconds).02f seconds to run function \u0027%(func_name)s\u0027\"\n\nIt helps to document the expected format, and it avoids an if below.\n\n--\n\nmin_duration\u003d0.01\n\nFYI the asyncio has a similar builtin feature to log \"slow\" function\", and the default threshold is 100 ms. But it\u0027s hard to find a \"good\" default value :-/ It depends of your use case. 100 ms was chosen to not flood logs (the feature is always enabled in debug mode). In asyncio, if a function takes longer than 100 ms it\u0027s really a severe bug, you are supposed to use threads or write async code instead.\n\nSince I don\u0027t really understand yet the use case where @time_it will be used, I don\u0027t know yet if 10 ms is a \"good\" default or not. For example, if a network calls a RPC using the network and calls the DB, 10 ms looks low (for me, 10 ms is an acceptable performance).","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"4e6d11b6af2dae740ad065240e4fd19bed1977ea","unresolved":false,"context_lines":[{"line_number":324,"context_line":""},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"def time_it(logger, log_level\u003dlogging.DEBUG,"},{"line_number":327,"context_line":"            message\u003dNone, enabled\u003dTrue, min_duration\u003d0.01):"},{"line_number":328,"context_line":"    \"\"\"Decorator that will log how long its decorated function takes to run."},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    This does **not** output a log if the decorated function fails"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_f02e6ca4","line":327,"in_reply_to":"da85f559_30b4a680","updated":"2015-11-13 18:08:36.000000000","message":"Use case where @time_it will be used \u003d\u003d where people find it useful to use this decorator, not really sure what other use case u are thinking, its a useful utility function for people to time functions/methods, doesn\u0027t seem so confusing to me why people would want this :-/","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"dfdb7d1243bada788939604b5506558e140d5827","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    is triggered or not (it is by default set to 0.01s to avoid logging"},{"line_number":335,"context_line":"    when durations and/or elapsed function call times are less than 0.01s, to"},{"line_number":336,"context_line":"    disable any \u0027min_duration\u0027 this value should be set to less than"},{"line_number":337,"context_line":"    or equal to zero or set to none)."},{"line_number":338,"context_line":"    \"\"\""},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def decorator(func):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_30334664","line":337,"updated":"2015-11-10 20:07:09.000000000","message":"the last sentence can be simplified to \"to disable any \u0027min_duration\u0027 this value should be set to None\".","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"dfdb7d1243bada788939604b5506558e140d5827","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    when durations and/or elapsed function call times are less than 0.01s, to"},{"line_number":336,"context_line":"    disable any \u0027min_duration\u0027 this value should be set to less than"},{"line_number":337,"context_line":"    or equal to zero or set to none)."},{"line_number":338,"context_line":"    \"\"\""},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def decorator(func):"},{"line_number":341,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_b02df6a9","line":338,"updated":"2015-11-10 20:07:09.000000000","message":"You should mention that message can use \"%(func_name)s\" and \"%(seconds).02f\" parameters.\n\nYou may also document the enabled parameter.","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"dfdb7d1243bada788939604b5506558e140d5827","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        @six.wraps(func)"},{"line_number":343,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":344,"context_line":"            if not enabled:"},{"line_number":345,"context_line":"                return func(*args, **kwargs)"},{"line_number":346,"context_line":"            with StopWatch() as w:"},{"line_number":347,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":348,"context_line":"            time_taken \u003d w.elapsed()"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_30aee681","line":345,"updated":"2015-11-10 20:07:09.000000000","message":"Hum, time_it() can simply return \u0027func\u0027 unchanged if enabled is False, no?","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"2c140434106c5a549ebc656ab5b7f1257f7be5a3","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        @six.wraps(func)"},{"line_number":343,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":344,"context_line":"            if not enabled:"},{"line_number":345,"context_line":"                return func(*args, **kwargs)"},{"line_number":346,"context_line":"            with StopWatch() as w:"},{"line_number":347,"context_line":"                result \u003d func(*args, **kwargs)"},{"line_number":348,"context_line":"            time_taken \u003d w.elapsed()"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_70111c5d","line":345,"in_reply_to":"da85f559_30aee681","updated":"2015-11-13 18:09:16.000000000","message":"Good idear.","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"dfdb7d1243bada788939604b5506558e140d5827","unresolved":false,"context_lines":[{"line_number":348,"context_line":"            time_taken \u003d w.elapsed()"},{"line_number":349,"context_line":"            if min_duration is None or time_taken \u003e\u003d min_duration:"},{"line_number":350,"context_line":"                func_name \u003d reflection.get_callable_name(func)"},{"line_number":351,"context_line":"                if not message:"},{"line_number":352,"context_line":"                    logger.log(log_level,"},{"line_number":353,"context_line":"                               \"It took %(seconds).02f seconds to run\""},{"line_number":354,"context_line":"                               \" function \u0027%(func_name)s\u0027\","}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_3b6c87cf","line":351,"updated":"2015-11-10 20:07:09.000000000","message":"You can write:\n\nif not message:\n   message \u003d \"It took %(seconds).02f seconds to run function \u0027%(func_name)s\u0027\"\nlogger.log(log_level, message, ...)","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"2c140434106c5a549ebc656ab5b7f1257f7be5a3","unresolved":false,"context_lines":[{"line_number":348,"context_line":"            time_taken \u003d w.elapsed()"},{"line_number":349,"context_line":"            if min_duration is None or time_taken \u003e\u003d min_duration:"},{"line_number":350,"context_line":"                func_name \u003d reflection.get_callable_name(func)"},{"line_number":351,"context_line":"                if not message:"},{"line_number":352,"context_line":"                    logger.log(log_level,"},{"line_number":353,"context_line":"                               \"It took %(seconds).02f seconds to run\""},{"line_number":354,"context_line":"                               \" function \u0027%(func_name)s\u0027\","}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_50097830","line":351,"in_reply_to":"da85f559_3b6c87cf","updated":"2015-11-13 18:09:16.000000000","message":"Fair enough.","commit_id":"a0c840641ae8c4adbd3009541701c8bc22b32db9"}]}
